サポートベクターマシン(SVM)の基礎とカーネル法
サポートベクターマシン(SVM)は、教師あり学習の代表的な分類アルゴリズムです。異なるクラスのデータをできるだけ大きな余白(マージン)で分ける境界線を見つけることを目的とします。
SVMは、線形に分離できるデータだけでなく、カーネル法を使うことで非線形なデータにも対応できます。この記事では、SVMの基本概念、サポートベクター、マージン、カーネル法、Pythonでの実装について解説します。
SVMとカーネル法の仕組みを図で理解する

SVMの基本概念
SVMは、2つのクラスを分ける境界線を探す分類手法です。2次元では直線、3次元では平面、それ以上の次元では超平面として表されます。
SVMでは、単にデータを分けるだけでなく、クラス間の余白であるマージンができるだけ大きくなるような境界を探します。
- ハイパープレーン:データを分類するための境界
- マージン:境界線と最も近いデータ点との距離
- サポートベクター:境界線に最も近く、分類結果に大きな影響を与えるデータ点
サポートベクターとは
サポートベクターとは、分類境界に最も近いデータ点のことです。
SVMでは、すべてのデータ点が同じように重要なのではなく、境界付近にあるサポートベクターが分類境界の位置を決めるうえで重要な役割を持ちます。
マージン最大化の考え方
SVMは、クラス間のマージンを最大化するように分類境界を決定します。
マージンが大きいほど、未知のデータに対して安定した分類がしやすくなります。
| 考え方 | 内容 |
|---|---|
| マージンが小さい | 境界がデータに近く、誤分類しやすい |
| マージンが大きい | 境界に余裕があり、汎化性能が高くなりやすい |
カーネル法とは?
カーネル法は、線形に分離できないデータを扱うための方法です。
元の空間では直線で分けられないデータでも、高次元空間に変換することで、線形に分離できるようになる場合があります。
この変換を効率的に行う仕組みがカーネル法です。
代表的なカーネル
| カーネル | 特徴 |
|---|---|
| 線形カーネル | 直線や平面で分離できるデータに向いている |
| 多項式カーネル | 曲線的な境界を表現できる |
| RBFカーネル | 非線形なデータに広く使われる代表的なカーネル |
PythonでのSVMの実装例
Pythonでは、scikit-learnのSVCを使ってSVMを実装できます。
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# Irisデータセットを読み込み
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.3,
random_state=42
)
# SVMモデルの作成(RBFカーネル)
svm_model = SVC(kernel='rbf')
# モデルの学習
svm_model.fit(X_train, y_train)
# テストデータで予測
y_pred = svm_model.predict(X_test)
# 正解率を評価
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.3f}")
このコードでは、Irisデータセットを使い、RBFカーネルを指定したSVMモデルで分類を行っています。
SVMの主なパラメータ
SVMでは、Cやgammaなどのパラメータがモデルの性能に大きく影響します。
| パラメータ | 役割 |
|---|---|
C |
誤分類をどの程度許容するかを調整する |
gamma |
RBFカーネルにおけるデータ点の影響範囲を調整する |
kernel |
使用するカーネルの種類を指定する |
Cパラメータの考え方
Cは、誤分類に対する厳しさを調整するパラメータです。
- Cが大きい:誤分類を強く避けるため、複雑な境界になりやすい
- Cが小さい:多少の誤分類を許容し、広いマージンを取りやすい
gammaパラメータの考え方
gammaは、RBFカーネルで1つのデータ点がどの範囲まで影響するかを決めるパラメータです。
- gammaが大きい:狭い範囲に強く影響し、複雑な境界になりやすい
- gammaが小さい:広い範囲にゆるやかに影響し、単純な境界になりやすい
パラメータを指定したSVMの例
svm_model = SVC(
kernel='rbf',
C=1.0,
gamma='scale'
)
svm_model.fit(X_train, y_train)
Cやgammaを調整することで、データに合った分類境界を作ることができます。
SVMの特徴
| 特徴 | 内容 |
|---|---|
| 分類性能 | 高次元データでも高い性能を出しやすい |
| カーネル法 | 非線形なデータにも対応できる |
| 解釈性 | 単純なモデルよりはやや分かりにくい |
| 計算コスト | 大規模データでは重くなることがある |
SVMが向いている場面
- 分類境界がはっきりしているデータ
- 特徴量が多いデータ
- 非線形な分類問題
- 中小規模のデータセット
SVMを使う際の注意点
- 特徴量のスケーリングを行うことが重要
Cやgammaの調整が性能に大きく影響する- 大規模データでは学習に時間がかかる場合がある
- カーネルの選択によって結果が変わる