SVM(サポートベクターマシン)とは|原理・カーネル・C・γの実務チューニング完全ガイド
SVMとは — 概要
SVM(Support Vector Machine、サポートベクターマシン)は、1990年代にVapnikらによって発展した機械学習手法の一つで、主に二項分類問題で高い性能を示すモデルです。SVMの核となる考え方は「マージンの最大化」であり、クラスを分離する超平面(decision boundary)を、訓練データとの余裕(マージン)が最大になるように選びます。マージンを決定するデータ点が「支持ベクトル(support vectors)」と呼ばれ、これらのみが最終的な決定境界に影響を与えます。
基本原理 — マージン最大化と最適化問題
最も単純な設定は線形分離可能な場合です。入力ベクトル x とラベル y ∈ {+1, -1} に対して、線形分類器はパラメータ w とバイアス b により決定されます。SVMは下記の厳密制約付き最適化問題を解くことで、最大マージンの超平面を求めます。
- 目的: 1/2 ||w||^2 を最小化
- 制約: ∀i, y_i (w·x_i + b) ≥ 1
この式は、正しく分類されるだけでなく各サンプルが超平面から少なくとも「1」だけ離れるように強制することで、マージン(= 2/||w||)を最大化することと同値になります。数学的には凸な二次計画(Quadratic Programming, QP)問題です。
支持ベクトルと双対問題
この最適化はラグランジュ乗数を導入して双対問題に変換できます。双対形式ではパラメータ w は訓練サンプルの線形結合で表現され、各サンプルに対応するラグランジュ乗数 α_i(≥ 0)が解の重要な役割を担います。双対問題を解くと、多くの α_i は0になり、非ゼロとなるものが「支持ベクトル」です。支持ベクトルのみが最終モデル(決定境界)に寄与するため、モデルは訓練データの一部に依存します。
双対問題の利点の一つは、入力ベクトル間の内積のみを用いる点で、これがカーネルトリックを可能にします(後述)。
カーネルトリック(非線形分離への拡張)
実世界の多くの問題は線形分離不可能です。SVMは「カーネルト関数」を用いることで、入力空間を高次元(場合によっては無限次元)の特徴空間に写像し、そこで線形分離を行うアプローチを取ります。カーネルを使う最大の利点は、明示的に高次元写像を計算しなくても、入力間のカーネル(内積)K(x_i, x_j) を計算するだけで双対問題を解ける点です。
- 代表的なカーネル: 線形 (K(x,y)=x·y)、多項式 (polynomial)、RBF/Gaussian (exp(-γ||x-y||^2))、シグモイド (tanh)
- カーネルの選択により非線形な境界を柔軟に表現可能
- ただし、カーネルは正定値(Mercer の定理に従う)である必要がある
ソフトマージンとハイパーパラメータ C, γ
現実にはデータにノイズや重なりがあるため、厳密な線形分離を要求すると過学習や不可能な場合が多いです。そこで「ソフトマージン」SVMではスラック変数 ξ_i (≥0) を導入し、誤分類を一部許容しつつマージンと誤分類のトレードオフを制御します。最適化は以下のようになります。
- 目的: 1/2 ||w||^2 + C Σ_i ξ_i を最小化
- 制約: ∀i, y_i (w·x_i + b) ≥ 1 − ξ_i, ξ_i ≥ 0
ここで C は正則化パラメータで、誤分類コストをどれだけ重視するかを決めます。Cが大きいほど誤分類が許されにくく、複雑な境界を取る傾向があります。RBFカーネルなどでは γ(ガンマ)がカーネルの影響範囲を決め、γ が大きいと局所的なフィッティングになりやすく小さいとより平滑な境界になります。実務では C と γ のグリッドサーチ+交差検証が基本です。
損失関数との関係(ヒンジ損失)
SVMはヒンジ損失(hinge loss)に基づく学習とも見なせます。線形分類器 f(x)=w·x+b に対するヒンジ損失は max(0, 1 − y f(x)) であり、ソフトマージンSVMの目的は 1/2 ||w||^2 + C Σ hinge_loss を最小化することに対応します。ヒンジ損失は凸であるため、最適化は局所解の問題がなく安定しています。
計算コストと実装上の工夫
標準的な二次計画(QP)ソルバーはサンプル数 n に対して O(n^2) 〜 O(n^3) の計算コストやメモリが必要になる場合があり、大規模データには不向きです。これに対して以下の工夫があります。
- SMO(Sequential Minimal Optimization): ペアごとに解析的に更新することで大規模データに対して効率的
- LIBSVM(Chang & Lin): カーネルSVMの代表的実装でSMOに基づく
- LIBLINEAR: 線形SVMに特化し、非常に大規模な線形問題に高速に対応
- 確率的勾配法(SGD)や近似カーネル手法(ランダムフーリエ特徴量など)
マルチクラス化と回帰(SVR)
SVMは本来二クラス分類器ですが、実務ではマルチクラス問題へ拡張して使われます。一般的な戦略は以下の通りです。
- One-vs-Rest(OvR): 各クラス対その他で二値SVMを学習
- One-vs-One(OvO): クラスの組み合わせごとにSVMを学習し多数決で決定
- 直接的な多クラスSVMの最適化手法も提案されている(実装はやや複雑)
また、回帰問題に対してはSVR(Support Vector Regression)があり、ε-不感帯(ε-insensitive loss)を使って誤差を許容しつつ汎化性能を高めます。
SVMの強みと弱み
- 強み
- 高次元・スパースデータ(例: テキスト分類)に強い
- ヒンジ損失と凸最適化により解が一意で安定
- カーネルで非線形問題にも柔軟に対応可能
- 少数の支持ベクトルによりモデルがコンパクトになる場合がある
- 弱み
- 大規模データセットでは学習コストが高い(ただし線形SVMや近似法で対処可)
- ハイパーパラメータ(C, γ, カーネル)に敏感でチューニングが必要
- 出力は距離やスコアであってそのままでは確率ではない(Platt scaling等で変換可能)
実務での使い方(チェックリスト)
- データの前処理: SVMは特徴のスケーリングに敏感(標準化や正規化を必ず行う)
- 特徴選択/次元削減: 高次元の場合でも有効だがノイズ特徴は性能悪化の原因となる
- カーネル選択: RBFがデフォルトの良い出発点。線形が十分なら計算効率で有利
- ハイパーパラメータ探索: グリッドサーチ+クロスバリデーションが基本
- クラス不均衡: 重み付きSVM(class_weight)やサンプリングで対処
- 確率出力が必要なら Platt scaling や isotonic regression を検討
代表的な実装とツール
実装としては scikit-learn の SVC / LinearSVC、LIBSVM、LIBLINEAR が広く用いられます。scikit-learn では SVC(kernel='rbf', C=1.0, gamma='scale') のように簡単に実験できます。大規模で線形モデルが適している場合は LIBLINEAR(scikit-learn の LinearSVC の内部実装の一部にも使用)を選ぶとよいでしょう。
まとめ
SVMは「最大マージン」の原理に基づく堅牢な分類器で、特に高次元かつ特徴がスパースな問題に強い一方、大規模データやハイパーパラメータのチューニングが課題となります。カーネルトリックにより非線形問題にも対応でき、理論的に整備された凸最適化枠組みの下で信頼性の高い結果を出すことができます。実務ではデータのスケーリング、適切なカーネル選択、交差検証によるパラメータ探索が重要です。
参考文献
- Vapnik, V. N., "The Nature of Statistical Learning Theory"(代表的な著作)
- Cortes, C. & Vapnik, V. (1995). "Support-vector networks." Machine Learning.(SVMの古典論文)
- LIBSVM: A library for support vector machines(Chang & Lin)
- scikit-learn: Support Vector Machines — ドキュメント(使い方・実装上の注意)
- Wikipedia: Support-vector machine(概説と参考文献一覧)
- Chang, C.-C. & Lin, C.-J., "LIBSVM: A Library for Support Vector Machines — Users' Guide"


