質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
XGBoost

XGBoostは、アンサンブル学習と決定木を組み合わせた手法です。弱学習器の構築時に、以前構築された弱学習器の結果を用いて弱学習器を構築。高度な汎化能力を持ち、勾配ブースティングとも呼ばれています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4303閲覧

機械学習 訓練・検証データ、 テストデータ の正解率と調整について

aws

総合スコア48

XGBoost

XGBoostは、アンサンブル学習と決定木を組み合わせた手法です。弱学習器の構築時に、以前構築された弱学習器の結果を用いて弱学習器を構築。高度な汎化能力を持ち、勾配ブースティングとも呼ばれています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/22 07:45

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を利用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

汎化性能が低いけど過学習していないモデルか、汎化性能が高いけど過学習しているモデルか、どちらを選択すべきか」という命題ですね。これは、明らかに後者です。モデルは現実に使えることが何よりも重要です。前者が良さそうに思えるのは、「過学習していると、未知のデータへの精度が下がるのではないか」という悪い思い込みがあるからです。「訓練・検証よりはテスト精度は下がるけど、それでも他のモデルよりテスト精度が高い」のですから、問題はありません。

よって、ご質問である**「上記の様な場合、 正解率の差が小さい5割、6割、7割のパラメータを採用するのが良いでしょうか?」にはNoと回答**します。

本質的には、過学習を対策することが必要です。データを増やすことができれば望ましいですが、それが難しい場合は、モデルの複雑度を調整します。今回の質問者様のパターンではOptunaが逆効果になり、訓練・検証データに最適化しすぎたハイパーパラメータにチューニングされ、複雑度が高くなってしまった可能性があると考えます。よって、Optunaのチューニング範囲を変えて、過度に複雑にならないような調整をするとよいでしょう。

投稿2020/10/22 13:05

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aws

2020/10/22 15:12

ご回答ありがとうございます。 なるほど、Optunaで訓練・検証データで最適化しすぎている可能性があると。 データを増やすのが難しいのでOptunaのチューニング範囲を変えて正解率の差を小さくしつつデータ割合8割、9割の時のテスト正解率を出せる範囲がないか探してみたいと思います。
toast-uz

2020/10/22 15:17

原理的にはいまのデータで、9割の訓練・検証正解率とテスト正解率との中間のどこかに、両者の値を揃えられると思います。個人的にも興味ありますので、よい結果が出たら、ここで教えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問