この記事は
機械学習モデルを作るとき、
「手元のデータにはピッタリなのに、新しいデータには全然使えない…」
そんな経験はありませんか?
これは『過学習』と呼ばれる問題で、
機械学習では常に「最適化」と「汎化」のバランスを取る必要があります。
この記事では、汎化性能が高い機械学習モデルを作るための具体的なポイントをまとめてご紹介します。
前提
訓練データに対する適合度 (Training Accuracy) と未知データに対する汎用性能 (Validation Accuracy) を評価するためには、
下記のようなグラフを作成しながら実験を進めるのが効果的です。
X軸に学習の習熟度、Y軸に精度をプロットします。
下記のようなグラフのモデルを作成するのがこの記事のゴールです。
逆に下記のようなグラフになっているときはモデルは過学習しています。
学習データのみで精度が向上して、テストデータでは精度向上が見られないです。
少し極端すぎる例ですが。。。
具体的な考え方
1. 評価指標とバリデーションを正しく設定する
以前Kaggleでグランドマスターになった方がこのように言っていました。
「Kaggleで最も重要なのはバリデーションだ。適切なバリデーション方法を見つければ勝ったも同然」
バリデーションの主な方法:
- ホールドアウト検証:データを「訓練セット」と「検証セット」に分けて評価。
- 交差検証(クロスバリデーション):データを複数分割し、交互に訓練と検証を繰り返す方法。特に『K-fold交差検証』がよく用いられます。
- ウォークフォワード検証(時系列データ向け):過去のデータだけで将来を予測するよう、時系列順にデータを分割して評価する方法。時系列モデルでは必須の手法です。
適切なバリデーション手法の選び方:
- 時系列データ:必ず『ウォークフォワード検証』を使用し、時間的リーク(未来のデータを誤って使うこと)を防止。
- 分類問題(不均衡データ):K-fold交差検証の代わりに『層化交差検証(Stratified K-fold)』を使ってクラスの偏りを防ぐ。
- グループ単位データ:同一のユーザーや店舗が複数のデータに含まれる場合は『グループ交差検証(Group K-fold)』で、グループごとにデータを分割。
評価指標の選定:
- 分類問題:Accuracyよりも『F1スコア』や『ROC AUC』を使い、不均衡データには特に注意。
- 回帰問題:予測のブレに敏感なら『RMSE』、外れ値の影響を抑えたいなら『MAE』を選ぶ。
2. まずは「過学習できる」強力なモデルを使う
意外に感じるかもしれませんが、まず『過学習ができるくらい強力なモデル』を選ぶことが重要です。なぜなら、弱いモデルではそもそもデータの傾向を正しく捉えることすら難しいからです。
よく使われるモデル:
- XGBoost/LightGBM/CatBoost(実務の現場でよく使われる最強のツリーモデル)
- ニューラルネットワーク(ディープラーニング)
最初はモデルを複雑に設定し、データの傾向を最大限捉えさせましょう。
3. 特徴量エンジニアリングでシンプルかつ効果的に汎化させる
特徴量エンジニアリングはモデルの『燃料』です。良い特徴量はモデルの精度を劇的に改善します。
特に有効な方法:
- カテゴリ変数:Target Encoding(平均値エンコーディング)
- 数値変数:対数変換や標準化(StandardScaler)
- 日時データ:曜日、月末・月初フラグ、休日フラグ
- 集約特徴量:過去の平均値や合計値(例:過去7日間の売上平均)
複雑な特徴量よりも、『シンプルで意味のある特徴量』が汎化性能向上に貢献します。
4. 「早期打ち切り」で過学習を防ぐ
モデルの学習をいつ止めるかも非常に大切です。特にディープラーニングは、学習が進みすぎるとすぐに過学習してしまいます。
- Early Stopping(早期打ち切り)を設定し、バリデーションスコアが改善されなくなった時点で学習を停止しましょう。
5. 正則化でモデルの自由度を制限する
『正則化』とは、モデルが過度に複雑化するのを防ぐ方法です。よく使われる方法は以下の通り。
- L2正則化(Weight Decay):重みの値を小さく保つ
- ドロップアウト(Dropout):ランダムにモデルの一部を無効化して過学習を防ぐ
6. ハイパーパラメータ調整でモデルを最適化する
モデルには多くの『ハイパーパラメータ』が存在し、それらを適切に調整することが汎化性能をさらに引き上げます。
- 学習率(learning rate):最も影響が大きく、小さすぎても大きすぎても性能が落ちます。
- バッチサイズ:大きすぎると汎化性能が下がり、小さすぎると収束が遅くなります。
- モデルの深さやサイズ:過学習を防ぐため、適切な深さやツリー数を選びます。
調整は『ランダムサーチ』や『ベイズ最適化』などで効率的に行いましょう。
まとめ
これらのポイントを意識し、繰り返しチューニングすることで、新しい未知のデータに対しても安定した性能を発揮するモデルを作ることができます。
ぜひ、このフローを参考に汎化性能が高いモデルを作成してみてください。