ソースの説明
ソースは【Python自前実装】曲線フィッティングがベースなので、そちらをご一読ください。
リッジ回帰
リッジ回帰は以下の目的関数を最小化する回帰のことで、過学習を防ぐことができます。
# リッジ回帰(L2正則化)のモデルを作成 ridge_model = linear_model.Ridge(alpha=np.e**(-18)) # 学習する ridge_model.fit(Phi, t)
過学習
リッジ回帰と比較するために正則化無のモデルも学習しています。
# 線形回帰(正則化無)のモデルを作成 model = linear_model.LinearRegression() # 学習する model.fit(Phi, t)
ソース
import matplotlib.pyplot as plt import numpy as np from sklearn import linear_model # 計画行列クラス(※成分が1の列は作成しない) class DesignMatrix: def __init__(self, degree): self.degree = degree def transform(self, x): return np.hstack([x**(m+1) for m in range(self.degree)]) # 訓練データ作成のための真の関数 def true_func(x): return np.sin(2 * np.pi * x) # ランダムシードを設定する(乱数を固定する) np.random.seed(0) # 訓練データ数 N = 10 # 特徴空間の次元(モデルのパラメータ数) M = 10 # 訓練データxの列ベクトル(入力空間) x = np.linspace(0, 1, N).reshape(-1, 1) # 特徴空間作成のためのインスタンスを作成(※成分が1のみの列は作成しないため、M-1を渡す) dm = DesignMatrix(M-1) # 入力空間から特徴空間へ写す # 行列Phi(特徴空間)を作成(※成分が1のみの列は作成していない) Phi = dm.transform(x) # 訓練データt=sin(x)の列ベクトルに正規分布に従うノイズを加える t = true_func(x) + np.random.normal(0, 0.2, N).reshape(-1, 1) # 線形回帰(正則化無)のモデルを作成 model = linear_model.LinearRegression() # 学習する model.fit(Phi, t) # リッジ回帰(L2正則化)のモデルを作成 ridge_model = linear_model.Ridge(alpha=np.e**(-18)) # 学習する ridge_model.fit(Phi, t) # 係数、切片、決定係数を表示 print('係数(正則化無)', model.coef_) print('切片(正則化無)', model.intercept_) print('決定係数(正則化無)', model.score(Phi, t)) print('係数(リッジ回帰)', ridge_model.coef_) print('切片(リッジ回帰)', ridge_model.intercept_) print('決定係数(リッジ回帰)', ridge_model.score(Phi, t)) # 予測直線表示のためのxを作成 予測するために行列にする(reshape) x2 = np.linspace(0, 1, 100).reshape(-1,1) # 行列Phi2(特徴空間)を作成(※成分が1のみの列は作成していない) Phi2 = dm.transform(x2) # グラフ表示 plt.scatter(x, t, marker ='+') plt.plot(x2, model.predict(Phi2), color='orange', label='LinearRegression') plt.plot(x2, ridge_model.predict(Phi2), color='green', label='Ridge') plt.legend(loc='upper left', borderaxespad=0) plt.show()
偉人の名言
為せば成る為さねば成らぬ何事も、成らぬは人の為さぬなりけり。
上杉鷹山
動画
無し