○この記事の要点
過学習を再現したのでメモ
過学習:学習データには対応できるが、未知のデータには対応できない。応用力がない感じ。
#○ソースコード(Python):モデルの過学習と過学習の確認
モデルの過学習と過学習の確認方法
from sklearn.datasets import load_boston
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
%matplotlib inline
# データ準備。ボストンの住宅価格
data = load_boston()
X = data.data[:, [5,]] # 説明変数として、部屋数だけを抽出
y = data.target
# 学習用データとテスト用データに分離
train_X, test_X = X[:400], X[400:]
train_y, test_y = y[:400], y[400:]
# ハイパーパラメータを変更したSVR(サポートベクトルマシン(カーネル法))での学習
model_s = SVR(C=1.0, kernel='rbf') # 正則化パラメータが1でrbfカーネルを使用
model_s.fit(train_X, train_y)
# 学習データを利用した予測
s_pred = model_s.predict(train_X)
# テストデータを利用した予測(未知のデータに対する予測)
s_pred_t = model_s.predict(test_X)
# グラフ表示
fig, ax = plt.subplots()
ax.scatter(train_X, train_y, color='red', marker='s', label='data')
ax.plot(train_X, s_pred, color='blue', label='svr_rbf curve(train)')
ax.plot(test_X, s_pred_t, color='orange', label='svr_rbf curve(test)')
ax.legend()
plt.show()
print("○訓練データの平均二乗誤差と決定係数")
print(mean_squared_error(train_y, s_pred))
print(r2_score(train_y, s_pred))
print("○テストデータの平均二乗誤差と決定係数")
print(mean_squared_error(test_y, s_pred_t))
print(r2_score(test_y, s_pred_t))
結果
○訓練データの平均二乗誤差と決定係数
30.330756428515905
0.6380880725968641
○テストデータの平均二乗誤差と決定係数
69.32813164021485
-1.4534559402985217
学習データの線(青)は割といい感じに線引きしているが、テストデータの線(オレンジ)は微妙。
平均二乗誤差と決定係数の値を見ても明らか。
これが過学習。
過学習を防ぐ方法には以下のようにいろいろあるが、それらの説明はまた今度。
・学習(訓練)データの数を増やす
・交差検証を行う
・ハイパーパラメーターを調整する(モデルを簡単なものにする)
・特徴量を削減する
・正則化を実施する