はじめに
サポートベクターマシン (SVM) は、分類と回帰分析に使用されます。SVM は、データを異なるクラスに分離する最適な直線または超平面を見つけます。異なるクラスの 2 つの最も近いデータポイント間の距離を最大化する直線または超平面をマージンと呼びます。この実験では、線形 SVM におけるパラメータ C がマージンにどのように影響するかを調べます。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使って練習しましょう。
Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
ライブラリのインポート
必要なライブラリをインポートして始めます。これには、numpy、matplotlib、および scikit-learn が含まれます。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
データの生成
numpy の random.randn 関数を使って、40 個の分離可能なポイントを生成します。最初の 20 個のポイントは平均 [-2, -2] を持ち、次の 20 個のポイントは平均 [2, 2] を持ちます。そして、最初の 20 個のポイントにはクラスラベル 0 を割り当て、次の 20 個のポイントにはクラスラベル 1 を割り当てます。
np.random.seed(0)
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
Y = [0] * 20 + [1] * 20
モデルの適合
scikit-learn の SVC クラスを使って SVM モデルを適合させます。カーネルを線形に設定し、ペナルティパラメータ C を、正則化なしの場合には 1、正則化ありの場合には 0.05 に設定します。そして、モデルの係数と切片を使って分離超平面を計算します。
for name, penalty in (("unreg", 1), ("reg", 0.05)):
clf = svm.SVC(kernel="linear", C=penalty)
clf.fit(X, Y)
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-5, 5)
yy = a * xx - (clf.intercept_[0]) / w[1]
マージンの計算
分離超平面のマージンを計算します。まず、モデルの係数を使ってマージン距離を計算します。次に、超平面の傾きを使ってサポートベクトルから超平面までの垂直距離を計算します。最後に、直線、ポイント、および平面に最も近いベクトルをプロットします。
margin = 1 / np.sqrt(np.sum(clf.coef_**2))
yy_down = yy - np.sqrt(1 + a**2) * margin
yy_up = yy + np.sqrt(1 + a**2) * margin
plt.plot(xx, yy, "k-")
plt.plot(xx, yy_down, "k--")
plt.plot(xx, yy_up, "k--")
plt.scatter(
clf.support_vectors_[:, 0],
clf.support_vectors_[:, 1],
s=80,
facecolors="none",
zorder=10,
edgecolors="k",
cmap=plt.get_cmap("RdBu"),
)
plt.scatter(
X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.get_cmap("RdBu"), edgecolors="k"
)
plt.axis("tight")
x_min = -4.8
x_max = 4.2
y_min = -6
y_max = 6
等高線の描画
決定関数の等高線を描画します。まず、xx と yy 配列を使ってメッシュグリッドを作成します。次に、メッシュグリッドを 2 次元配列に整形し、SVC クラスの decision_function メソッドを適用して予測値を取得します。そして、contourf メソッドを使って等高線を描画します。
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
plt.contourf(XX, YY, Z, cmap=plt.get_cmap("RdBu"), alpha=0.5, linestyles=["-"])
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
グラフの表示
正則化なしと正則化ありの場合のグラフを表示します。
plt.show()
まとめ
この実験では、線形 SVM におけるパラメータ C がマージンにどのように影響するかを調べました。データを生成し、モデルを適合させ、マージンを計算し、結果をプロットしました。そして、正則化なしと正則化ありの場合のグラフを表示しました。