はじめに
この実験では、SVM のバイアス解消とその決定境界への影響について説明します。SVM において、バイアス解消は、2 つ以上のクラスの距離が等しい場合に、それらの間の衝突を解消するために使用されるメカニズムです。decision_function_shape='ovr'の場合、デフォルトでは有効になっておらず、コストがかかるためです。したがって、この実験では、多クラス分類問題とdecision_function_shape='ovr'に対するbreak_tiesパラメータの影響を示します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み完了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題に直面した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
このステップでは、SVM と可視化に必要なライブラリをインポートします。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.datasets import make_blobs
サンプルデータを作成する
このステップでは、scikit-learn のmake_blobs関数を使ってサンプルデータセットを作成します。このデータセットには 3 つのクラスと 2 つの特徴量が含まれています。
X, y = make_blobs(random_state=27)
バイアス解消を有効にした場合と無効にした場合の SVM モデルを作成する
このステップでは、2 つの SVM モデルを作成します。1 つはバイアス解消を無効にしたもので、もう 1 つはバイアス解消を有効にしたものです。これらのモデルを作成するために、scikit-learn のSVCクラスを使用します。2 つのモデルに対して、それぞれbreak_tiesパラメータをFalseとTrueに設定します。
for break_ties, title, ax in zip((False, True), titles, sub.flatten()):
svm = SVC(
kernel="linear", C=1, break_ties=break_ties, decision_function_shape="ovr"
).fit(X, y)
決定境界を作成する
このステップでは、2 つのモデルの決定境界を作成します。サンプルデータポイントのクラスを予測するためにpredict関数を使用し、決定境界を描画します。
xs = np.linspace(xlim[0], xlim[1], 1000)
ys = np.linspace(ylim[0], ylim[1], 1000)
xx, yy = np.meshgrid(xs, ys)
pred = svm.predict(np.c_[xx.ravel(), yy.ravel()])
colors = [plt.cm.Accent(i) for i in [0, 4, 7]]
points = ax.scatter(X[:, 0], X[:, 1], c=y, cmap="Accent")
classes = [(0, 1), (0, 2), (1, 2)]
line = np.linspace(X[:, 1].min() - 5, X[:, 1].max() + 5)
ax.imshow(
-pred.reshape(xx.shape),
cmap="Accent",
alpha=0.2,
extent=(xlim[0], xlim[1], ylim[1], ylim[0]),
)
決定境界を描画する
このステップでは、前のステップで作成した決定境界を描画します。SVM モデルのcoef_とintercept_属性を使って決定境界を描画します。
for coef, intercept, col in zip(svm.coef_, svm.intercept_, classes):
line2 = -(line * coef[1] + intercept) / coef[0]
ax.plot(line2, line, "-", c=colors[col[0]])
ax.plot(line2, line, "--", c=colors[col[1]])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
ax.set_title(title)
ax.set_aspect("equal")
グラフを表示する
このステップでは、両方のモデルの決定境界を含むグラフを表示します。
plt.show()
まとめ
この実験では、SVM のバイアス解消が決定境界に与える影響を示しました。バイアス解消を無効にした SVM モデルと、バイアス解消を有効にした SVM モデルの 2 つを作成しました。その後、両方のモデルの決定境界を描画しました。バイアス解消を有効にしたモデルの決定境界は、クラスが引き分けになっている領域で非凸になっていました。