관리 메뉴

솜씨좋은장씨

데이콘 X AI 프렌즈 온도추정 경진대회 도전 7, 8회차 본문

DACON/AI프렌즈 시즌1 온도 추정 경진대회

데이콘 X AI 프렌즈 온도추정 경진대회 도전 7, 8회차

솜씨좋은장씨 2020. 3. 21. 09:32
728x90
반응형

데이콘 온도추정 경진대회 도전 7, 8회차입니다.

 

[공공] AI프렌즈 시즌1 온도 추정 경진대회

출처 : DACON - Data Science Competition

dacon.io

첫번째 시도

오늘은 LightGBM모델의 하이퍼 파라미터를 늘려서 시도해보았습니다.

Y18 데이터는 비어있는 구간은 Y06, Y09, Y12, Y16, Y17을 평균 낸 값을 넣어주어 

비어있지않은 구간의 데이터와 함께 사용했습니다.

data_for_graph = train.loc[:, ['Y06', 'Y09', 'Y12', 'Y16', 'Y17']].dropna()
plt.figure(figsize=(20, 10))
plt.plot(data_for_graph)

import numpy as np
new_Y_18 = []
for i in range(len(data_for_graph['Y06'])):
  new_Y_18.append(np.mean([data_for_graph['Y06'].iloc[i], data_for_graph['Y09'].iloc[i], data_for_graph['Y12'].iloc[i], data_for_graph['Y16'].iloc[i], data_for_graph['Y17'].iloc[i]]))
len(new_Y_18)
train.loc[:4319 ,['Y18']] = new_Y_18

X 데이터는 기상청 데이터 전부를 활용했습니다.

X_train_Y18 = train.loc[:, ['X00', 'X01', 'X02', 'X03', 'X04', 'X05', 'X06', 'X07', 'X08', 'X09', 'X10', 'X11', 'X12', 'X13', 'X15', 'X17', 'X18', 'X20', 'X21', 'X22', 'X23', 'X24', 'X25', 'X26', 'X27', 'X28', 'X29', 'X30', 'X31', 'X32', 'X33', 'X34', 'X35', 'X36', 'X37', 'X38', 'X39']]
Y_train_Y18 = train['Y18'].astype('float64')

GridSearchCV를 통해서 최적의 파라미터를 찾아보았습니다.

오늘은 먼저 refit이라는 파라미터와

max_bin, max_leaves를 추가하여 시도해보았습니다.

from sklearn.model_selection import GridSearchCV

def get_best_params(model, params):
    grid_model = GridSearchCV(model, param_grid=params, scoring='neg_mean_squared_error', cv=5)
    grid_model.fit(X_train_Y18, Y_train_Y18)
    rmse = np.sqrt(-1* grid_model.best_score_)
    print('최적 평균 RMSE 값:', np.round(rmse, 4))
    print('최적 파라미터:', grid_model.best_params_)
    
    return grid_model.best_estimator_
lgb_for_best_Y18_model = LGBMRegressor()
lgb_param_grid = { 
    'num_leave' : [1, 2, 3],
    'max_bin' : [10, 20],
    'refit':[True, False],
    'n_estimators' : [100, 200, 300, 400, 500, 600, 700,  800, 900, 1000], 
    'max_depth' : [5, 10, 15, 20, 25],
    'learning_rate' : [0.001, 0.005, 0.007, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1]
    }
best_lgb_param_Y18_model = get_best_params(lgb_for_best_Y18_model, lgb_param_grid)

와.... 변수 값을 너무 많이 넣어준 탓인지 결과를 도출하는데까지 대략 9시간정도의 시간이 걸렸습니다.

 

중간에 기다리다 아르바이트 시간이되어 아르바이트에 가서 일을 하다 밤 10시에 쉬는시간이 되어 

챙겨간 아이패드로 GridSearchCV가 찾아준 최적의 파라미터를 가지고 결과를 도출하고 제출하여보았습니다.

