見出し画像

サポートベクターマシン(SVM)の理論と実装

サポートベクターマシーン(Support Vector Machine、SVM)

サポートベクターマシン(Support Vector Machine、SVM)は、教師あり学習の一種であり、分類や回帰分析に使われるマシンラーニングのモデルです。特に高次元のデータに対して有効であり、その目標は2つのクラスを分割する最適な決定境界を見つけることです。

SVMの主な概念

最大マージン

SVMは、各クラスの最も近い点(サポートベクター)から最も遠い位置に決定境界を設定します。これにより、決定境界と各クラスの間の「マージン」が最大化され、決定境界からの距離に基づいて新たなデータポイントを分類します。

カーネルトリック

SVMは、データが線形に分離できない場合(非線形問題)でも適用可能です。これはカーネルトリックを使用して達成され、データを高次元空間にマッピングして線形分割を可能にします。よく使われるカーネルは、リニアカーネル、多項式カーネル、RBFカーネルなどがあります。

ソフトマージン

完全な分類が不可能な場合や外れ値が存在する場合に対応するために、SVMではソフトマージンという概念を導入します。これにより、一部のデータ点がマージンを侵害することを許容し、それによるペナルティを最小化することを目指します。

SVMのメリットとデメリット

SVMの利点としては、高次元データの扱いが得意であること、モデルの過学習を防ぐための正則化パラメータを設定できること、非線形問題にも対応できることなどがあります。一方、欠点としては、パラメータ選択とカーネル選択が重要であるため、モデルの性能がこれらの選択に大きく依存すること、大規模なデータセットに対する計算コストが高いこと、結果の解釈が難しいことなどがあります。

SVMの実装

以下に、Pythonとscikit-learnを用いてSVMを実装する例を示します。ここでは、2つの特徴量を持つ2クラスのダミーデータを使用します。

from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np

X, y = datasets.make_blobs(n_samples=100, n_features=2, centers=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = SVC(kernel='linear')
model.fit(X_train, y_train)

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1

xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))

Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('SVM Decision Boundary')

plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1],
            s=100, facecolors='none', edgecolors='k', marker='o')

plt.show()

実行結果

上記のコードを実行すると、以下のようなグラフが得られます。

結果

こちらのグラフは、2つの特徴量を持つダミーデータを用いて、SVMで作成した決定境界を示しています。プロットの各点はデータセットの一部で、色はそれぞれのデータポイントが属するクラスを示しています。背景色の違いはSVMによって予測されるクラスを示しており、境界線はSVMが作成した決定境界を示しています。また、黒枠で囲まれたデータポイントはSVMによって選ばれたサポートベクターを示しています。これらの点は、最適な決定境界を定義するのに用いられ、SVMの学習結果において重要な役割を果たします。

多クラスの場合

from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np

X, y = datasets.make_blobs(n_samples=150, n_features=2, centers=3, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = SVC(kernel='linear', decision_function_shape='ovr')
model.fit(X_train, y_train)

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1

xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))

Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('SVM Decision Boundary (Multiclass)')

plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1],
            s=100, facecolors='none', edgecolors='k', marker='o')

plt.show()

実行結果

上記のコードを実行すると、以下のようなグラフが得られます。

結果

このグラフは、3つのクラスを持つ2次元のダミーデータに対してSVMを適用した結果を示しています。各点はデータポイントを示し、その色はデータポイントが属するクラスを示しています。背景の色はSVMによる予測クラスを示し、境界線はSVMが作成した決定境界を示しています。また、黒枠で囲まれたデータポイントはSVMによって選ばれたサポートベクターを示しています。これらの点は、最適な決定境界を定義するのに用いられ、SVMの学習結果において重要な役割を果たします。

このように、SVMは2クラス分類だけでなく、多クラス分類にも利用することができます。その際には、一対他(One-vs-Rest)や一対一(One-vs-One)などの戦略を用いて、多クラス分類問題を複数の2クラス分類問題に分解します。この例では一対他の戦略を用いています。

この記事が気に入ったらサポートをしてみませんか?