Categories
モデル

サポートベクトルマシン

概要

サポートベクトルマシン(Support Vector Machine、SVM)は、機械学習の教師あり学習アルゴリズムの一つです。主に分類や回帰の問題に適用されます。

SVMは、データポイントを高次元の特徴空間に写像し、その空間で最適な境界(超平面)を見つけることで、データを分類する手法です。SVMの目標は、クラス間のマージン(間隔)を最大化するように決定境界を設定することです。マージンは、最も近いトレーニングデータポイントと決定境界の間の距離として定義されます。

SVMの主な特徴は以下のとおりです:

  1. 線形および非線形分類: SVMは線形分類の問題だけでなく、カーネルトリックを使用することで非線形分類も可能です。カーネルトリックは、データを高次元空間に写像し、非線形な境界を線形に近似する手法です。
  2. マージン最大化: SVMは、最も近いトレーニングデータポイントとの間に最大のマージンを持つ境界を見つけることを目指します。これにより、未知のデータに対する汎化性能が高まります。
  3. サポートベクトル: SVMは、マージン内にあるごく一部のトレーニングデータポイントのみを重要視します。これらのデータポイントをサポートベクトルと呼び、決定境界の位置を決定する上で重要な役割を果たします。

SVMは、データの次元数が大きくなっても効果を発揮し、過学習に強いとされています。また、カーネルトリックを用いることで非線形な境界を学習できるため、多様なデータセットに適用可能です。ただし、大規模なデータセットに対しては計算コストが高くなることがあります。

コード例

この例では、2次元の特徴空間における2クラスの分類タスクを想定しています。

# 必要なライブラリのインポート
from sklearn import svm
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# ダミーデータの生成
X, y = make_blobs(n_samples=100, centers=2, random_state=42)

# SVMモデルの作成と訓練
model = svm.SVC(kernel='linear')
model.fit(X, y)

# 決定境界の描画
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()

# グリッドポイントの生成
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T

# 決定境界とマージンの描画
Z = model.decision_function(xy).reshape(XX.shape)
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
           linestyles=['--', '-', '--'])
ax.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], s=100,
           linewidth=1, facecolors='none', edgecolors='k')
plt.show()

この例では、make_blobs関数を使用してダミーデータを生成しています。2つのクラスを持つデータセットが生成されます。

SVMモデルを作成する際に、svm.SVCクラスを使用し、カーネルとしてlinearを指定しています。訓練データをモデルに適合させるために、fitメソッドを使用します。

最後に、生成したデータと決定境界を可視化するために、Matplotlibを使用して散布図と決定境界を描画しています。

このコード例は、簡単な2次元データセットを用いてSVMの分類を示しています。実際の問題に適用する場合は、データの前処理やハイパーパラメータの調整が必要になることに留意してください。