【機械学習図鑑】正則化
こんにちは
機械学習図鑑の話
実際に手を動かしながら勉強。サンプルプログラムにはないけど図にある曲線をplotしようと戦ったお話。
実はずっと思い通りできなくて泣きそうな状態を共有するつもりだったけど、最後のもうひと頑張りでか帰結できたのでそれを共有。
正則化
簡単に・・・
与えられた訓練データをうまいこと直線で表現できないときは、次数を上げて曲線で表現します。
しかし、うまく訓練データを表しすぎると検証データに適用できなくなります。(過学習)
そういった過学習を避けるためにするのが正則化。
本に書いてあるコードを参考に、モデルのプロットをしてみる。
ちなみにめざすべきはこれ
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)
まだまだいびつなんだけど、alphaを買えることによる変化はつかめます。
余談
悩んでた頃の出力はこちら
原因は、plot時にソートをしていたこと、
# 訓練データ train_X = np.sort(np.random.uniform(low = 0, high = 1.2, size = train_size)) # (20,) 1行20列
このソートをplot時にするのではなく、Xを生成した直後にして、それからyを作るようにしたら治りました。