XGBoostの分類でStratifiedKFoldとoptunaを利用して正解率などを確認しています。
##訓練・検証データ、 テストデータ の正解率と調整について
訓練・検証の正解率とテストの正解率の差が小さい方が良いとの認識ですが、差を小さくするのにどの様に調整すのが一般的になりますか?
クロスバリデーションにて検証しています。
StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
を利用して訓練・検証データを学習させています。
###▼訓練・検証データ、 テストデータ 結果
データ割合 5割 best_params: {'n_estimators': 571, 'max_depth': 8, 'min_child_weight': 7, 'learning_rate': 0.002, 'scale_pos_weight': 1, 'subsample': 0.7, 'colsample_bytree': 0.5} 訓練・検証正解率:0.7395 テスト正解率:0.5858 差:0.1536 データ割合 6割 best_params: {'n_estimators': 187, 'max_depth': 9, 'min_child_weight': 6, 'learning_rate': 0.002, 'scale_pos_weight': 1, 'subsample': 0.9, 'colsample_bytree': 0.7} 訓練・検証正解率:0.762 テスト正解率:0.5842 差:0.1778 データ割合 7割 best_params: {'n_estimators': 887, 'max_depth': 9, 'min_child_weight': 8, 'learning_rate': 0.002, 'scale_pos_weight': 1, 'subsample': 0.7, 'colsample_bytree': 0.5} 訓練・検証正解率:0.7588 テスト正解率:0.584 差:0.1748 データ割合 8割 best_params: {'n_estimators': 472, 'max_depth': 7, 'min_child_weight': 3, 'learning_rate': 0.004, 'scale_pos_weight': 1, 'subsample': 0.5, 'colsample_bytree': 0.7} 訓練・検証正解率:0.8105 テスト正解率:0.5997 差:0.2108 データ割合 9割 best_params: {'n_estimators': 303, 'max_depth': 7, 'min_child_weight': 5, 'learning_rate': 0.008, 'scale_pos_weight': 1, 'subsample': 0.8, 'colsample_bytree': 0.5} 訓練・検証正解率:0.8416 テスト正解率:0.6288 差:0.2129
訓練・検証 / テストの正解率の差が一番小さいのはデータ割合5割になり9割にすると正解率の差が大きくなります。
データ割合9割はテスト正解率は一番高いです。
###何度か検証を行ってみた傾向
データ割合を変えて確認を何度か行いましたが多少の幅ありますが正解率の差が小さいのはデータ割合が5割、6割、7割になり8割、9割は差が大きくなります。
テスト正解率だけをみると8割、9割の方が安定的に高いです。
上記の様な場合、 正解率の差が小さい5割、6割、7割のパラメータを採用するのが良いでしょうか?
※データ割合8割、9割は正解率の差が大きいので過学習を起こしているのかなーと考えていますが毎回テスト正解率は高いのでデータ割合8割、9割のパラメータでも良いのでは?と考えてしまいます。
■その他
データは学習する前に全てのデータをシャッフルさせているのでテストデータも毎回違います。
df = df.sample(frac=1).reset_index(drop=True)
▼環境など
Windows 10
python 3.7
機械学習 XGBoost
パラメータの調整にoptunaを利用しています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/22 15:12
2020/10/22 15:17