はじめに
この実験では、異なる C の値に対して L1、L2、およびエラスティックネットペナルティを使用した場合の解の疎らさを調べます。ロジスティック回帰を使用して、8x8 の数字画像を 2 つのクラスに分類します:0-4 対 5-9。C を変化させた場合のモデルの係数を可視化します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使用して練習します。
場合によっては、Jupyter Notebook が読み込み完了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題が発生した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
最初のステップは、必要なライブラリをインポートすることです。sklearn.linear_model から numpy、matplotlib.pyplot、datasets、StandardScaler、および LogisticRegression が必要になります。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
データセットを読み込む
datasets.load_digits(return_X_y=True) を使用して、数字のデータセットを読み込みます。また、StandardScaler().fit_transform(X) を使用してデータを標準化します。目的変数は 2 値になり、0-4 は 0 として分類され、5-9 は 1 として分類されます。
X, y = datasets.load_digits(return_X_y=True)
X = StandardScaler().fit_transform(X)
y = (y > 4).astype(int)
正則化パラメータと L1 比率を定義する
エラスティックネットペナルティの正則化パラメータ C と L1 比率 l1_ratio を定義します。l1_ratio を 0.5 に設定します。
l1_ratio = 0.5
可視化用のサブプロットを作成する
変化する C に対するモデルの係数を可視化するために、サブプロットを作成します。3 行 3 列のサブプロットを作成します。
fig, axes = plt.subplots(3, 3)
異なるペナルティと正則化パラメータを持つロジスティック回帰モデルを学習する
L1、L2、およびエラスティックネットペナルティと異なる C の値を持つロジスティック回帰モデルを学習します。短い学習時間に対する許容度を高めます。
for i, (C, axes_row) in enumerate(zip((1, 0.1, 0.01), axes)):
clf_l1_LR = LogisticRegression(C=C, penalty="l1", tol=0.01, solver="saga")
clf_l2_LR = LogisticRegression(C=C, penalty="l2", tol=0.01, solver="saga")
clf_en_LR = LogisticRegression(C=C, penalty="elasticnet", solver="saga", l1_ratio=l1_ratio, tol=0.01)
clf_l1_LR.fit(X, y)
clf_l2_LR.fit(X, y)
clf_en_LR.fit(X, y)
疎密度とスコアを計算する
各モデルの疎密度(ゼロ係数の割合)とスコアを計算します。
coef_l1_LR = clf_l1_LR.coef_.ravel()
coef_l2_LR = clf_l2_LR.coef_.ravel()
coef_en_LR = clf_en_LR.coef_.ravel()
sparsity_l1_LR = np.mean(coef_l1_LR == 0) * 100
sparsity_l2_LR = np.mean(coef_l2_LR == 0) * 100
sparsity_en_LR = np.mean(coef_en_LR == 0) * 100
score_l1_LR = clf_l1_LR.score(X, y)
score_l2_LR = clf_l2_LR.score(X, y)
score_en_LR = clf_en_LR.score(X, y)
係数を可視化する
各ペナルティと C 値に対するモデルの係数を可視化します。
for ax, coefs in zip(axes_row, [coef_l1_LR, coef_en_LR, coef_l2_LR]):
ax.imshow(np.abs(coefs.reshape(8, 8)), interpolation='nearest', cmap='binary', vmax=1, vmin=0)
ax.set_xticks(())
ax.set_yticks(())
タイトルとラベルを設定する
サブプロットのタイトルとラベルを設定します。
if i == 0:
axes_row[0].set_title("L1 ペナルティ")
axes_row[1].set_title("エラスティックネット\nl1_ratio = %s" % l1_ratio)
axes_row[2].set_title("L2 ペナルティ")
axes_row[0].set_ylabel("C = %s" % C)
結果を表示する
各モデルの疎密度とスコアを表示します。
print("C=%.2f" % C)
print("{:<40} {:.2f}%".format("L1 ペナルティによる疎密度:", sparsity_l1_LR))
print("{:<40} {:.2f}%".format("エラスティックネットペナルティによる疎密度:", sparsity_en_LR))
print("{:<40} {:.2f}%".format("L2 ペナルティによる疎密度:", sparsity_l2_LR))
print("{:<40} {:.2f}".format("L1 ペナルティによるスコア:", score_l1_LR))
print("{:<40} {:.2f}".format("エラスティックネットペナルティによるスコア:", score_en_LR))
print("{:<40} {:.2f}".format("L2 ペナルティによるスコア:", score_l2_LR))
可視化結果を表示する
サブプロットを表示します。
plt.show()
まとめ
この実験では、異なる C の値に対して L1、L2、およびエラスティックネットペナルティを使用した場合の解の疎密度を調べました。ロジスティック回帰を用いて、8x8 の数字画像を 2 つのクラスに分類しました。0-4 と 5-9。C を変化させた場合のモデルの係数を可視化しました。また、各モデルの疎密度とスコアを計算し、結果を表示しました。