はじめに
この実験では、不均衡なクラスに対してサポートベクターマシン (SVM) をどのように使用するかを学びます。まず、通常の SVM で分離平面を見つけ、その後、不均衡なクラスに対する自動補正付きの分離超平面を (破線で) プロットします。ランダムな点の 2 つのクラスタを作成するために make_blobs 関数を使用します。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお尋ねください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
ライブラリのインポート
この実験に必要なライブラリをインポートして始めましょう。matplotlib.pyplot、svm、make_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.pyplot の scatter 関数を使って、サンプルをプロットします。
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] に、alpha を 0.5 に、linestyles を ["-"] に設定します。また、ax を plt.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.pyplot の legend 関数を使って、プロットに凡例を追加します。凡例のラベルをそれぞれ "non weighted" と "weighted" に設定します。
plt.legend(
[disp.surface_.collections[0], wdisp.surface_.collections[0]],
["non weighted", "weighted"],
loc="upper right",
)
プロットを表示する
最後に、matplotlib.pyplot の show 関数を使ってプロットを表示します。
plt.show()
まとめ
この実験では、不均衡なクラスに対してサポートベクターマシン (SVM) をどのように使用するかを学びました。make_blobs 関数を使ってランダムな点の 2 つのクラスタを作成し、通常の SVM と不均衡なクラスに対する自動補正付きの 2 つの SVM モデルを作成しました。両方の分類器のサンプルと決定関数をプロットし、プロットに凡例を追加しました。