SVMのソフトマージン完全ガイド:理論・実装・チューニングの実践

導入 — ソフトマージンとは何か

機械学習におけるサポートベクターマシン(SVM)は、クラスを分離する超平面を探す手法です。現実のデータはノイズや重なりを含むため、完全に分離可能な場合は稀です。そこで導入されるのが「ソフトマージン(soft margin)」の概念です。ソフトマージンは、誤分類やマージン違反を許容しつつ、モデルの複雑さ(マージン幅)と誤差のトレードオフを調整することで汎化性能を高めます。

ハードマージンとソフトマージンの違い

ハードマージンSVMはデータが線形分離可能であることを前提に、すべての訓練サンプルがマージン外または境界上に位置することを要求します。具体的には、y_i(w^T x_i + b) ≥ 1 を満たすことが必要です。これはノイズや外れ値がない理想的条件に対してのみ適用可能です。

一方ソフトマージンSVMは、スラック変数 ξ_i (ξ_i ≥ 0) を導入してマージン違反を許可します。制約は y_i(w^T x_i + b) ≥ 1 - ξ_i となり、合計の違反度に対してペナルティを課す形で最適化を行います。これにより実データでの頑健性が向上します。

ソフトマージンの数学的定式化(プライマル問題)

典型的なソフトマージンSVMのプライマル問題は次のようになります:

minimize   (1/2) ||w||^2 + C ∑i ξ_i

subject to   y_i(w^T x_i + b) ≥ 1 - ξ_i,   ξ_i ≥ 0   (i=1,...,n)

ここで C は正の定数で、マージン幅(||w||^2 を小さくすること)とトレーニング誤差(ξ_i の和)との間のトレードオフを制御します。C を大きくすると誤分類のペナルティが重くなり、ハードマージンに近づきます。C を小さくすると誤差を許容して比較的滑らかな境界を選びやすくなります。

双対問題とラグランジュ乗数の役割

多くのSVM実装は双対問題を解きます。ソフトマージンの双対問題ではラグランジュ乗数 α_i が導入され、次のようになります:

maximize   ∑i α_i - (1/2) ∑i,j α_i α_j y_i y_j K(x_i, x_j)

subject to   0 ≤ α_i ≤ C,   ∑i α_i y_i = 0

ここで K(x_i, x_j) はカーネル関数です(線形カーネルの場合は x_i^T x_j)。重要なのは、最終モデルはサポートベクタ(α_i > 0)によってのみ構成され、α_i がちょうど C に近いデータ点はマージン違反(誤分類や境界内に入った点)を示します。

ヒンジ損失と正則化の観点

ソフトマージンSVMは、ヒンジ損失とL2正則化を組み合わせたものと見なすことができます。つまり、目的関数 (1/2)||w||^2 + C ∑ max(0, 1 - y_i f(x_i)) と等価です。ここで f(x) = w^T x + b です。C の逆数は正則化係数に相当し、過学習とバイアスのトレードオフを制御します。

カーネルとソフトマージンの関係

カーネル法を併用することで、線形分離不可能なデータも高次元空間で線形に分離できる可能性が生まれます。代表的なカーネルには次のようなものがあります:

  • 線形カーネル:K(x, x') = x^T x'
  • 多項式カーネル:K(x, x') = (γ x^T x' + r)^d
  • RBF(ガウシアン)カーネル:K(x, x') = exp(-γ ||x - x'||^2)

ソフトマージンはカーネルSVMにも同じように適用でき、C とカーネルのハイパーパラメータ(γ など)を組み合わせて最適化する必要があります。カーネルとCのバランスがモデルの複雑さと汎化能を決定します。

最適化アルゴリズム(SMOなど)と計算コスト

SVM の二次計画問題は直接解くと計算コストが高い(O(n^3) の場合も)ため、実装では効率化手法が使われます。代表的な手法は Platt の SMO(Sequential Minimal Optimization)で、2つのαを同時に更新することで大規模データにも適用可能にしました。LibSVM や scikit-learn の SVM 実装はこうした最適化アルゴリズムを採用し、カーネルトリックやキャッシュ、ヒューリスティックで計算を高速化しています。

計算コストは一般にデータ数 n の二乗に近いオーダー(メモリやカーネル行列の扱いによる)になり得るため、数十万件規模のデータには注意が必要です。線形SVM(大量次元に有利なliblinearなど)や近似手法(ランダム特徴量や核近似)を検討します。

ハイパーパラメータ選定と評価

ソフトマージンで最も重要なのはCの選定です。一般的な実務手順は以下の通りです:

  • 標準化(平均0、分散1 など)を行う。スケーリングは SVM の性能に大きく影響する。
  • グリッドサーチやランダムサーチで C(とカーネルパラメータ)を交差検証で評価する。
  • クラス不均衡がある場合は class_weight='balanced' やサンプル重みを活用する。
  • 学習曲線をプロットして過学習・過小学習の傾向を確認する。

交差検証はデータの分割方法(層化など)に注意し、評価指標は用途に応じて正解率だけでなく F1 スコアやROC AUC を使い分けます。

実践上のトラブルシューティングとベストプラクティス

  • 特徴量のスケールを揃えること:SVMは距離に敏感なので、標準化や正規化は必須です。
  • 外れ値の影響:C を大きくすると外れ値に引っ張られやすいため、外れ値処理やロバストスケーリングが効果的です。
  • クラス不均衡:単純な精度では評価が偏るため、重み付けやリサンプリングを検討します。
  • 解釈性:サポートベクタの数が多いとモデルが複雑で、解釈しにくくなる。特徴選択や線形カーネルの検討で可読性を上げられます。
  • 確率的出力:SVM は本来確率を出さない。Platt のスケーリングなどで確率化が可能だが、信頼度の解釈には注意が必要です。

scikit-learn での実装メモ

Python の scikit-learn では sklearn.svm.SVC(カーネルSVM)や sklearn.svm.LinearSVC(線形SVM)がよく使われます。例:

from sklearn.svm import SVC
clf = SVC(kernel='rbf', C=1.0, gamma='scale')
clf.fit(X_train, y_train)

主な注意点:

  • X は標準化する(StandardScalerなど)。
  • LinearSVC は内部で異なる最適化を用い、パラメータのスケーリングが異なることがある(Cの意味が若干変わる)。
  • SVC は probability=True とすると Platt スケーリングを行い predict_proba を提供するが、学習コストが上がる。

ソフトマージンの直感的理解と現代的解釈

直感的には、ソフトマージンは「少しくらい間違ってもよい代わりに、より広い『安全域(マージン)』を確保する」アプローチです。正則化の観点では、マージン最大化(小さい ||w||)と誤差の最小化(小さい ξ_i)を同時に行うことで過学習を抑制します。

現代の視点では、ソフトマージンSVMは一般的な正則化付き損失最小化フレームワークの一例と見なせます。ヒンジ損失 + L2 正則化という明確な構造を持ち、他の損失(ロジスティック回帰の対数損失など)と比べてマージンに着目した分類境界を提供する点が特徴です。

まとめ — いつソフトマージンを選ぶべきか

ノイズや重なりがある実データに対しては、ソフトマージンSVMが標準的かつ強力な選択肢です。カーネルを用いれば非線形分離問題にも対応可能です。重要なのは適切な前処理(スケーリング)、ハイパーパラメータチューニング(C とカーネルパラメータ)、および計算コストを考慮した実装選定です。特に大規模データでは線形SVMや近似手法の検討が必要になります。

参考文献