線形回帰⑩ (リッジ回帰)

リッジ回帰を使ったモデルを構築します。

リッジ回帰

リッジ回帰は、L2ノルムという正則化項を使用したアルゴリズムです。

前回までのLASSO回帰は各変数の重みを0に近づけつつ、特定の変数の重みを0にするという特性がありました。

リッジ回帰は各変数の重みを0に近づけますが、完全な0にはなりません。

そのため、LASSO回帰のようにモデルの解釈を簡単にするという特徴はありませんが、モデルの設計上、全ての説明変数が重要であるというケースではリッジ回帰の方が適していると言えます。

リッジ回帰モデルの構築

リッジ回帰モデルの構築はscikit-learnRidgeクラスを使います。

[Google Colaboratory]

1
2
3
from sklearn.linear_model import Ridge

ridge = Ridge().fit(X_train_scaled, y_train)

リッジ回帰モデルの構築と学習が完了しました。

続いて、重回帰分析の時にスケーリングしたデータを使って予測を行います。

[Google Colaboratory]

1
2
3
4
5
y_train_pred = ridge.predict(X_train_scaled)
y_test_pred = ridge.predict(X_test_scaled)

print(y_train_pred[:5])
print(y_test_pred[:5])

[実行結果]

残差プロット

残差プロットを表示します。

[Google Colaboratory]

1
residual_plot(y_train_pred, y_train, y_test_pred, y_test)

[実行結果]

精度評価スコア

精度評価スコアを表示します。

[Google Colaboratory]

1
2
3
4
print("訓練データスコア")
get_eval_score(y_train,y_train_pred)
print("テストデータスコア")
get_eval_score(y_test,y_test_pred)

[実行結果]

精度評価スコアはLASSO回帰(alpha=1.0)よりもやや高く、重回帰と同程度となりました。

重み

各説明変数の重みを表示します。

[Google Colaboratory]

1
2
3
for i, (col, coef) in enumerate(zip(boston.feature_names, ridge.coef_[0])):
print(f"w{i}({col}) = {coef}")
print(f"b = {ridge.intercept_[0]}")

[実行結果]

LASSO回帰では多くの説明変数が0となっていましたが、リッジ回帰では重みが完全に0となっている説明変数はありません。

重回帰と比べると、全体的に変数の重みは小さくなっています。

交差検証

リッジ回帰についても、LASSO回帰と同様にscikit-learnに交差検証用のRidgeCVというクラスがあり交差検証が可能です。


次回は、これまで扱ってきた単回帰、重回帰、LASSO回帰、リッジ回帰といういろいろな線形系のアルゴリズムについてまとめます。