%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
に入れます - 以下、リスト
nums
をnum
で繰り返します- 以下、20回繰り返します
- トレーニングデータとテストデータを半々に分割します
test_size
オプションでテストデータの個数を指定- 繰り返しごとに
random_state
を変えることで異なる結果に
- 説明変数を
num
個用いて、線形回帰(LinearRegression
)します lst1
にトレーニングデータの平均二乗誤差を入れます。lst2
にテストデータの平均二乗誤差を入れます。
- トレーニングデータとテストデータを半々に分割します
res1
にlst1
の平均を入れます。res2
にlst2
の平均を入れます。
- 以下、20回繰り返します
# グラフで比較
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の相関が高いとき、多重共線性があるといいます。
多重共線性があると過学習しやすくなります。
また、多重共線性の説明変数は、パラメーターの絶対値が大きくなることがあり、これも汎化性能を低くします。
汎化性能の向上方法
汎化性能を向上させるには以下の方法が考えられます。
- シンプルなモデル(説明変数を減らすなど)
- 不要な説明変数を選択しない
- 目的変数と相関の小さい説明変数や多重共線性がある説明変数の削除
- 次元削減を用いた説明変数の削減
- 不要な説明変数を選択しない
- トレーニングデータとテストデータの分割
- クロスバリデーションによる評価
- 汎化性能の高い評価規準の選択
- 正則化の導入
コメント