分類確率のプロット

Beginner

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

はじめに

この実験では、Python の Scikit-learn を使って、さまざまな分類器の分類確率をプロットする方法を示します。3 クラスのデータセットを使い、サポートベクトル分類器、One-Vs-Rest または多項式設定で L1 および L2 ペナルティ付きのロジスティック回帰、およびガウシアン過程分類で分類します。

VM のヒント

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

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化できません。

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

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

まず、この実験に必要なライブラリをインポートします。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import RBF
from sklearn import datasets

データセットを読み込む

次に、Scikit-learn から iris データセットを読み込みます。

iris = datasets.load_iris()
X = iris.data[:, 0:2]  ## 可視化のため、最初の 2 つの特徴のみを使用します
y = iris.target
n_features = X.shape[1]

分類器を定義する

このデータセットに対して、さまざまな分類器を定義します。

C = 10
kernel = 1.0 * RBF([1.0, 1.0])  ## GPC 用
## さまざまな分類器を作成します。
classifiers = {
    "L1 ロジスティック回帰": LogisticRegression(
        C=C, penalty="l1", solver="saga", multi_class="multinomial", max_iter=10000
    ),
    "L2 ロジスティック回帰(多項式)": LogisticRegression(
        C=C, penalty="l2", solver="saga", multi_class="multinomial", max_iter=10000
    ),
    "L2 ロジスティック回帰(One-Vs-Rest)": LogisticRegression(
        C=C, penalty="l2", solver="saga", multi_class="ovr", max_iter=10000
    ),
    "線形 SVC": SVC(kernel="linear", C=C, probability=True, random_state=0),
    "GPC": GaussianProcessClassifier(kernel),
}

分類確率を可視化する

それぞれの分類器の分類確率を可視化します。

n_classifiers = len(classifiers)

plt.figure(figsize=(3 * 2, n_classifiers * 2))
plt.subplots_adjust(bottom=0.2, top=0.95)

xx = np.linspace(3, 9, 100)
yy = np.linspace(1, 5, 100).T
xx, yy = np.meshgrid(xx, yy)
Xfull = np.c_[xx.ravel(), yy.ravel()]

for index, (name, classifier) in enumerate(classifiers.items()):
    classifier.fit(X, y)

    y_pred = classifier.predict(X)
    accuracy = accuracy_score(y, y_pred)
    print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100))

    ## 確率を表示する:
    probas = classifier.predict_proba(Xfull)
    n_classes = np.unique(y_pred).size
    for k in range(n_classes):
        plt.subplot(n_classifiers, n_classes, index * n_classes + k + 1)
        plt.title("Class %d" % k)
        if k == 0:
            plt.ylabel(name)
        imshow_handle = plt.imshow(
            probas[:, k].reshape((100, 100)), extent=(3, 9, 1, 5), origin="lower"
        )
        plt.xticks(())
        plt.yticks(())
        idx = y_pred == k
        if idx.any():
            plt.scatter(X[idx, 0], X[idx, 1], marker="o", c="w", edgecolor="k")

ax = plt.axes([0.15, 0.04, 0.7, 0.05])
plt.title("Probability")
plt.colorbar(imshow_handle, cax=ax, orientation="horizontal")

plt.show()

まとめ

この実験では、Python の Scikit-learn を使って、さまざまな分類器の分類確率をプロットする方法を示しました。iris データセットを読み込み、さまざまな分類器を定義し、それぞれの分類器の分類確率を可視化しました。