はじめに
L1 ロジスティック回帰モデルは、L1 正則化を使用してモデルに疎性を誘導する二値分類手法です。このモデルの正則化パスは、正則化強度が増加するにつれてモデルの係数を示します。この実験では、Iris データセットを使用して L1 ペナルティ付きロジスティック回帰モデルを学習し、その正則化パスをプロットします。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
Iris データセットを読み込む
scikit-learn ライブラリから Iris データセットを読み込みます。このデータセットには、がく片の長さ、がく片の幅、花弁の長さ、花弁の幅の 4 つの特徴が含まれています。二値分類には最初の 2 つの特徴のみを使用します。
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
X = X[y!= 2] ## 二値分類には最初の 2 つの特徴のみを使用
y = y[y!= 2]
X /= X.max() ## 収束を加速するために X を正規化
正則化パスを計算する
異なる正則化強度の L1 ペナルティ付きロジスティック回帰モデルを学習することで正則化パスを計算します。L1 ペナルティ付きのロジスティック回帰損失に対して効率的に最適化できる liblinear ソルバーを使用します。係数を収集する前にモデルが収束していることを確認するために、許容誤差の低い値を設定します。また、warm_start=True を使用します。これは、モデルの係数を再利用して次のモデルのフィットを初期化し、フルパスの計算を高速化することを意味します。
import numpy as np
from sklearn import linear_model
from sklearn.svm import l1_min_c
cs = l1_min_c(X, y, loss="log") * np.logspace(0, 10, 16)
clf = linear_model.LogisticRegression(
penalty="l1",
solver="liblinear",
tol=1e-6,
max_iter=int(1e6),
warm_start=True,
intercept_scaling=10000.0,
)
coefs_ = []
for c in cs:
clf.set_params(C=c)
clf.fit(X, y)
coefs_.append(clf.coef_.ravel().copy())
coefs_ = np.array(coefs_)
正則化パスをプロットする
学習済みモデルの係数を使用して正則化パスをプロットします。係数は、正則化強度の対数に対してプロットされます。グラフの左側(強い正則化項)では、すべての係数が正確に 0 になります。正則化が徐々に緩くなると、係数が順に非ゼロの値をとるようになります。
import matplotlib.pyplot as plt
plt.plot(np.log10(cs), coefs_, marker="o")
ymin, ymax = plt.ylim()
plt.xlabel("log(C)")
plt.ylabel("Coefficients")
plt.title("Logistic Regression Path")
plt.axis("tight")
plt.show()
まとめ
この実験では、Iris データセット上で L1 ペナルティ付きロジスティック回帰モデルを学習し、その正則化パスをプロットする方法を学びました。正則化パスは、異なる正則化強度に対してモデルの係数がどのように変化するかを示します。この方法は、どの特徴がモデルに最も大きな影響を与えるかを特定できるため、特徴選択に役立ちます。