回帰分析の過学習

%matplotlib inline
import numpy as np, matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
np.random.seed(23)
M, N = 80, 32
# ダミーデータ
X = np.random.randn(M, N)
y = X.sum(1) * 0.4 + np.random.randn(M)

ダミーデータ(X, y)を使って、説明変数を増やしたときの過学習の様子を確認します。

# 説明変数の数を変えて評価
res1, res2 = [], []
nums = [1, 2, 4, 8, 12, 16, 20, 24, 28, 32]  # 説明変数の数
for num in nums:
    lst1, lst2 = [], []
    for i in range(20):  # 20回の平均を取る
        X_train, X_test, y_train, y_test = (
            train_test_split(X, y, test_size=M//2, random_state=i))
        lr = LinearRegression().fit(X_train[:, :num], y_train)
        lst1.append(mean_squared_error(y_train, lr.predict(X_train[:, :num])))
        lst2.append(mean_squared_error(y_test, lr.predict(X_test[:, :num])))
    res1.append(np.mean(lst1))
    res2.append(np.mean(lst2))
  • 結果を入れるres1, res2を用意します
  • 対象とする説明変数の数のリストをnumsに入れます
  • 以下、リストnumsnumで繰り返します
    • 以下、20回繰り返します
      • トレーニングデータとテストデータを半々に分割します
        • test_sizeオプションでテストデータの個数を指定
        • 繰り返しごとにrandom_stateを変えることで異なる結果に
      • 説明変数をnum個用いて、線形回帰(LinearRegression)します
      • lst1にトレーニングデータの平均二乗誤差を入れます。
      • lst2にテストデータの平均二乗誤差を入れます。
    • res1lst1の平均を入れます。
    • res2lst2の平均を入れます。
# グラフで比較
plt.xlabel('Number of explanatory variable')
plt.ylabel('Mean Squared Error')
plt.plot(nums, res1, label='Training')
plt.plot(nums, res2, label='Test')
plt.legend();

トレーニングデータ(青い線)とテストデータ(オレンジの線)の平均二乗誤差をグラフで比較しましょう。
横軸が説明変数の数で、縦軸が平均二乗誤差です。

  • トレーニングデータの平均二乗誤差は、説明変数数が増えると小さくなります。
  • テストデータの平均二乗誤差は、説明変数数が増えると小さくなってから大きくなります。

テストデータの平均二乗誤差が大きくなっているところで、過学習になっています。

過学習の原因

まずは、回帰分析で過学習になる原因をあげてみます。

モデルが複雑(説明変数が多いなど)
トレーニングデータだけで評価
目的変数と相関の小さい説明変数の存在
多重共線性がある説明変数の存在
目的変数と相関の小さい説明変数は、ランダムな説明変数のようなものです。ランダムな説明変数は、トレーニングデータの当てはまりをよくしますが、逆に未知のデータの当てはまりは悪くなります。

多重共線性

ある説明変数Aと別の説明変数Bの相関が高いとき、多重共線性があるといいます。
多重共線性があると過学習しやすくなります。
また、多重共線性の説明変数は、パラメーターの絶対値が大きくなることがあり、これも汎化性能を低くします。

汎化性能の向上方法

汎化性能を向上させるには以下の方法が考えられます。

  • シンプルなモデル(説明変数を減らすなど)
    • 不要な説明変数を選択しない
      • 目的変数と相関の小さい説明変数や多重共線性がある説明変数の削除
    • 次元削減を用いた説明変数の削減
  • トレーニングデータとテストデータの分割
    • クロスバリデーションによる評価
  • 汎化性能の高い評価規準の選択
  • 正則化の導入

コメント

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