まだタイトルない

アウトプット用です

【機械学習図鑑】正則化

こんにちは
機械学習図鑑の話

見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑

見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑


実際に手を動かしながら勉強。サンプルプログラムにはないけど図にある曲線をplotしようと戦ったお話。
実はずっと思い通りできなくて泣きそうな状態を共有するつもりだったけど、最後のもうひと頑張りでか帰結できたのでそれを共有。

正則化

簡単に・・・
与えられた訓練データをうまいこと直線で表現できないときは、次数を上げて曲線で表現します。
しかし、うまく訓練データを表しすぎると検証データに適用できなくなります。(過学習)
そういった過学習を避けるためにするのが正則化

本に書いてあるコードを参考に、モデルのプロットをしてみる。
ちなみにめざすべきはこれ
f:id:teyoblog:20200226195805j:plain

import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

train_size = 20

# 訓練データ
train_X = np.sort(np.random.uniform(low = 0, high = 1.2, size = train_size))    # (20,) 1行20列
train_y = np.sin(train_X * 2 * np.pi) + np.random.normal(0, 0.2, train_size)    # (20,)

# 多項式
poly = PolynomialFeatures(degree = 6)    # 多項式の次数 = 6
train_poly_X = poly.fit_transform(train_X.reshape(train_size, 1)) # (20, 7) 20列7行

# モデルを作成
model0  = Ridge(alpha = 0)
model1  = Ridge(alpha = 1)
model10 = Ridge(alpha = 10)

# 学習
model0.fit(train_poly_X, train_y)
model1.fit(train_poly_X, train_y)
model10.fit(train_poly_X, train_y)

train_pred_y0  = model0.predict(train_poly_X)
train_pred_y1  = model1.predict(train_poly_X)
train_pred_y10 = model10.predict(train_poly_X)

# プロット
plt.scatter(train_X, train_y, color = 'black', label = 'train data')
plt.plot(train_X, train_pred_y0 , color = 'green', label = 'alpha = 0')
plt.plot(train_X, train_pred_y1 , color = 'orange', label = 'alpha = 1')
plt.plot(train_X, train_pred_y10 , color = 'blue', label = 'alpha = 10')
plt.legend(loc = "lower left")
plt.grid(True)

f:id:teyoblog:20200226195908p:plain
出力結果

まだまだいびつなんだけど、alphaを買えることによる変化はつかめます。

余談

悩んでた頃の出力はこちら
f:id:teyoblog:20200226200030p:plain
原因は、plot時にソートをしていたこと、

  # 訓練データ
  train_X = np.sort(np.random.uniform(low = 0, high = 1.2, size = train_size))    # (20,) 1行20列

このソートをplot時にするのではなく、Xを生成した直後にして、それからyを作るようにしたら治りました。