02 正則化項
02正則化項について、以下の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()
結果
罰則化項なしの過学習にくらべ、罰則化項ありの学習の線が穏やかにフィットしているようにみえる。これだけだと、なしのほうが良いんでないかと考えてしまうが、先ほどみた検証データのように学習データにおける過学習はさけるべきであるようだ。