SVMとは
Support Vector Machine / サポートベクターマシン
クラス間のマージンを最大化する境界を見つけることで分類・回帰する機械学習モデル
ひとことで言うと
データを2つのグループに、できるだけ余裕を持って分ける境界線を見つけるAIモデル。
概要
SVM(Support Vector Machine、サポートベクターマシン)とは、異なるクラスのデータ点を隔てる境界(超平面)のうち、各クラスの最も近いデータ点(サポートベクター)との距離(マージン)が最大になるものを求める機械学習モデル。 線形に分離できないデータに対しては、カーネル関数を用いてデータをより高次元の空間へ写像し、その空間上で線形分離可能にする「カーネルトリック」という手法が使われる。 少量〜中規模のデータで、特徴量の次元数が多いタスクに強いとされ、深層学習が普及する以前は分類タスクの代表的な手法として広く使われていた。
背景
単純な線形分類器は、境界の引き方によって未知データへの汎化性能が大きく変わってしまうという課題があった。 SVMは、マージンを最大化する境界を選ぶことで、学習データに対する汎化性能をより安定させるために考案された。
歴史
1963年: VapnikとChervonenkisが、線形分離可能なデータに対するマージン最大化の考え方を提案。 1992年: Boserらが、カーネルトリックを導入し非線形分離が可能なSVMを提案。 1995年: CortesとVapnikが、きれいには分離できないデータにも対応するソフトマージンSVMを発表し、現在広く使われるSVMの形式を確立。
アーキテクチャ
境界(超平面)からの距離が最も近いデータ点(サポートベクター)とのマージンを最大化するよう、境界のパラメータを最適化問題として解く。 線形分離できないデータには、線形カーネル・多項式カーネル・RBF(動径基底関数)カーネル等を用いて、データをより高次元の空間へ暗黙的に写像し、その空間上で線形分離する。 きれいには分離できないデータにも対応するため、誤分類をある程度許容しつつマージンを最大化するソフトマージンの定式化が一般的に使われる。
ワークフロー
カーネル関数と正則化パラメータ(C)を選択 → マージン最大化の最適化問題を解きサポートベクターを特定 → 学習済みモデルで新しいデータ点がどちら側にあるかを判定して分類する。
コード例
scikit-learnでSVMを学習する
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = SVC(kernel="rbf", C=1.0)
model.fit(X_train, y_train)
print(model.score(X_test, y_test))利点
- マージン最大化に基づく理論的な裏付けがあり、少量のデータでも安定した汎化性能を得やすい
- カーネルトリックにより、線形分離できない複雑なデータにも対応できる
- 特徴量の次元数がデータ数より多い高次元データでも比較的良好に機能する
欠点
- 学習データ数が非常に大きい場合、計算コストが急激に増加し拡張性に課題がある
- カーネル関数の種類やハイパーパラメータの選び方が性能を大きく左右し、チューニングに専門知識を要する
- 確率的な出力(クラス確率)を直接は得られず、追加の較正が必要になる場合がある
比較
関連用語
よくある質問
SVMのカーネルはどう選ぶ?
線形分離できそうなデータには線形カーネル、非線形な関係が予想されるデータにはRBFカーネルを試すのが一般的な出発点になる。
SVMは今も使われている?
深層学習の普及後も、データ数が少なく次元数の多いタスクや、解釈性より精度を重視する古典的な分類問題では選択肢の1つとして使われている。