線形回帰⑨ (交差検証)

前回は、ハイパーパラメータのalphaを1つだけ指定して、学習・評価を行いましたが、最適なalphaを見つけるためには複数の値を設定し、その結果を確認する必要があります。

LassoCVクラスを使うと、一度に複数のalphaの結果を確認することができます。

交差検証

LassoCVクラスは複数のalphaで交差検証を行い、最も精度が高かった時のalphaを結果として表示することができます。

alphaが[0.1, 0.5, 1, 5, 10]の場合の交差検証を行うコードは以下の通りです。

[Google Colaboratory]

1
2
3
from sklearn.linear_model import LassoCV

lasso_cv = LassoCV(alphas=[0.1, 0.5, 1, 5, 10]).fit(X_train_scaled, y_train)

[実行結果]

交差検証が正常に終了しました。

重み確認

交差検証により、最も精度のよかった時のalphaでモデルが構築されています。

最適なalphaと各説明変数の重みを確認します。

[Google Colaboratory]

1
2
3
4
print(f"alpha = {lasso_cv.alpha_}")
for i, (col, coef) in enumerate(zip(boston.feature_names, lasso_cv.coef_)):
print(f"w{i}({col}) = {coef}")
print(f"b = {lasso_cv.intercept_}")

[実行結果]

0.1のときの精度が最も高いということが確認できました。

またペナルティが弱くなったため、重みが0になる説明変数がなくなりました。

精度評価スコア

精度評価スコアを確認します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
y_train_pred = lasso_cv.predict(X_train_scaled)
y_test_pred = lasso_cv.predict(X_test_scaled)

y_train_pred = np.expand_dims(y_train_pred, 1)
y_test_pred = np.expand_dims(y_test_pred, 1)

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

[実行結果]

精度評価スコアが以前のモデルよりも向上しています。

交差検証を使うと、効率的にパラメータの調整を行うことができるので、積極的に活用していきましょう。

次回は、リッジ回帰を行います。

線形回帰⑧ (LASSO回帰モデルのパラメータ変更)

LASSO回帰モデルのハイパーパラメータを変更します。

ハイパーパラメータとは、機械学習モデルがもつパラメータの中で人間が任意に調整するパラメータです。

ハイパーパラメータの設定次第で、モデルの精度が大きく変わってしまいますので適切な値を設定する必要があります。

ハイパーパラメータ(alpha)変更

Lassoクラスにはalphaというハイパーパラメータがあり、正則化項によるペナルティの強さを調整できます。

alphaの値が大きいほど、重みを0にする力が強くなります。

alphaのデフォルトは1.0ですが、試しに10に変更してモデルを構築・学習してみます。

[Google Colaboratory]

1
lasso_change_param = Lasso(alpha=10).fit(X_train_scaled, y_train)

重みを表示して、結果を確認します。

[Google Colaboratory]

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

[実行結果]

ペナルティを強くしすぎたようで、全ての説明変数の重みが0.0となってしまいました。

最適なalphaを見つけるためには、さらに試行錯誤が必要なようです。

線形回帰⑦ (LASSO回帰モデルの評価)

前回構築したLASSO回帰モデルの評価を行います。

残差プロット

予測値と実測値の残差プロットを表示します。

以前に定義したresidual_plot関数を使います。

[Google Colaboratory]

1
residual_plot(y_train_pred, y_train, y_test_pred, y_test)

[実行結果]

重回帰と比較し、残差の分布に違いはないようです。

精度評価スコア

次に精度評価スコアを算出します。

以前に定義したget_eval_score関数を使います。

[Google Colaboratory]

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

[実行結果]

重回帰と比べて、やや低いスコアとなっていまいました。

重み

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

[Google Colaboratory]

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

[実行結果]

RMやLSTATのような重要な変数の重みは残っていますが、多くの説明変数の重みが0になりました。

このようにLASSO回帰では各説明変数の重みを0に近づけ、特定の説明変数の重みを0にします。

次回は、LASSO回帰のハイパーパラメータを変更してみます。

線形回帰⑥ (LASSO回帰モデル)

今回はLASSO回帰モデルを構築します。

LASSO回帰モデルは、重みが大きくなるのを抑えるために重回帰による各変数の重みの算出時に正則化項というペナルティを設定しています。

この正則化項はL1ノルムと言われ、変数の重みを0に近づけると同時に、特定の変数の重みを完全に0にする効果があります。

この効果によって過学習を抑えられるだけでなく、一部の変数の重みが0になることでモデルがシンプルになり、分かりやすくなるというメリットもあります。

LASSO回帰モデルの構築

LASSO回帰モデルを構築するためにはscikit-learnに用意されているLassoクラスを使用します。

データは前回の重回帰分析でスケーリングしたものを使います。

[Google Colaboratory]

1
2
3
from sklearn.linear_model import Lasso

lasso = Lasso().fit(X_train_scaled, y_train)

続いて予測値を出力します。

[Google Colaboratory]

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

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

[実行結果]

予測値を確認すると、前回重回帰分析で出力されたデータ形式とは違うようです。

データ形式の変更

データ形式をこれまで出力したものと合わせておきます。

Numpyのexpand_dims関数を使い次元を追加します。

第1引数にデータを指定し、第2引数に次元を追加する位置を指定します。

[Google Colaboratory]

1
2
3
4
5
y_train_pred = np.expand_dims(y_train_pred, 1)
y_test_pred = np.expand_dims(y_test_pred, 1)

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

[実行結果]

次回は、今回構築したLASSO回帰モデルの評価を行います。


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×