동적 계획법:
https://velog.io/@ehdtkd98/프로그래머스-멀리-뛰기-파이썬-1oqscus8
동적 계획법
의 대표적인 알고리즘인 피보나치 수열과 같은 위 유형의 문제는 n 이 커짐에 따라 어떤 규칙성을 갖게 되는지 파악하는 것이 중요.
동적 계획법
: 기본적인 아이디어로 하나의 큰 문제를 여러 개의 작은 문제로 나누어서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 것.시간 복잡도 주의:
https://velog.io/@ehdtkd98/프로그래머스-귤-고르기-파이썬
파이썬 내장 함수의 시간 복잡도에 주의:
tangerine.count(i)
를 사용하여 각 귤의 크기를 일일이 세는 방식은 리스트 전체를 반복 탐색하기 때문에 의 시간 복잡도를 가지며, 이를 귤 크기의 종류 수만큼 반복하면 전체 시간 복잡도가 로 증가. 이로 인해 입력이 커질수록 성능이 크게 저하되어 일부 테스트 케이스에서 시간 초과가 발생했다.효율적인 데이터 처리 방법:
오늘 선형회귀 심화까지 끝내고 간단한 선형회귀 숙제가 있었다.
💡 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_bill | tip | sex | smoker | day | time | size |
---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner |
... | ... | ... | ... | ... | ... | ... |
239 | 29.03 | 5.92 | Male | No | Sat | Dinner |
240 | 27.18 | 2.00 | Female | Yes | Sat | Dinner |
241 | 22.67 | 2.00 | Male | Yes | Sat | Dinner |
242 | 17.82 | 1.75 | Male | No | Sat | Dinner |
243 | 18.78 | 3.00 | Female | No | Thur | Dinner |
컬럼들 중 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_bill | tip | size | sex_en | smoker_en | day_en | time_en |
---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | 2 | 0 | 0 | 2 |
1 | 10.34 | 1.66 | 3 | 1 | 0 | 2 |
2 | 21.01 | 3.50 | 3 | 1 | 0 | 2 |
3 | 23.68 | 3.31 | 2 | 1 | 0 | 2 |
4 | 24.59 | 3.61 | 4 | 0 | 0 | 2 |
... | ... | ... | ... | ... | ... | ... |
239 | 29.03 | 5.92 | 3 | 1 | 0 | 1 |
240 | 27.18 | 2.00 | 2 | 0 | 1 | 1 |
241 | 22.67 | 2.00 | 2 | 1 | 1 | 1 |
242 | 17.82 | 1.75 | 2 | 1 | 0 | 1 |
243 | 18.78 | 3.00 | 2 | 0 | 0 | 3 |
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()
# 가장 좋은 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']}")
모든 feature 를 활용해 모델을 만들었을 때 r2_score: 0.4688 로 가장 성능이 좋았다.