過学習を防ぐ方法【正則化・ドロップアウト・早期終了の使い分け】

過学習を防ぐ方法【正則化・ドロップアウト・早期終了の使い分け】 AI資格・学習

はじめに

機械学習を勉強していると、必ず「過学習(オーバーフィッティング)」という壁にぶつかります。訓練データでは高い精度が出るのに、テストデータや本番データでは精度が落ちてしまう現象です。

僕がE資格の勉強をしていたとき、過学習の対策手法がいくつもあって最初は混乱しました。「正則化とドロップアウトって何が違うの?」という疑問を持つ方も多いと思います。この記事では、代表的な過学習対策の手法を整理して解説します。

過学習とは何か

過学習とは、モデルが訓練データに「覚えすぎて」しまい、未知のデータに対応できなくなった状態のことです。

例えるなら、テスト前に過去問の答えを丸暗記してしまった状態です。同じ問題なら解けますが、少し形式が変わると対応できなくなります。

過学習が起きているかどうかは、訓練データとテストデータの精度の差で判断します。訓練精度が95%なのにテスト精度が70%のような場合は、過学習の可能性が高いです。

① 正則化(Regularization)

正則化は、モデルの重みが大きくなりすぎるのにペナルティを課すことで過学習を抑える手法です。

L1正則化(Lasso)

重みの絶対値の合計をペナルティとして加えます。特徴量の重みをゼロにしやすいため、不要な特徴量を自動的に除去する効果があります(スパース化)。

from sklearn.linear_model import Lasso

model = Lasso(alpha=0.01)  # alphaが正則化の強さ
model.fit(X_train, y_train)

L2正則化(Ridge)

重みの二乗の合計をペナルティとして加えます。すべての重みを小さくする方向に働くため、特徴量を均等に使います。

from sklearn.linear_model import Ridge

model = Ridge(alpha=1.0)
model.fit(X_train, y_train)

「どちらを使うか」の目安は、不要な特徴量を除外したい場合はL1、すべての特徴量を活かしたい場合はL2です。

② ドロップアウト(Dropout)

ドロップアウトはニューラルネットワーク特有の手法です。学習中にランダムにニューロンを無効化(ドロップ)することで、特定のニューロンへの依存を防ぎます。

サッカーで例えると、練習中にランダムで選手を休ませることで、「誰がいなくても対応できるチーム」を作るイメージです。

import tensorflow as tf

model = tf.keras.Sequential([
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.3),  # 30%のニューロンをランダムに無効化
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dropout(0.3),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

ドロップ率は0.2〜0.5が一般的です。高すぎると学習が不安定になります。

③ 早期終了(Early Stopping)

早期終了は、バリデーションデータのロスが改善しなくなった時点で学習を止める手法です。

学習を続けると訓練データへの適合は進みますが、あるタイミングからバリデーションデータへの精度は下がり始めます。その「最良の瞬間」で止めるのが早期終了です。

from tensorflow.keras.callbacks import EarlyStopping

early_stopping = EarlyStopping(
    monitor='val_loss',    # 監視する指標
    patience=10,           # 10エポック改善しなければ停止
    restore_best_weights=True  # 最良の重みを復元
)

model.fit(
    X_train, y_train,
    validation_data=(X_val, y_val),
    epochs=1000,
    callbacks=[early_stopping]
)

④ データ拡張(Data Augmentation)

過学習の根本的な原因は「データが少ない」ことです。データ拡張は、既存データを変形して人工的にデータ量を増やす手法です。

画像データなら「左右反転」「回転」「ノイズ追加」などが代表的です。テーブルデータでも、SMOTEなどのアルゴリズムで少数クラスのデータを合成的に増やせます。

⑤ アンサンブル学習

複数のモデルの予測を組み合わせることで、個々のモデルの過学習の影響を薄める方法です。ランダムフォレストも本質的にはアンサンブルの一種です。

手法の使い分けまとめ

どの手法を使うかは、モデルの種類とデータの状況によって変わります。目安をまとめます。

  • 線形モデル → L1/L2正則化
  • ニューラルネットワーク → ドロップアウト + 早期終了
  • データが少ない → データ拡張
  • どんなモデルにも → クロスバリデーション + アンサンブル

過学習対策は一つを選べばいいというものではなく、複数を組み合わせることも多いです。まずは訓練精度とバリデーション精度の差を見ながら、どの手法が効果的かを試行錯誤してみてください。

📌 プログラミング・AI学習のおすすめスクール

※本記事にはアフィリエイトリンクが含まれます。

コメント

タイトルとURLをコピーしました