【scikit-learn】教師あり学習:高次元データの予測-3【Python】

本ページでは以下のページを要約するとともに、個人的な解説も記載しています。独特な解釈をしている部分があるので、誤りなどの指摘はtwitterまでお願いします。

参考ページ
Supervised learning: predicting an output variable from high-dimensional observations — scikit-learn 1.1.2 documentation
https://scikit-learn.org/stable/tutorial/statistical_inference/supervised_learning.html
閲覧日:2022年10月12日

正則化(縮小推定)

特長量の次元の数に対して、データの数が少ないと学習データに予測結果がフィットしすぎてしまう、過学習という現象が起こります。
例えば、以下のコードのように1つの特長量に対して、2つのデータだけで推論することを考えます。データというのは誤差が入り込みます。本来の予測として
y=xy = x
の回帰式が正しいものとしたときに、適当な誤差を追加したデータで回帰式を作成するとグレーのようなグラフになります。
また、小さい誤差によって回帰式の変化も大きくなってしまいます。
※グラフの画像の作成はこちら

X = np.c_[ .5, 1].T
y = [.5, 1]
test = np.c_[ 0, 2].T
regr = linear_model.LinearRegression()

import matplotlib.pyplot as plt
plt.figure()
#<...>
np.random.seed(0)
for _ in range(6):
     this_X = .1 * np.random.normal(size=(2, 1)) + X
     regr.fit(this_X, y)
     plt.plot(test, regr.predict(test))
     plt.scatter(this_X, y, s=3)
#LinearRegression...

このような過学習に対する解決策として、回帰係数を小さくするという手法があります。その手法のことをリッジ回帰(Ridge)と呼びます。

regr = linear_model.Ridge(alpha=.1)

plt.figure()
#<...>
np.random.seed(0)
for _ in range(6):
     this_X = .1 * np.random.normal(size=(2, 1)) + X
     regr.fit(this_X, y)
     plt.plot(test, regr.predict(test))
     plt.scatter(this_X, y, s=3)
#Ridge...
リッジ回帰を行う時のハイパーパラメータであるalphaを、大きくするほどバイアスは高くなり、予測結果のばらつきは減ります。

例えば、以下のように糖尿病データセットを使用することで、汎化性能を調整することができます。

#array([0.0001, 0.00039811, 0.00158489,
	    0.00630957, 0.02511886,0.1])
alphas = np.logspace(-4, -1, 6)
print([regr.set_params(alpha=alpha)
            .fit(diabetes_X_train, diabetes_y_train)
            .score(diabetes_X_test, diabetes_y_test)
        for alpha in alphas])
#[0.4725523580192521, 0.47248350131491657, 0.47220902528656805, 0.47111084422404537, 0.46665913731369846, 0.4480436728106735]

ノート:AIモデルが未知のデータを予測した時の性能が、学習データを予測した時と比べ著しく下がってしまうことを過学習と呼びます。また、リッジ回帰によって導入されたバイアスは、正則化と呼ばれます。

今回は直線の回帰式だったためわかりにくいですが、これが多項式回帰で波をうつような式だった場合リッジ回帰によって波が小さくなります。