ラッソとエラスティックネット

Beginner

This tutorial is from open-source community. Access the source code

はじめに

このチュートリアルでは、線形回帰に使用される手法であるラッソ(Lasso)とエラスティックネット(Elastic Net)について学びます。これらは座標降下法を用いて実装されます。また、ラッソとエラスティックネットを使って正則化パスを計算する方法と、matplotlib を使って結果を表示する方法についても学びます。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。

学習中に問題がある場合は、Labby にお問い合わせください。セッション終了後にフィードバックを提供してください。すぐに問題を解決いたします。

データセットの読み込み

このステップでは、scikit-learn ライブラリから糖尿病データセットを読み込み、データを標準化します。

from sklearn import datasets

## 糖尿病データセットを読み込む
X, y = datasets.load_diabetes(return_X_y=True)

## データを標準化する
X /= X.std(axis=0)

ラッソを使って正則化パスを計算する

このステップでは、ラッソ手法を使って正則化パスを計算し、matplotlib を使って結果を表示します。

from sklearn.linear_model import lasso_path
import numpy as np
import matplotlib.pyplot as plt

## eps の値を設定する
eps = 5e-3

## ラッソを使って正則化パスを計算する
alphas_lasso, coefs_lasso, _ = lasso_path(X, y, eps=eps)

## matplotlib を使って結果を表示する
plt.figure(1)
colors = cycle(["b", "r", "g", "c", "k"])
neg_log_alphas_lasso = -np.log10(alphas_lasso)
for coef_l, c in zip(coefs_lasso, colors):
    l1 = plt.plot(neg_log_alphas_lasso, coef_l, c=c)

plt.xlabel("-Log(alpha)")
plt.ylabel("係数")
plt.title("ラッソパス")
plt.axis("tight")
plt.show()

正のラッソを使って正則化パスを計算する

このステップでは、正のラッソ手法を使って正則化パスを計算し、matplotlib を使って結果を表示します。

## 正のラッソを使って正則化パスを計算する
alphas_positive_lasso, coefs_positive_lasso, _ = lasso_path(X, y, eps=eps, positive=True)

## matplotlib を使って結果を表示する
plt.figure(2)
neg_log_alphas_positive_lasso = -np.log10(alphas_positive_lasso)
for coef_l, coef_pl, c in zip(coefs_lasso, coefs_positive_lasso, colors):
    l1 = plt.plot(neg_log_alphas_lasso, coef_l, c=c)
    l2 = plt.plot(neg_log_alphas_positive_lasso, coef_pl, linestyle="--", c=c)

plt.xlabel("-Log(alpha)")
plt.ylabel("係数")
plt.title("ラッソと正のラッソ")
plt.legend((l1[-1], l2[-1]), ("ラッソ", "正のラッソ"), loc="lower left")
plt.axis("tight")
plt.show()

エラスティックネットを使って正則化パスを計算する

このステップでは、エラスティックネット手法を使って正則化パスを計算し、matplotlib を使って結果を表示します。

from sklearn.linear_model import enet_path

## エラスティックネットを使って正則化パスを計算する
alphas_enet, coefs_enet, _ = enet_path(X, y, eps=eps, l1_ratio=0.8)

## matplotlib を使って結果を表示する
plt.figure(3)
neg_log_alphas_enet = -np.log10(alphas_enet)
for coef_e, c in zip(coefs_enet, colors):
    l1 = plt.plot(neg_log_alphas_enet, coef_e, c=c)

plt.xlabel("-Log(alpha)")
plt.ylabel("係数")
plt.title("エラスティックネットパス")
plt.axis("tight")
plt.show()

正のエラスティックネットを使って正則化パスを計算する

このステップでは、正のエラスティックネット手法を使って正則化パスを計算し、matplotlib を使って結果を表示します。

## 正のエラスティックネットを使って正則化パスを計算する
alphas_positive_enet, coefs_positive_enet, _ = enet_path(X, y, eps=eps, l1_ratio=0.8, positive=True)

## matplotlib を使って結果を表示する
plt.figure(4)
neg_log_alphas_positive_enet = -np.log10(alphas_positive_enet)
for coef_e, coef_pe, c in zip(coefs_enet, coefs_positive_enet, colors):
    l1 = plt.plot(neg_log_alphas_enet, coef_e, c=c)
    l2 = plt.plot(neg_log_alphas_positive_enet, coef_pe, linestyle="--", c=c)

plt.xlabel("-Log(alpha)")
plt.ylabel("係数")
plt.title("エラスティックネットと正のエラスティックネット")
plt.legend((l1[-1], l2[-1]), ("エラスティックネット", "正のエラスティックネット"), loc="lower left")
plt.axis("tight")
plt.show()

まとめ

このチュートリアルでは、線形回帰に使用される手法であるラッソとエラスティックネットについて学びました。また、ラッソとエラスティックネットを使って正則化パスを計算する方法と、matplotlib を使って結果を表示する方法を学びました。また、正のラッソと正のエラスティックネット手法を使って正則化パスを計算する方法も学びました。