1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

猿でもわかるAIプログラミングシリーズ 🐵💻 AIってなぜ「過学習」するの?マンガで理解

Posted at

「AIってなぜ『過学習』するの?」を実装とともに理解しよう!


1. はじめに:なぜ「過学習」は現場で問題になるのか?

機械学習のプロジェクトを進めていると、学習時の精度は高いのに本番環境での精度がガクッと落ちる……そんな現象に直面したことはありませんか?

これこそが、**「過学習(Overfitting)」**の典型的な症状です。

過学習とは、「モデルが訓練データに適合しすぎて、未知のデータ(テストデータ)に対して汎化性能を失ってしまう状態」のこと。

このブログでは、初心者から実務者まで理解しやすい形で「過学習とは何か?」「なぜ起きるのか?」「どうやって防ぐのか?」を、実装コードとともに解説していきます。


2. 技術的背景:「過学習」のメカニズムとは?

まずは基本用語から押さえておきましょう。

用語 意味
過学習 (Overfitting) モデルが訓練データに過剰に適合し、汎化性能が低下した状態
汎化性能 (Generalization) 未知のデータに対して正確に予測できる能力
バイアス (Bias) モデルが単純すぎてデータの傾向を捉えられない状態
バリアンス (Variance) モデルが複雑すぎてノイズまで学習してしまう状態

🔍 バイアス-バリアンストレードオフ:モデルは単純すぎても複雑すぎてもダメ。ちょうど良いバランスが重要。


3. 実践:scikit-learnで「過学習」を観察してみよう

以下は、sklearnを使って「過学習の状態」を再現・観察するコードです。

✅ Step1: 必要なライブラリのインポート

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

✅ Step2: 疑似データの生成(わざとノイズを入れる)

np.random.seed(42)
X = np.linspace(0, 1, 20)
y = np.sin(2 * np.pi * X) + np.random.normal(scale=0.3, size=X.shape)

X = X.reshape(-1, 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

✅ Step3: 過学習の様子を観察(次数を変えてみる)

degrees = [1, 4, 15]
plt.figure(figsize=(18, 4))

for i, degree in enumerate(degrees):
    poly = PolynomialFeatures(degree)
    X_poly_train = poly.fit_transform(X_train)
    X_poly_test = poly.transform(X_test)

    model = LinearRegression()
    model.fit(X_poly_train, y_train)

    y_pred_train = model.predict(X_poly_train)
    y_pred_test = model.predict(X_poly_test)

    mse_train = mean_squared_error(y_train, y_pred_train)
    mse_test = mean_squared_error(y_test, y_pred_test)

    X_plot = np.linspace(0, 1, 100).reshape(-1, 1)
    X_plot_poly = poly.transform(X_plot)
    y_plot = model.predict(X_plot_poly)

    plt.subplot(1, 3, i + 1)
    plt.scatter(X_train, y_train, label="Train")
    plt.scatter(X_test, y_test, label="Test")
    plt.plot(X_plot, y_plot, color='red', label=f"Degree={degree}")
    plt.title(f"MSE_train={mse_train:.2f} / MSE_test={mse_test:.2f}")
    plt.legend()

plt.show()

🔍 出力結果の考察:

  • degree=1:単純すぎてトレンドを捉えられない(アンダーフィッティング)。
  • degree=4:ちょうど良い複雑さで汎化性能が高い。
  • degree=15:訓練データに完璧にフィットするが、テストデータに対して精度が大幅に落ちる(過学習)。

4. 実務Tips:過学習を防ぐための5つのテクニック

テクニック 内容
① クロスバリデーション データを分割しながら複数回評価することで過学習を検出
② 正則化(L1/L2) モデルの重みの大きさにペナルティを課し、過度な複雑化を抑える
③ Early Stopping 学習中に検証誤差が悪化した時点で訓練を停止
④ Dropout ニューラルネットワークの一部ノードをランダムに無効化
⑤ データ拡張・ノイズ追加 入力データにランダム性を加えて汎化能力を高める

📌特にプロジェクトでは「早期終了」+「正則化」の組み合わせが実用的です。


5. 応用編:深層学習での「過学習」対策例(Keras)

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping

model = Sequential([
    Dense(64, activation='relu', input_shape=(X_train.shape[1],)),
    Dropout(0.5),
    Dense(1)
])

model.compile(optimizer='adam', loss='mse')

early_stop = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)

history = model.fit(X_train, y_train,
                    validation_data=(X_test, y_test),
                    epochs=100,
                    callbacks=[early_stop])

6. まとめ:過学習と上手に付き合おう

観点 ポイント
✅ 過学習の本質 訓練データへの過度な最適化が汎化性能を損なう
✅ 防止策 正則化・早期終了・クロスバリデーション等の併用が効果的
✅ 現場での工夫 モデルの選定・データの質・評価指標の工夫が重要

🚀今後の展望

  • データ量が増えたときの過学習への影響
  • Transformerモデルのような大規模モデルにおける過学習
  • Self-supervised Learningでの汎化性能強化手法

👋 最後に

今回の記事を読んで「これ、ちょっと試してみたい!」と思った方は、ぜひ自分のプロジェクトにも取り入れてみてください。理屈だけでなく、**「動かして・観察して・改善する」**ことが、AI技術を実務に活かすための第一歩です。


📌 本記事が役に立ったら、スキ・フォローよろしくお願いします!
タグ:#AI #機械学習 #過学習 #Python #scikit-learn #Keras #Tips #猿でもわかるシリーズ

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?