過学習とアンダーフィッティング | 機械学習の基本概念 | Pythonによる機械学習を学ぶ

スポンサーリンク
スポンサーリンク

過学習とアンダーフィッティング

この記事では、機械学習における「過学習(オーバーフィッティング)」と「アンダーフィッティング」の概念について解説します。これらは、モデルの性能を評価し、適切な調整を行うために非常に重要な要素です。過学習やアンダーフィッティングが発生する理由と、それを防ぐための方法についても紹介します。対象者はPythonの基本的なプログラミング知識を前提として、初心者にも分かりやすい説明を心がけています。

過学習(オーバーフィッティング)とは?

過学習は、モデルが訓練データに対して過度に適合してしまう状態です。訓練データの細かいノイズや変動まで学習してしまうため、テストデータや新しいデータに対する予測精度が低下します。過学習のモデルは、訓練データでは高い精度を示しますが、汎用性が低いため、実際の運用環境ではうまく機能しないことが多いです。

  • 訓練データの精度は高いが、テストデータの精度は低い。
  • 訓練データのパターンに過度に適合し、新しいデータに対して過剰に適応できない。

アンダーフィッティングとは?

アンダーフィッティングは、モデルが訓練データに対して十分に適合していない状態です。つまり、モデルがデータのパターンを学習しきれておらず、訓練データに対する予測精度も低くなります。アンダーフィッティングの原因としては、モデルがシンプルすぎる、特徴量が不足している、または訓練が不十分であることが考えられます。

  • 訓練データの精度が低く、テストデータの精度も低い。
  • モデルがデータの重要なパターンを捉えられていない。

過学習とアンダーフィッティングの違い

過学習とアンダーフィッティングは、どちらもモデルが最適に学習できていない状態を示しますが、それぞれの問題点は異なります。

項目 過学習(オーバーフィッティング) アンダーフィッティング
訓練データの精度 高い 低い
テストデータの精度 低い 低い
モデルの複雑さ 複雑すぎる 単純すぎる

Pythonで過学習とアンダーフィッティングの例

以下では、線形回帰モデルと決定木モデルを使用して、過学習とアンダーフィッティングの具体的な例をPythonで確認します。


import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

# データの作成
np.random.seed(42)
X = np.random.rand(100, 1) * 10  # 特徴量(X)
y = 2 * X + 1 + np.random.randn(100, 1) * 2  # ノイズを加えた線形データ(y)

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 線形回帰モデル(アンダーフィッティングの例)
linear_model = LinearRegression()
linear_model.fit(X_train, y_train)

# 決定木モデル(過学習の例)
tree_model = DecisionTreeRegressor(max_depth=10)
tree_model.fit(X_train, y_train)

# 訓練データとテストデータでの予測
y_pred_linear_train = linear_model.predict(X_train)
y_pred_linear_test = linear_model.predict(X_test)
y_pred_tree_train = tree_model.predict(X_train)
y_pred_tree_test = tree_model.predict(X_test)

# モデルの評価(平均二乗誤差 MSE)
mse_linear_train = mean_squared_error(y_train, y_pred_linear_train)
mse_linear_test = mean_squared_error(y_test, y_pred_linear_test)
mse_tree_train = mean_squared_error(y_train, y_pred_tree_train)
mse_tree_test = mean_squared_error(y_test, y_pred_tree_test)

# 結果の表示
print(f'Linear Regression - Train MSE: {mse_linear_train}, Test MSE: {mse_linear_test}')
print(f'Decision Tree - Train MSE: {mse_tree_train}, Test MSE: {mse_tree_test}')

このコードでは、LinearRegressionを使った線形回帰モデル(アンダーフィッティングの例)と、DecisionTreeRegressorを使った決定木モデル(過学習の例)を比較しています。線形回帰はシンプルすぎるため、アンダーフィッティングが発生し、決定木は複雑すぎるため、過学習が発生することがわかります。

結果の解釈

  • 線形回帰モデル: 訓練データとテストデータの誤差が大きく、モデルがデータのパターンを捉えきれていない。
  • 決定木モデル: 訓練データではほぼ完全にフィットしているが、テストデータでの誤差が大きく、過学習している。

過学習とアンダーフィッティングの対策

過学習とアンダーフィッティングを防ぐための対策はいくつかあります。

1. 過学習を防ぐための対策

  • クロスバリデーション: 訓練データを複数のセットに分けて交互に訓練し、モデルの汎用性を高める。
  • 正則化: モデルが過度に訓練データに適合しないように、L1正則化(Lasso)やL2正則化(Ridge)を使用する。
  • アンサンブル学習: 複数のモデルを組み合わせることで、個々のモデルが過学習するリスクを低減する。

2. アンダーフィッティングを防ぐための対策

  • より複雑なモデルを使用: 単純すぎるモデルを避け、より多くのパラメータや層を持つモデルを使用する。
  • 特徴量エンジニアリング: データからより多くの意味ある特徴量を抽出し、モデルの性能を向上させる。
  • 十分な訓練: 訓練回数を増やすことで、モデルがデータのパターンをより良く学習できるようにする。

まとめ

過学習とアンダーフィッティングは、機械学習モデルの性能を劣化させる大きな要因です。過学習は訓練データに過度に適合して新しいデータに対して弱くなる状態であり、アンダーフィッティングはデータを十分に学習できていない状態です。これらの問題を防ぐためには、モデルの選択、ハイパーパラメータの調整、データの前処理といった方法を適切に実施することが重要です。