2024.08.12 TIL

Donghyun·2024년 8월 12일
0

TIL (Today I Learned)

목록 보기
32/53
post-thumbnail

Python

동적 계획법:

https://velog.io/@ehdtkd98/프로그래머스-멀리-뛰기-파이썬-1oqscus8

동적 계획법의 대표적인 알고리즘인 피보나치 수열과 같은 위 유형의 문제는 n 이 커짐에 따라 어떤 규칙성을 갖게 되는지 파악하는 것이 중요.

  • 동적 계획법: 기본적인 아이디어로 하나의 큰 문제를 여러 개의 작은 문제로 나누어서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 것.

시간 복잡도 주의:

https://velog.io/@ehdtkd98/프로그래머스-귤-고르기-파이썬

  1. 파이썬 내장 함수의 시간 복잡도에 주의:

    • 처음에 tangerine.count(i)를 사용하여 각 귤의 크기를 일일이 세는 방식은 리스트 전체를 반복 탐색하기 때문에 O(n)O(n)의 시간 복잡도를 가지며, 이를 귤 크기의 종류 수만큼 반복하면 전체 시간 복잡도가 O(n2)O(n^2)로 증가. 이로 인해 입력이 커질수록 성능이 크게 저하되어 일부 테스트 케이스에서 시간 초과가 발생했다.
  2. 효율적인 데이터 처리 방법:

  • 동일한 문제를 해결할 때, 각 크기의 귤 개수를 세는 작업을 한 번의 순회로 해결할 수 있었다. 리스트를 한 번만 순회하며 각 요소의 빈도를 딕셔너리에 기록하면 O(n)O(n)의 시간 복잡도로 빈도 계산을 마칠 수 있다.
  1. 최적화를 고려한 코드 작성:
  • 알고리즘을 구현할 때, 단순히 동작하는 코드를 작성하는 것뿐만 아니라, 시간 복잡도와 공간 복잡도를 고려하여 최적화하는 것이 중요하다고 느꼈다. 특히, 테스트 데이터 규모가 커짐에 따라 이러한 최적화가 성능에 큰 영향을 미치는 거 같다.

머신러닝

오늘 선형회귀 심화까지 끝내고 간단한 선형회귀 숙제가 있었다.

💡 tips 데이터를 이용하여 다양한 변수를 넣고 빼면서, 가장 높은 r2 score를 만들어봅시다.

다양한 변수조합을 반복해서 만들기 위해 함수로 만들고, 1개부터 n 개까지의 조합으로 선형회귀 모델을 만들어 보기로 했다.

필요한 모듈

import sklearn
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import LabelEncoder
import seaborn as sns

데이터의 형태

tips_df = sns.load_dataset('tips')
tips_df
total_billtipsexsmokerdaytimesize
016.991.01FemaleNoSunDinner
110.341.66MaleNoSunDinner
221.013.50MaleNoSunDinner
323.683.31MaleNoSunDinner
424.593.61FemaleNoSunDinner
.....................
23929.035.92MaleNoSatDinner
24027.182.00FemaleYesSatDinner
24122.672.00MaleYesSatDinner
24217.821.75MaleNoSatDinner
24318.783.00FemaleNoThurDinner

범주형 변수 인코딩

컬럼들 중 sex, smoker, day, time 이 범주형 변수로 인코딩이 필요한 상태이다. 따라서 sklearn 의 LabelEncoder 로 인코딩

# Label Encoder 객체 생성
label_encoder = LabelEncoder()

# 각 범주형 열을 Label Encoding
tips_df['sex_en'] = label_encoder.fit_transform(tips_df['sex'])
tips_df['smoker_en'] = label_encoder.fit_transform(tips_df['smoker'])
tips_df['day_en'] = label_encoder.fit_transform(tips_df['day'])
tips_df['time_en'] = label_encoder.fit_transform(tips_df['time'])

# 원본 데이터프레임에서 기존 범주형 열 삭제 (옵션)
tips_df_encoded = tips_df.drop(columns=['sex', 'smoker', 'day', 'time'])

tips_df_encoded
total_billtipsizesex_ensmoker_enday_entime_en
016.991.012002
110.341.663102
221.013.503102
323.683.312102
424.593.614002
.....................
23929.035.923101
24027.182.002011
24122.672.002111
24217.821.752101
24318.783.002003

Featue Target 나누기

X = tips_df_encoded.drop(columns='tip')
y = tips_df_encoded[['tip']]

성능 평가 함수 만들기

# 특성과 목표 변수 설정
X = tips_df_encoded.drop(columns='tip')
y = tips_df_encoded[['tip']]

# 성능 평가 함수
def evaluate_combinations(X, y):
    results = []
    features = X.columns.tolist()
    num_features = len(features)
    
    # 1개부터 num_features개까지의 조합을 반복문으로 생성
    for r in range(1, num_features + 1):
        for i in range(num_features):
            if i + r <= num_features:
                selected_features = features[i:i+r]
                X_subset = X[selected_features]
                
                # 모델 학습
                model = LinearRegression()
                model.fit(X_subset, y)
                
                # 예측
                y_pred = model.predict(X_subset)
                
                # 성능 평가
                mse = mean_squared_error(y, y_pred)
                r2 = r2_score(y, y_pred)
                
                # 결과 저장
                results.append({
                    'features': selected_features,
                    'mean_squared_error': mse,
                    'r2_score': r2
                })
    
    return results

# 모든 조합 평가 및 결과 출력
results = evaluate_combinations(X, y)

# 결과 출력
for result in results:
    print(f"Features: {result['features']}")
    print(f"Mean Squared Error: {result['mean_squared_error']:.4f}")
    print(f"R^2 Score: {result['r2_score']:.4f}")
    print()
  • 결과: Features: ['total_bill']
    Mean Squared Error: 1.0360
    R^2 Score: 0.4566 Features: ['size']
    Mean Squared Error: 1.4501
    R^2 Score: 0.2394 Features: ['sex_en']
    Mean Squared Error: 1.8916
    R^2 Score: 0.0079 Features: ['smoker_en']
    Mean Squared Error: 1.9065
    R^2 Score: 0.0000 Features: ['day_en']
    Mean Squared Error: 1.9064
    R^2 Score: 0.0001 Features: ['time_en']
    Mean Squared Error: 1.8784
    R^2 Score: 0.0148 Features: ['total_bill', 'size'] ... Features: ['total_bill', 'size', 'sex_en', 'smoker_en', 'day_en', 'time_en']
    Mean Squared Error: 1.0128
    R^2 Score: 0.4688

가장 성능이 좋은 조합 찾기

# 가장 좋은 r2 score 찾기
best_r2 = 0

for result in results:
    if result['r2_score'] > best_r2:
        best_r2 = result['r2_score']
        best_result = result

# 결과 출력
print(f"Best R^2 Score: {best_r2:.4f}")
print(f"Best Features: {best_result['features']}")
  • 결과: Best R^2 Score: 0.4688
    Best Features: ['total_bill', 'size', 'sex_en', 'smoker_en', 'day_en', 'time_en']

모든 feature 를 활용해 모델을 만들었을 때 r2_score: 0.4688 로 가장 성능이 좋았다.

profile
데이터분석 공부 일기~!

0개의 댓글