思考ノイズ

無い知恵を絞りだす。無理はしない。

02 正則化項

02正則化項について、以下の2点について簡単なプログラムを書いて確認をしてみた。

  1. 罰則項ありの場合となしの場合での結果の比較
  2. 罰則項ありの場合となしの場合でのグラフのプロット

1. 罰則項ありの場合となしの場合での結果の比較

罰則項なしの場合のデータを個別に用意して比較できるようにアウトプットする

model = Ridge(alpha=1.0)
model.fit(train_poly_X, train_y)

train_pred_y = model.predict(train_poly_X)
test_pred_y = model.predict(test_poly_X)

print("Alpha=1.0")
print("Error on Train X data: ", mean_squared_error(train_pred_y, train_y))
print("Error on Test  X data: ", mean_squared_error(test_pred_y, test_y))

model1 = Ridge(alpha=0.0)
model1.fit(train_poly_X, train_y)

train_pred_y = model1.predict(train_poly_X)
test_pred_y = model1.predict(test_poly_X)

print("Alpha=0.0")
print("Error on Train X data: ", mean_squared_error(train_pred_y, train_y))
print("Error on Test  X data: ", mean_squared_error(test_pred_y, test_y))

結果

Alpha=1.0
Error on Train X data:  0.19642503883759263
Error on Test  X data:  0.27179414009488306
Alpha=0.0
Error on Train X data:  0.018501373444128104
Error on Test  X data:  0.43513975904165086

確かに罰則項ないなると、学習データに過学習していいるが、 罰則項がある場合、検証データにおいてより適用の具合が高くなっているようだ。

2. 罰則項ありの場合となしの場合でのグラフのプロット

import matplotlib.pyplot as plt

x1 = np.linspace(0.0, 1.3, 101)
w0 = model.intercept_
w = model.coef_
y1 = [w0 + w[1]*x + w[2]*x**2 + w[3]*x**3 + w[4]*x**4 + w[5]*x**5 + w[6]*x**6 for x in x1]

w0_ = model1.intercept_
w_ = model1.coef_
y1_ = [w0_ + w_[1]*x + w_[2]*x**2 + w_[3]*x**3 + w_[4]*x**4 + w_[5]*x**5 + w_[6]*x**6 for x in x1]

plt.scatter(train_X, train_y, color='blue')
plt.scatter(test_X, test_y, color='red')

plt.plot(x1, y1, color='black', label="alpha=1.0")
plt.plot(x1_, y1_, color='brown', label="alpha=0.0")

plt.legend()

結果

f:id:bython-chogo:20210425135543p:plain

罰則化項なしの過学習にくらべ、罰則化項ありの学習の線が穏やかにフィットしているようにみえる。これだけだと、なしのほうが良いんでないかと考えてしまうが、先ほどみた検証データのように学習データにおける過学習はさけるべきであるようだ。