サポートベクターマシンとは
Le サポート ベクター マシン (SVM) これらは非常に強力な教師あり ML アルゴリズムです 分類と回帰のために。中心的なアイデアは、超平面 それ でクラスを区切ります 最大マージン 可能。 The points closest to the hyperplane, 呼ばれた サポートベクター、決定的な境界を定義するのは、すべての人々です。 残りのデータは超平面の位置とは無関係です。
この特性により、SVM は特に堅牢になります。モデルはわずかな依存性のみに依存します。 トレーニング データのサブセット。さらに、おかげで、 カーネルトリック、SVM は次のことができます。 データを高次元空間に投影することで非線形分離を処理します。 直線的に分離可能。
この記事で学べること
- 超平面と最大マージンの概念
- ハード マージンとソフト マージン: フォールト トレランス
- 非線形分離のためのカーネル トリック
- C およびガンマのハイパーパラメータ: 調整方法
- 1 対残りのマルチクラス SVM
- scikit-learnによる実践的な実装
最大マージンとサポートベクター
バイナリ分類問題では、2 つのクラスを分離できる超平面が無数に存在します。 SVM は、 最大マージン: 超平面と点の間の距離 各クラスの一番近いところ。マージンを最大化するとモデルの一般化が向上します 以前は見られなかったデータについて。ちょうど余白上にある点は i サポートベクター.
L'ハードマージン SVM では、ポイントがマージン内または間違った側に位置しないことが必要です。 これは完全に分離可能なデータでのみ機能します。の ソフトマージン SVM の導入 パラメータ C これは、マージンの最大化と違反の最小化の間のトレードオフを制御します。 C が高いと違反に厳しいペナルティが課され (マージンが狭い)、C が低いとより多くのエラーが許容されます。 (マージンが大きく、より正則化されます)。
from sklearn.svm import SVC, LinearSVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, classification_report
from sklearn.pipeline import Pipeline
# Dataset
data = load_breast_cancer()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Pipeline con scaling (FONDAMENTALE per SVM!)
svm_pipeline = Pipeline([
('scaler', StandardScaler()),
('svm', SVC(kernel='linear', C=1.0, random_state=42))
])
svm_pipeline.fit(X_train, y_train)
y_pred = svm_pipeline.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred):.3f}")
print(f"\n{classification_report(y_test, y_pred, target_names=data.target_names)}")
# Numero di support vectors per classe
svm_model = svm_pipeline.named_steps['svm']
print(f"Support vectors per classe: {svm_model.n_support_}")
print(f"Totale support vectors: {sum(svm_model.n_support_)} su {len(X_train)} campioni")
カーネルのトリック: 非線形分離
データが線形分離できない場合、 カーネルトリック データを 1 つにプロジェクト化する それらが分離可能となる高次元空間。重要なのは、この投影が起こるということです カーネル関数を通じて暗黙的に、座標を明示的に計算する必要はありません。 高次元空間。
最も一般的なカーネルは次のとおりです。 RBF (ラジアル基底関数)最も汎用性の高い、 点間の類似性をガウスとして測定します。 多項式、なんてキャッチだ ある程度までの特徴間の相互作用。 シグモイド、ニューラルネットワークに似ています 1つのレベル。カーネルの選択は、データのジオメトリによって異なります。
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.datasets import make_moons
import numpy as np
# Dataset non linearmente separabile
X, y = make_moons(n_samples=500, noise=0.2, random_state=42)
# Confronto kernel
kernels = {
'linear': {'svm__C': [0.1, 1, 10]},
'rbf': {'svm__C': [0.1, 1, 10], 'svm__gamma': ['scale', 'auto', 0.1, 1]},
'poly': {'svm__C': [0.1, 1, 10], 'svm__degree': [2, 3, 4]}
}
for kernel, params in kernels.items():
pipeline = Pipeline([
('scaler', StandardScaler()),
('svm', SVC(kernel=kernel, random_state=42))
])
grid = GridSearchCV(pipeline, params, cv=5, scoring='accuracy', n_jobs=-1)
grid.fit(X, y)
print(f"Kernel {kernel:<8s} - Best accuracy: {grid.best_score_:.3f}")
print(f" Best params: {grid.best_params_}")
ハイパーパラメータ調整
SVM には 2 つの重要なハイパーパラメータがあります。 C (正則化) e 範囲 (RBF およびポリ カーネルの場合)。 C マージンとエラーのトレードオフを確認します。C の値が高いと、次のことが求められます。 各トレーニング ポイントを正しく分類するため (過学習のリスク)、低い値の方が許容性が高くなります。 誤差が大きくなる(アンダーフィッティングのリスク)。
範囲 各サポート ベクトルの影響範囲を制御します。ガンマを高くすると、 モデルは単一点 (過学習) に敏感であり、ガンマが低いと決定境界がより大きくなります。 滑らか(フィッティング不足)。 C とガンマの最適な組み合わせは次のように求められます。 グリッド検索 o ランダム検索 相互検証を使用します。
必須のスケーリング: SVM は機能のスケールに影響されます。機能の場合 0 から 1 まで、もう 1 つは 0 から 1000 まで変化し、2 番目の値が距離の計算を支配します。常に使用する SVM の前の StandardScaler または MinMaxScaler。これは、SVM で最もよくある間違いです。
マルチクラス SVM と回帰
SVM はネイティブではバイナリですが、scikit-learn は戦略を通じてマルチクラス分類をサポートしています。 1 対残り (OvR): N クラスの場合、N 個の分類器がトレーニングされ、それぞれが 1 つを区別します 他のすべてのクラスから。予測されたクラスは、最も高いスコアを持つクラスです。
回帰については、 SVR (サポートベクトル回帰) 同じ原理を使用しますが、 最も多くの点を含むチューブ (イプシロンチューブ)。チューブの外側の点がサポートになります ベクトル。ここでもカーネルのトリックにより非線形回帰が可能になります。
SVM を使用する場合
SVM は、大規模なスペースで中規模のデータセット (最大数万のサンプル) に優れています。 高次元で、クラスが明確なマージンで十分に分離されている場合。データセットにはあまり適していません 非常に大きい (トレーニングの複雑さは二次関数的にスケールされる)、非常にノイズの多いデータセットの場合 校正された確率が必要な場合 (ネイティブ SVM は確率を生成しないため、さらなる校正が必要です)。
重要なポイント
- SVM はクラス間のマージンが最大の超平面を見つけます
- サポート ベクターは、決定境界を定義する点です
- カーネル トリックは、高次元空間での明示的な計算を行わずに非線形分離を処理します。
- C はマージンとエラーのトレードオフを制御し、ガンマはサポート ベクターの影響の半径を制御します。
- SVM を使用する前に機能のスケーリングが必須です
- 相互検証を使用したグリッド検索は、最適なハイパーパラメータを見つけるための標準的な方法です







