13번의 리셋과 셀 수 없는 자잘한 수정을 거친 애증의 코드입니다.
결과적으로 프라이빗 점수가 충격 그 자체였기때문에 13개의 파일을 다 정리해서 올리지 않고 최고점수를 보여줬던 코드만 공개합니다.
이 코드가 나오기까지의 과정은 창피하니까 깨끗하게 정리된 코드만 올려둡니다.
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings("ignore")
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
from sklearn.model_selection import train_test_split, GridSearchCV, RandomizedSearchCV
from sklearn.ensemble import ExtraTreesRegressor, RandomForestRegressor
import seaborn as sns
import matplotlib.pyplot as plt
import category_encoders as ce
from tqdm import tqdm
from sklearn.model_selection import cross_val_score, KFold
from sklearn.metrics import make_scorer, mean_squared_error
import xgboost as xgb
처음으로 >>경고 무시하기<<를 해봤습니다.
무시하지 않고는 한 걸음도 내딛기 어려웠기 때문이겠죠...
rain = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
submission = pd.read_csv('sample_submission.csv')
train.drop('id', axis = 1, inplace = True)
test.drop('id', axis = 1, inplace = True)
train['Date'] = pd.to_datetime(train['Date'], format='%d/%m/%Y')
test['Date'] = pd.to_datetime(test['Date'], format='%d/%m/%Y')
train['Year'] = train['Date'].dt.year.astype(int)
train['Month'] = train['Date'].dt.month.astype(int)
train['Week'] = train['Date'].dt.isocalendar().week.astype(int)
test['Year'] = test['Date'].dt.year.astype(int)
test['Month'] = test['Date'].dt.month.astype(int)
test['Week'] = test['Date'].dt.isocalendar().week.astype(int)
train.drop('Date', axis=1, inplace=True)
test.drop('Date', axis=1, inplace=True)
날짜변환 처음 해봤습니다.
내가 사는 세상이 이토록 어렵고... 쉬운... 날짜 체계를 가지고 있다니 새삼 신기했습니다.
ce = ce.BinaryEncoder(cols=['Store'])
train = pd.concat([train, ce.fit_transform(train['Store'])], axis=1)
test = pd.concat([test, ce.transform(test['Store'])], axis=1)
train['IsHoliday'] = train['IsHoliday'].apply(lambda x: 1 if x else 0)
test['IsHoliday'] = test['IsHoliday'].apply(lambda x: 1 if x else 0)
features_to_scale = ['Promotion1', 'Promotion2', 'Promotion3', 'Promotion4', 'Promotion5']
train[features_to_scale] = train[features_to_scale].fillna(0)
test[features_to_scale] = test[features_to_scale].fillna(0)
scaler = MinMaxScaler()
train[features_to_scale] = scaler.fit_transform(train[features_to_scale])
test[features_to_scale] = scaler.transform(test[features_to_scale])
X = train.drop('Weekly_Sales', axis=1)
y = train['Weekly_Sales']
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=42, shuffle=True)
def evaluation(y_valid, pred):
mse = mean_squared_error(y_valid, pred)
rmse = np.sqrt(mse)
return rmse
etr = ExtraTreesRegressor()
etr.fit(X_train, y_train)
pred_etr = etr.predict(X_valid)
score_etr = evaluation(y_valid, pred_etr)
print(f"Extra Trees RMSE: {score_etr}")
Extra Trees RMSE: 109840.6285619921
와 멋지다. 이 점수가 제 프라이빗 점수보다 좋았습니다.
xgb_reg = xgb.XGBRegressor()
xgb_reg.fit(X_train, y_train, eval_set=[(X_valid, y_valid)], verbose=5)
pred_xgb = xgb_reg.predict(X_valid)
score_xgb = evaluation(y_valid, pred_xgb)
print(f"XGBoost RMSE: {score_xgb}")
[0] validation_0-rmse:441462.44918
[5] validation_0-rmse:184798.08672
[10] validation_0-rmse:138615.31863
[15] validation_0-rmse:123789.23942
[20] validation_0-rmse:117196.26333
[25] validation_0-rmse:112897.13970
[30] validation_0-rmse:108172.35792
[35] validation_0-rmse:107399.97574
[40] validation_0-rmse:105248.75296
[45] validation_0-rmse:103844.61818
[50] validation_0-rmse:101469.68961
[55] validation_0-rmse:101071.67210
[60] validation_0-rmse:99701.70980
[65] validation_0-rmse:99171.02359
[70] validation_0-rmse:98934.94365
[75] validation_0-rmse:98508.49354
[80] validation_0-rmse:97890.36982
[85] validation_0-rmse:97274.80797
[90] validation_0-rmse:96658.27864
[95] validation_0-rmse:96215.74379
[99] validation_0-rmse:96276.28032
XGBoost RMSE: 96276.27912384199
그리고 제가 천재인 줄 알았습니다.
아주 잠깐이요...
models = []
RF_n_estimators = [80, 90, 100, 110, 120, 130, 140]
RF_criterion = ['squared_error', 'absolute_error', 'friedman_mse', 'poisson']
for estimator_num in RF_n_estimators:
for criterion in RF_criterion:
models.append(RandomForestRegressor(n_estimators=estimator_num, criterion=criterion, random_state=42))
ET_n_estimators = [50, 60, 70, 80, 90, 100, 110, 120, 130, 140]
ET_criterion = ['squared_error', 'absolute_error', 'friedman_mse', 'poisson']
for estimator_num in ET_n_estimators:
for criterion in ET_criterion:
models.append(ExtraTreesRegressor(n_estimators=estimator_num, criterion=criterion, random_state=42))
accuracy = []
for model in tqdm(models, desc='K-Fold'):
result = cross_val_score(model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')
result_mean = np.sqrt(-result.mean())
accuracy.append(result_mean)
print("Cross-Validation RMSEs:", accuracy)
K-Fold: 100%|███████████████████████████████████████████████████████████████████████| 68/68 [2:13:18<00:00, 117.62s/it]
best_model_idx = np.argmin(accuracy)
best_model = models[best_model_idx]
print(f"Best Model: {best_model}")
Best Model: RandomForestRegressor(criterion='poisson', n_estimators=140, random_state=42)
왜 자꾸 붙여넣기가 이렇게 될까요?
RandomForestRegressor이 best_model 이였습니다.
best_model.fit(X_train, y_train)
pred_best_model = best_model.predict(X_valid)
score_best_model = evaluation(y_valid, pred_best_model)
print(f"Best Model RMSE: {score_best_model}")
Best Model RMSE: 113872.44359158521
RandomForestRegressor의 점수... 사실 이때도 만족했습니다.
다만 갈수록 인간의 욕심은 끝이 없다는 걸 깨달아가고있습니다.
best_model.fit(X, y)
pred_final = best_model.predict(test)
submission['Weekly_Sales'] = pred_final
submission.to_csv('submission.csv', index=False)
아무튼 대강 학습하고 예측해서 마무리했습니다.
점수는 Public 83353, Private 121479점이였습니다.
잠깐 내가 코딩 천재면 어쩌지? 하는 생각을 쏙 들어가게 해주는 시간이였습니다.
작성할 땐 피가 말라갔는데 지금 보니 피가 마르네요.
감사합니다.
'말하는 감자' 카테고리의 다른 글
2024 생명연구자원 AI활용 경진대회 후기 2 (코드작성기) (0) | 2024.10.25 |
---|---|
2024 생명연구자원 AI활용 경진대회 후기 1 (feat.맨땅에 도메인지식 습득하기) (2) | 2024.10.25 |
고객 대출등급 분류 AI 해커톤 (3) | 2024.10.15 |
당뇨병 위험 분류 예측 AI해커톤 코드 공유 (1) | 2024.09.09 |
집값 예측 AI 해커톤 코드 (3) | 2024.09.09 |