サポートベクターマシンの基礎とカーネル法 | 分類アルゴリズム | Pythonによる機械学習を学ぶ

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

サポートベクターマシン(SVM)の基礎とカーネル法

サポートベクターマシン(SVM)は、教師あり学習の代表的な分類アルゴリズムです。異なるクラスのデータをできるだけ大きな余白(マージン)で分ける境界線を見つけることを目的とします。

SVMは、線形に分離できるデータだけでなく、カーネル法を使うことで非線形なデータにも対応できます。この記事では、SVMの基本概念、サポートベクター、マージン、カーネル法、Pythonでの実装について解説します。

SVMとカーネル法の仕組みを図で理解する

SVMとカーネル法の仕組みを図で理解する

SVMの基本概念

SVMは、2つのクラスを分ける境界線を探す分類手法です。2次元では直線、3次元では平面、それ以上の次元では超平面として表されます。

SVMでは、単にデータを分けるだけでなく、クラス間の余白であるマージンができるだけ大きくなるような境界を探します。

  • ハイパープレーン:データを分類するための境界
  • マージン:境界線と最も近いデータ点との距離
  • サポートベクター:境界線に最も近く、分類結果に大きな影響を与えるデータ点

サポートベクターとは

サポートベクターとは、分類境界に最も近いデータ点のことです。

SVMでは、すべてのデータ点が同じように重要なのではなく、境界付近にあるサポートベクターが分類境界の位置を決めるうえで重要な役割を持ちます。

マージン最大化の考え方

SVMは、クラス間のマージンを最大化するように分類境界を決定します。

マージンが大きいほど、未知のデータに対して安定した分類がしやすくなります。

考え方 内容
マージンが小さい 境界がデータに近く、誤分類しやすい
マージンが大きい 境界に余裕があり、汎化性能が高くなりやすい

カーネル法とは?

カーネル法は、線形に分離できないデータを扱うための方法です。

元の空間では直線で分けられないデータでも、高次元空間に変換することで、線形に分離できるようになる場合があります。

この変換を効率的に行う仕組みがカーネル法です。

代表的なカーネル

カーネル 特徴
線形カーネル 直線や平面で分離できるデータに向いている
多項式カーネル 曲線的な境界を表現できる
RBFカーネル 非線形なデータに広く使われる代表的なカーネル

PythonでのSVMの実装例

Pythonでは、scikit-learnSVCを使って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では、Cgammaなどのパラメータがモデルの性能に大きく影響します。

パラメータ 役割
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)

Cgammaを調整することで、データに合った分類境界を作ることができます。

SVMの特徴

特徴 内容
分類性能 高次元データでも高い性能を出しやすい
カーネル法 非線形なデータにも対応できる
解釈性 単純なモデルよりはやや分かりにくい
計算コスト 大規模データでは重くなることがある

SVMが向いている場面

  • 分類境界がはっきりしているデータ
  • 特徴量が多いデータ
  • 非線形な分類問題
  • 中小規模のデータセット

SVMを使う際の注意点

  • 特徴量のスケーリングを行うことが重要
  • Cgammaの調整が性能に大きく影響する
  • 大規模データでは学習に時間がかかる場合がある
  • カーネルの選択によって結果が変わる