手順別のロジスティック回帰

Machine LearningMachine LearningBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、異なるCの値に対してL1、L2、およびエラスティックネットペナルティを使用した場合の解の疎らさを調べます。ロジスティック回帰を使用して、8x8の数字画像を2つのクラスに分類します:0-4対5-9。Cを変化させた場合のモデルの係数を可視化します。

VMのヒント

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

場合によっては、Jupyter Notebookが読み込み完了するまで数秒待つ必要があります。Jupyter Notebookの制限により、操作の検証を自動化することはできません。

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49202{{"手順別のロジスティック回帰"}} sklearn/preprocessing -.-> lab-49202{{"手順別のロジスティック回帰"}} ml/sklearn -.-> lab-49202{{"手順別のロジスティック回帰"}} end

必要なライブラリをインポートする

最初のステップは、必要なライブラリをインポートすることです。sklearn.linear_model から numpymatplotlib.pyplotdatasetsStandardScaler、および 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を変化させた場合のモデルの係数を可視化しました。また、各モデルの疎密度とスコアを計算し、結果を表示しました。