不均衡なクラスに対する SVM

Beginner

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

はじめに

この実験では、不均衡なクラスに対してサポートベクターマシン (SVM) をどのように使用するかを学びます。まず、通常の SVM で分離平面を見つけ、その後、不均衡なクラスに対する自動補正付きの分離超平面を (破線で) プロットします。ランダムな点の 2 つのクラスタを作成するために make_blobs 関数を使用します。

VM のヒント

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

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

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

ライブラリのインポート

この実験に必要なライブラリをインポートして始めましょう。matplotlib.pyplotsvmmake_blobs、および DecisionBoundaryDisplay です。

import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
from sklearn.inspection import DecisionBoundaryDisplay

データの作成

make_blobs 関数を使って、ランダムな点の 2 つのクラスタを作成します。1000 個の点からなるクラスタと、100 個の点からなるクラスタを作成します。クラスタの中心はそれぞれ [0.0, 0.0][2.0, 2.0] になります。clusters_std パラメータはクラスタの標準偏差を制御します。

n_samples_1 = 1000
n_samples_2 = 100
centers = [[0.0, 0.0], [2.0, 2.0]]
clusters_std = [1.5, 0.5]
X, y = make_blobs(
    n_samples=[n_samples_1, n_samples_2],
    centers=centers,
    cluster_std=clusters_std,
    random_state=0,
    shuffle=False,
)

モデルの適合

svm ライブラリの SVC 関数を使って、モデルを適合させ、分離超平面を取得します。線形カーネルを使用し、C を 1.0 に設定します。

clf = svm.SVC(kernel="linear", C=1.0)
clf.fit(X, y)

重み付きクラスでモデルを適合させる

svm ライブラリの SVC 関数を使って、モデルを適合させ、分離超平面を取得します。線形カーネルを使用し、class_weight{1: 10} に設定します。これにより、小さなクラスにより多くの重みが与えられます。

wclf = svm.SVC(kernel="linear", class_weight={1: 10})
wclf.fit(X, y)

サンプルをプロットする

matplotlib.pyplotscatter 関数を使って、サンプルをプロットします。

plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors="k")

両方の分類器の決定関数をプロットする

sklearn.inspection ライブラリの DecisionBoundaryDisplay 関数を使って、両方の分類器の決定関数をプロットします。plot_method"contour" に、通常の SVM の colors"k" に、重み付き SVM の colors"r" に、levels[0] に、alpha0.5 に、linestyles["-"] に設定します。また、axplt.gca() に設定します。

ax = plt.gca()
disp = DecisionBoundaryDisplay.from_estimator(
    clf,
    X,
    plot_method="contour",
    colors="k",
    levels=[0],
    alpha=0.5,
    linestyles=["-"],
    ax=ax,
)

wdisp = DecisionBoundaryDisplay.from_estimator(
    wclf,
    X,
    plot_method="contour",
    colors="r",
    levels=[0],
    alpha=0.5,
    linestyles=["-"],
    ax=ax,
)

凡例を追加する

matplotlib.pyplotlegend 関数を使って、プロットに凡例を追加します。凡例のラベルをそれぞれ "non weighted""weighted" に設定します。

plt.legend(
    [disp.surface_.collections[0], wdisp.surface_.collections[0]],
    ["non weighted", "weighted"],
    loc="upper right",
)

プロットを表示する

最後に、matplotlib.pyplotshow 関数を使ってプロットを表示します。

plt.show()

まとめ

この実験では、不均衡なクラスに対してサポートベクターマシン (SVM) をどのように使用するかを学びました。make_blobs 関数を使ってランダムな点の 2 つのクラスタを作成し、通常の SVM と不均衡なクラスに対する自動補正付きの 2 つの SVM モデルを作成しました。両方の分類器のサンプルと決定関数をプロットし、プロットに凡例を追加しました。