X_test = test.loc[:, ['X00', 'X01', 'X02', 'X03', 'X04', 'X05', 'X06', 'X07', 'X08', 'X09', 'X10', 'X11', 'X12', 'X13', 'X15', 'X17', 'X18', 'X20', 'X21', 'X22', 'X23', 'X24', 'X25', 'X26', 'X27', 'X28', 'X29', 'X30', 'X31', 'X32', 'X33', 'X34', 'X35', 'X36', 'X37', 'X38', 'X39']]
lgb_with_best_params_for_predict_Y18_after80days = LGBMRegressor(learning_rate=0.07, max_depth=5, max_bin=20, n_estimators=800, num_leaves=2, refit=True)
lgb_with_best_params_for_predict_Y18_after80days.fit(X_train_Y18, Y_train_Y18)
predict = lgb_with_best_params_for_predict_Y18_after80days.predict(X_test)
predict_labels = predict


ids = list(test['id'])
print(len(ids))

submission_dic = {"id":ids, "Y18":predict_labels}
submission_df = pd.DataFrame(submission_dic)
submission_df.to_csv("dacon_temp_sub_07_1.csv", index=False)

결과는!!!!!!!!

기...기다린 보람이있었습니다.

지금까지의 결과중에서 가장 좋은 결과를 얻을 수 있었습니다.

 

여기서 num_leaves를 3으로 바꾸면 어떤 결과나 나올지 궁금하여 한번 해보았습니다.

lgb_with_best_params_for_predict_Y18_after80days = LGBMRegressor(learning_rate=0.07, max_depth=5, max_bin=20, n_estimators=800, num_leaves=3, refit=True)
lgb_with_best_params_for_predict_Y18_after80days.fit(X_train_Y18, Y_train_Y18)
predict = lgb_with_best_params_for_predict_Y18_after80days.predict(X_test)
predict_labels = predict


ids = list(test['id'])
print(len(ids))

submission_dic = {"id":ids, "Y18":predict_labels}
submission_df = pd.DataFrame(submission_dic)
submission_df.to_csv("dacon_temp_sub_08_1.csv", index=False)

결과

GridSearchCV로 최적의 파라미터를 찾을때 num_leaves를 쓸때 s를 빼고 써서 제대로 반영이 되지 못한 것 같아 다시 시도해보았습니다.

lgb_param_grid2 = { 
    'num_leaves' : [2, 3, 4, 5, 10, 15, 20, 40, 60],
    'max_bin' : [20],
    'refit':[True],
    'n_estimators' : [800], 
    'max_depth' : [5],
    'learning_rate' : [0.07]
    }
best_lgb_param_Y18_model = get_best_params(lgb_for_best_Y18_model, lgb_param_grid2)

lgb_with_best_params_for_predict_Y18_after80days = LGBMRegressor(learning_rate=0.07, max_depth=5, max_bin=20, n_estimators=800, num_leaves=20, refit=True)
lgb_with_best_params_for_predict_Y18_after80days.fit(X_train_Y18, Y_train_Y18)
predict = lgb_with_best_params_for_predict_Y18_after80days.predict(X_test)
predict_labels = predict


ids = list(test['id'])
print(len(ids))

submission_dic = {"id":ids, "Y18":predict_labels}
submission_df = pd.DataFrame(submission_dic)
submission_df.to_csv("dacon_temp_sub_08_2.csv", index=False)

결과

최적화를 했으니 더 좋을줄 알았는데 그렇지 않았습니다.

아마 제 추측으로는 모든 파라미터를 넣고 결과를 도출한 것이아니라 num_leaves항목만 최적화 시켰기때문에

더 좋은 성능을 내지는 못하지 않았을까 생각이 들었습니다.

 

마지막으로 min_child_samples를 추가하여 결과를 내보았습니다.

 

 

오늘은 여기까지!

 

[공공] AI프렌즈 시즌1 온도 추정 경진대회

출처 : DACON - Data Science Competition

dacon.io

Comments