지난 포스팅에 이어서 오늘은 모델링을 만들어 봤습니다.
#그리드 서치
models = [
('ridge', lm.Ridge()),
('lasso', lm.Lasso()),
('elastic', lm.ElasticNet()),
('LassoLars', lm.LassoLars()),
('LogisticRegression', lm.LogisticRegression()),
('SGDRegressor', lm.SGDRegressor()),
('Perceptron', lm.Perceptron(n_jobs=-1)),
('xgboost', xgb.XGBRegressor()),
('lgb', lgb.LGBMRegressor()),
('knn', KNeighborsRegressor(n_jobs = -1) ),
('rf', RandomForestRegressor(n_jobs = -1)),
('dt', DecisionTreeRegressor()),
('ada', AdaBoostRegressor())
]
params = {
'ridge': {
'alpha': [0.01, 0.1, 1.0, 10, 100],
'fit_intercept': [True, False],
'normalize': [True, False],
},
'lasso': {
'alpha': [0.1, 1.0, 10],
'fit_intercept': [True, False],
'normalize': [True, False],
},
'elastic': {
'alpha': [0.1, 1.0, 10],
'normalize': [True, False],
'fit_intercept': [True, False],
},
'LassoLars': {
'alpha': [0.1, 1.0, 10],
'normalize': [True, False],
'fit_intercept': [True, False],
},
'LogisticRegression': {
'penalty': ['l1', 'l2'],
'C': [0.01,0.1, 1.0, 10,100],
'fit_intercept': [True, False],
},
'SGDRegressor': {
'penalty': ['l1', 'l2'],
'alpha': [0.001, 0.01, 0.1, 1.0, 10, 100],
'fit_intercept': [True, False],
},
'Perceptron' :{
'penalty': ['None', 'l1', 'l2'],
'alpha': [0.001, 0.01, 0.1, 1.0, 10, 100],
'fit_intercept': [True, False]
},
'xgboost': {
"gamma": uniform(0, 0.5).rvs(3),
"max_depth": range(2, 7),
"n_estimators": [100,200,300]
},
'lgb': {
"gamma": uniform(0, 0.5).rvs(3),
"max_depth": range(2, 7),
"n_estimators": [100,200,300]
},
'knn': {
"n_neighbors": range(2,7),
},
'rf': {
"max_depth": range(2, 5),
"min_samples_split": range(2, 5),
"min_samples_leaf": range(2, 5),
"n_estimators": [100,200,300],
},
'dt': {
"max_depth": range(2, 5),
"min_samples_split": range(2, 5),
"min_samples_leaf": range(2, 5),
},
'ada': {
"n_estimators": [40,50,60]
}
}
best_model, best_mae = None, float('inf')
x_columns = ['hour','hour_bef_temperature','hour_bef_precipitation']
for model_name, model in models:
param_grid = params[model_name]
grid = GridSearchCV(model, cv=5, n_jobs=-1, param_grid=param_grid)
grid = grid.fit(X_train[x_columns], y_train)
model = grid.best_estimator_
predictions = model.predict(X_test[x_columns])
mae = mean_absolute_error(y_test, predictions)
print(model_name, mae)
if mae < best_mae:
best_mae=mae
best_model = model
ridge 40.31602129541864
lasso 40.30855653538877
elastic 41.252566307860604
LassoLars 40.30853364226131
LogisticRegression 51.55936073059361
SGDRegressor 40.257925028487605
Perceptron 93.32876712328768
[10:07:54] WARNING: /workspace/src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.
xgboost 27.404816101675163
lgb 27.910991375973378
knn 27.974885844748858
rf 30.92272982406107
dt 32.59905879619483
ada 34.54503408876004
가장 좋은 성능을 보인 xgboost로 test 데이터 predict 제출한 결과,
37.03 점수를 받았습니다. 참고로 리더보드 1등 점수는 29.31입니다.
53점을 받은 pred는 모든 변수를 넣은 결과 입니다. VIF와 xgb의 feature 중요도를 본 경과 변수 세 개만 이용해도 될것 같아서 변수의 수 만 조절했는데 53->37로 성능이 좋아졌습니다.
위에 해당하는 모델 말고도 CV를 기반한 스태킹 코드를 미리 짜놨는데, 스태킹을 해도 성능이 획기적으로 줄어 들것같진 않더라구요. 그래서 스케일링도 해보고, 이것저것 시도 중입니다.
변수가 한정적이라서 어떻게 뭘 더 해야할지 고민 중입니다. 타켓값의 분포를 보면 계절성은 있어 보였습니다.
그래서 계절성 성분을 뽑아서 변수로 넣을 고민 중에 있습니다. 받은 데이터 시간순으로 되어 있지 않아서 이를 어떻게 적용할지 감이 확 오진 않더라구요.
target 분포가 정규분포가 아니면 log을 사용해볼려고 했는데, 그래프상 약간 왼쪽으로 치우친 것 같지만 통계량 결과 정규분포라고 나왔어요, log를 씌운 것과 비교 했을때 그닥 차이가 없어 보여서 제외 시켰습니다 .ㅠ
앞서 언급한 스케일링도, 하기 전/후의 성능이 고만고만했습니다. 종류별로 다 돌려 봤는데 거의 비슷했습니다.
구글링하면서 다른 분들은 어떻게 했는지 찾아 보고 있는데, 저와는 데이터 자체가 달라서 인사이트를 얻기가 쉽진 않았어요
많이 알수록 많은 걸 볼수 있는데 이럴때면 참 갈길이 멀구나 생각이 드네요 ㅎㅎ;
'Data Diary' 카테고리의 다른 글
2021-09-13(따릉이 프로젝트 완성하기 5) (0) | 2021.09.13 |
---|---|
2021-09-10(딥러닝 수학14_dataset 변화에 따른 th1,th0 학습 시각화) (0) | 2021.09.10 |
2021-09-08(딥러닝 수학 13_ for Several Samples Theory & Implementation) (0) | 2021.09.08 |
2021-09-07(따릉이 프로젝트 완성하기 3) (0) | 2021.09.07 |
2021-09-02,04(따릉이 프로젝트 완성하기 1,2) (0) | 2021.09.04 |