Open kenoharada opened 7 years ago
モデルを試したスコア 特徴量は以下の通りで一致させた 特徴量について試行錯誤した人がいたら共有してもらいたい X = train_df[train_df["price_pm"]>-1].drop(["datetime",'dayofweek',"DayofMonth","Month","y","year"], axis=1) Y = train_df[train_df["price_pm"]>-1]["y"] Index(['client', 'close', 'price_am', 'price_pm', 'year_num', 'M_1', 'M_2', 'M_3', 'M_4', 'M_5', 'M_6', 'M_7', 'M_8', 'M_9', 'M_10', 'M_11', 'M_12', 'DM_1', 'DM_2', 'DM_3', 'DM_4', 'DM_5', 'DM_6', 'DM_7', 'DM_8', 'DM_9', 'DM_10', 'DM_11', 'DM_12', 'DM_13', 'DM_14', 'DM_15', 'DM_16', 'DM_17', 'DM_18', 'DM_19', 'DM_20', 'DM_21', 'DM_22', 'DM_23', 'DM_24', 'DM_25', 'DM_26', 'DM_27', 'DM_28', 'DM_29', 'DM_30', 'DM_31', 'DW_0', 'DW_1', 'DW_2', 'DW_3', 'DW_4', 'DW_5', 'DW_6'], dtype='object')
重回帰分析 pred_clf 11.376637316800000
xgboostで回帰モデル生成 pred_xgb mod = xgb.XGBRegressor() パラメーターはいじらず初期設定のまま 11.17721
ランダムフォレスト forest_pred from sklearn.ensemble import RandomForestRegressor モデル構築、パラメータはデフォルト forest = RandomForestRegressor() 11.48777
サポートベクターマシーン from sklearn.svm import SVR svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1) svr_lin = SVR(kernel='linear', C=1e3) svr_poly = SVR(kernel='poly', C=1e3, degree=3) y_rbf = svr_rbf.fit(X, Y).predict((test_df.drop(["datetime",'dayofweek',"DayofMonth","Month","year"], axis=1))) y_lin = svr_lin.fit(X, Y).predict((test_df.drop(["datetime",'dayofweek',"DayofMonth","Month","year"], axis=1))) y_poly = svr_poly.fit(X, Y).predict((test_df.drop(["datetime",'dayofweek',"DayofMonth","Month","year"], axis=1))) y_poly 12.50321 y_rbf #10.924218922800000
Kerasによる回帰分析 estimator = KerasRegressor(build_fn=deep_reg_model, nb_epoch=100, batch_size=10, verbose=0) X = train_df[train_df["price_pm"]>-1].drop(["datetime",'dayofweek',"DayofMonth","Month","y","year"], axis=1) Y = train_df[train_df["price_pm"]>-1]["y"] X = np.array(X) Y = np.array(Y) estimator.fit(X,Y) 12.17040
y_rbfとpred_xgbも平均 test_df["y"] = (y_rbf + pred_xgb)/2 10.22758
test_df["y"] = (y_rbf + pred_xgb+forest_pred)/3 test_df["y"][test_df["close"]==1] = int(0) submission = pd.concat([test_df.datetime, test_df.y], axis=1) submission.to_csv("submission.csv", index=False,header=False) 10.29414
@kenoharada
markdownを使うと見やすくなります。
僕が以前書いた記事なので参考にしてみて下さい↓ Qiita Markdown 書き方 まとめ
以下のような感じで。
あと、スコアはどのモデルがどれくらいの精度かまとめてくれると分かりやすいです。 あと、ベンチマーク等そのスコアがどれくらいいいのか分かるようにするといいと思います。 今回は評価関数がチーム内で共通認識はあるかと思いますが、記述しておいたほうがよいです。
特徴量は以下の通りで一致させた 特徴量について試行錯誤した人がいたら共有してもらいたい
X = train_df[train_df["price_pm"]>-1].drop(["datetime",'dayofweek',"DayofMonth","Month","y","year"], axis=1)
Y = train_df[train_df["price_pm"]>-1]["y"]
Index(['client', 'close', 'price_am', 'price_pm', 'year_num', 'M_1', 'M_2',
'M_3', 'M_4', 'M_5', 'M_6', 'M_7', 'M_8', 'M_9', 'M_10', 'M_11', 'M_12',
'DM_1', 'DM_2', 'DM_3', 'DM_4', 'DM_5', 'DM_6', 'DM_7', 'DM_8', 'DM_9',
'DM_10', 'DM_11', 'DM_12', 'DM_13', 'DM_14', 'DM_15', 'DM_16', 'DM_17',
'DM_18', 'DM_19', 'DM_20', 'DM_21', 'DM_22', 'DM_23', 'DM_24', 'DM_25',
'DM_26', 'DM_27', 'DM_28', 'DM_29', 'DM_30', 'DM_31', 'DW_0', 'DW_1',
'DW_2', 'DW_3', 'DW_4', 'DW_5', 'DW_6'],
dtype='object')
11.376637316800000
mod = xgb.XGBRegressor() パラメーターはいじらず初期設定のまま 11.17721
from sklearn.ensemble import RandomForestRegressor モデル構築、パラメータはデフォルト forest = RandomForestRegressor() 11.48777
from sklearn.svm import SVR
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
svr_lin = SVR(kernel='linear', C=1e3)
svr_poly = SVR(kernel='poly', C=1e3, degree=3)
y_rbf = svr_rbf.fit(X, Y).predict((test_df.drop(["datetime",'dayofweek',"DayofMonth","Month","year"], axis=1)))
y_lin = svr_lin.fit(X, Y).predict((test_df.drop(["datetime",'dayofweek',"DayofMonth","Month","year"], axis=1)))
y_poly = svr_poly.fit(X, Y).predict((test_df.drop(["datetime",'dayofweek',"DayofMonth","Month","year"], axis=1)))
y_poly 12.50321 y_rbf #10.924218922800000
estimator = KerasRegressor(build_fn=deep_reg_model, nb_epoch=100, batch_size=10, verbose=0)
X = train_df[train_df["price_pm"]>-1].drop(["datetime",'dayofweek',"DayofMonth","Month","y","year"], axis=1)
Y = train_df[train_df["price_pm"]>-1]["y"]
X = np.array(X)
Y = np.array(Y)
estimator.fit(X,Y)
12.17040
y_rbfとpred_xgbも平均 test_df["y"] = (y_rbf + pred_xgb)/2 10.22758
test_df["y"] = (y_rbf + pred_xgb+forest_pred)/3
test_df["y"][test_df["close"]==1] = int(0)
submission = pd.concat([test_df.datetime, test_df.y], axis=1)
submission.to_csv("submission.csv", index=False,header=False)
10.29414
スコアは確かMAEだよね? (目的関数はMAEに適しているものだよね?多分大丈夫だと思いますが)
モデル名 | スコア |
---|---|
重回帰分析 | 11.38 |
xgboost | 11.18 |
ランダムフォレスト | 11.48 |
SVR y_poly | 12.5 |
Keras | 12.17 |
アンサンブル →どういう組み合わせがどうなったか表でまとめると良さそうですね。
モデル | trainデータでの精度 | MAE |
---|---|---|
重回帰分析 | 0.723709744601 | 11.3766373168 |
xgboost | 0.8141972111396063 | 11.17721 |
ランダムフォレスト | 0.95415671634964894 | 11.48777 |
SVR y_poly | 0.80778731721020391 | 12.50321 |
SVR y_rbf | 0.99993414425977334 | 10.9242189228 |
benchmarkのMAE 11.35637
@kenoharada
price_am
、price_pm
、year_num
はカテゴリ変数にあたるので、重回帰やDeepではone_hotに変換したほうがいいです。([0, 0, 1]的な)モデルの種類的にはこれくらいでよいかと思います。あとはパラメータ調整ですかね。
アンサンブルは回帰モデルのニューラルネットワークと決定木ベースのランダムフォレスト・Xgboostあたり、プラスでSVRを混ぜてsubmit出せば十分な気はします。
データが少ないのであまりDeepにする意味はないですが、重回帰よりはkeras(ニューラルネット)を使うほうが精度は上がると思うので層を工夫すればもっといけると思います。
目的関数を何に設定しているかは気になります。
mae
の設定が出来た覚えがありますが、xgboostはdefaultではmae
はないと思うので自分で設定する必要があるはずです。しかも、mae
は微分出来ない形なので何かしら近似する必要があります。Fair Lossとか使うといいと思います。見た感じ、やっぱり外部データに何を取り込むが勝負だと思いました。
時系列データの扱いをkaggleなどで見てみる
1年分だけのデータを学習させて予測データに少し値を足すというアプローチ 足す値は年毎にyの平均値を出し、回帰係数を計算しそれを足した MAEは9.0743250441
調べたモデルと使った特徴量を共有しよう! スコアも一緒に書いてね