機械学習基礎理論独習

誤りがあればご指摘いただけると幸いです。数式が整うまで少し時間かかります。リンクフリーです。

勉強ログです。リンクフリーです
目次へ戻る

【Python実装 - sklearn使用】リッジ回帰と過学習

ソースの説明

ソースは【Python自前実装】曲線フィッティングがベースなので、そちらをご一読ください。

リッジ回帰

リッジ回帰は以下の目的関数を最小化する回帰のことで、過学習を防ぐことができます。

\begin{eqnarray}
E({\bf w})=\frac{1}{2}||{\boldsymbol\Phi}{\bf w}-{\bf t}||^2+\frac{\lambda}{2}||{\bf w}||^2\tag{1}
\end{eqnarray}

# リッジ回帰(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()

f:id:olj611:20210421064815p:plain:w800
f:id:olj611:20210421064758p:plain:w500

偉人の名言

f:id:olj611:20210421065629p:plain:w300
為せば成る為さねば成らぬ何事も、成らぬは人の為さぬなりけり。
上杉鷹山

参考文献

Pythonによる機械学習入門

動画

無し

目次へ戻る