機械学習を学び始めると、必ず耳にするのがサポートベクターマシン(SVM)です。高い精度が期待できる一方で、マージンやカーネルトリックといった独特の考え方が多く、最初の印象で「少しむずかしそう」と感じる人も多いはずです。
本記事では、SVMのしくみをできるだけ直感的に理解できるように整理し、どんな場面で力を発揮するのか、そして実際にPython(scikit-learn)でどのように扱うのかを順を追って解説します。読み終えるころには、SVMを一つの“専門的な理論”ではなく、自分でも実装して試せる実践的な手法として捉えられるようになるでしょう。
📖この記事のポイント
- SVMは、少量かつ高次元のデータに強い教師あり学習アルゴリズムで、分類と回帰の両方に使える!
- マージン最大化とサポートベクトルの考え方により、未知データに強い安定した決定境界を作れる!
- カーネルトリックとC・γの調整によって、非線形なデータにも柔軟に対応できるが、設定を誤ると過学習しやすい!
- 大規模データや高い解釈性が必要な場面はやや苦手だが、テキスト分類・医療データ・異常検知など多くの実務で今も活躍している!
- たった2時間の無料セミナーで会社に依存しない働き方&AIスキルを身につけられる!
- 今すぐ申し込めば、すぐに月収10万円UPを目指すための超有料級の12大特典も無料でもらえる!
\ 累計受講者10万人突破 /
無料特典を今すぐ受け取るSVMとは?特徴と位置づけを整理する
サポートベクターマシン(SVM)は、教師あり学習の中で特に「分類」に強いアルゴリズムとして知られています。比較的少ないデータでも高い精度を出しやすく、特徴量が多い(高次元の)データにも安定して使える点が大きな特徴です。近年は深層学習の存在感が増していますが、SVMは「少データ × 高次元」という条件で頼りになる手法として、今でも実務や教育の現場で使われ続けています。
SVMの基本的な役割とできること
SVMはもともと「2クラス分類」を前提に設計されましたが、その後の拡張により、現在では分類と回帰のどちらにも使える実用的な手法へと発展しています。とくにデータ量が十分でない状況や、特徴量が多いベクトルデータを扱う場面で、安定した性能を出しやすいのが強みです。
- 少ないデータでも性能が安定しやすい
- 特徴量が多い(高次元)データとの相性が良い
- 分類だけでなく回帰(SVR)にも対応できる
- 線形・非線形の両方のパターンを扱える
SVMが利用される典型的な場面
| 用途・状況 | 説明 |
|---|---|
| 分類問題 | 2クラス・多クラス問わず安定した精度を出しやすい |
| 回帰(SVR) | 連続値の予測に利用できる |
| 高次元データ | テキストや画像のような特徴量が多いデータに強い |
| 少データ環境 | 充分なデータがない状況でも性能が落ちにくい |
SVMの仕組みを直感的に理解する
SVMが安定した性能を発揮する理由は、「データを分ける境界をどこに引くか」を独自の考え方で決めている点にあります。単に「クラスを分離できる境界線」を探すのではなく、「多少ゆらいでも間違えにくい境界線」を選ぶことで、未知のデータに対する強さが生まれます。この“ゆらぎへの強さ”こそが、SVMの本質です。
2次元平面上に2クラスの点が散らばっている状況をイメージすると、SVMは「クラスを分ける直線」だけでなく、その直線と各クラスの点との余白まで含めて最適な位置を決めている、と考えると理解しやすくなります。
マージン最大化という発想
SVMでは、クラス同士の間にできる“余白”をマージンと呼びます。マージンが広いほど、境界線が少し動いても誤分類が起こりにくくなります。SVMはこのマージンをできるだけ広くする境界線を選ぶことで、他のアルゴリズムと比べて汎化性能(未知データへの強さ)が高くなりやすいという特徴があります。
- マージン=クラス間の余白
- マージンが広いほど、多少のノイズに対しても頑健になる
- SVMは“とりあえず分ける”のではなく“最も余裕のある分け方”を選ぶ
サポートベクトルが境界を決める理由
境界線に最も近いデータ点をサポートベクトルと呼びます。実際の分類境界は、このサポートベクトルの位置関係によってほぼ決まります。境界から遠くにある点は、境界線の位置に大きな影響を与えません。
この性質により、SVMは「すべてのデータ」を均等に見ているというより、「境界付近の重要なデータだけを見ている」とも解釈できます。必要最低限の情報で強い分類器を作れる点が、SVMの面白い特徴です。
ソフトマージンとCの役割
現実のデータは完全には分離できないことが多く、「1点も誤分類しない境界線」を探そうとすると、かえって過学習を招いてしまいます。そこでSVMでは、多少の誤分類を許しながらマージンを確保する「ソフトマージン」という仕組みが使われます。
この誤分類許容度を調整するのがパラメータCです。Cが大きいほど誤分類を許さず境界線が厳しくなり、小さいほど柔らかく、大まかな境界を許容するようになります。
| C の値 | 挙動 | 特徴 |
|---|---|---|
| 大きい | 誤分類をほとんど許さない | 境界が狭くなり、訓練データには高精度だが過学習しやすい |
| 小さい | ある程度の誤分類を許す | 境界が広くなり、ノイズに強く汎化性能が高まりやすい |
実務では、まず中くらいのC(例:1.0)を基準にして、性能を見ながら少しずつ大きく/小さく動かし、過学習と汎化性能のバランスを探ることが多いです。
非線形を扱うためのカーネルトリック
SVMが単なる「直線で分ける手法」ではなく、複雑なデータにも対応できる理由が、このカーネルトリックにあります。データが線形では分けられない形をしていても、特徴量をより高次元の空間へ移すことで、直線(または平面)で分類できるように変換してしまうのが、この仕組みのポイントです。
高次元に写像する発想とは?
例えば、円状にデータが広がっている場合、2次元平面上ではどうやっても「直線」では分離できません。しかし、このデータに「半径」などの特徴を追加して3次元へ移すと、“上方向に持ち上がる形”になり、ある平面で切り分けられるようになります。
カーネルトリックは、この「高次元に持ち上げる操作」をわざわざ明示的に計算するのではなく、内積(類似度)の計算だけで済むようにしたテクニックです。これにより、計算量を抑えながら高次元空間での分離を実現できます。
よく使われるカーネルと使いどころ
- RBFカーネル:迷ったらこれ。多くのデータに広く対応できる汎用的な選択肢
- 線形カーネル:特徴量が多いときに安定。テキスト分類など高次元だがほぼ線形な場合に有効
- 多項式カーネル:非線形だが、次数などパラメータで挙動をコントロールしやすい
scikit-learnでは、分類用の SVC クラスで kernel="rbf" がデフォルトとなっており、実務でもまずRBFカーネルを試してから、線形カーネルや多項式カーネルに切り替える、という流れがよく使われます。
γ(ガンマ)が境界線に与える影響
RBFカーネルなど一部のカーネルでは、γ(ガンマ)というパラメータが登場します。γは、おおざっぱに言うと「一つ一つのサンプルがどれくらい局所的に効くか」を決める値で、境界線の細かさに直結します。
| γ の値 | 境界線の特徴 | 注意点 |
|---|---|---|
| 大きい | 境界が細かく曲がる | 訓練データには高精度だが、過学習しやすい |
| 小さい | 境界がなだらかになる | 複雑な構造を捉えにくく、精度が頭打ちになりやすい |
scikit-learnでは gamma="scale" が自動設定のデフォルトで、まずはこの設定を基準に使い、必要に応じて0.01〜0.1あたりの範囲で調整していく、という進め方が現実的です。
SVMのメリット・デメリット
SVMは古典的な手法の中でも安定した評価を持つアルゴリズムですが、あらゆる場面で万能というわけではありません。どんな手法にも得意・不得意があり、SVMも例外ではありません。
メリット
- 少量データで高精度を出しやすい
- 高次元データに強く、ベクトル化された特徴と相性が良い
- マージン最大化により、過学習をある程度抑えやすい
- カーネルトリックにより、線形・非線形の両方に対応できる
デメリット
- 大規模データでは時間とメモリを消費しやすく、学習コストが高くなりがち
- C や γ、カーネルの選択など、パラメータ調整が難しい
- 特徴量のスケーリング(標準化など)がほぼ必須
- 決定木系モデルに比べて、「なぜその予測になったのか」の解釈性が低い
使うべきケース・避けるべきケース
| 状況 | SVMは向いている? | 理由 |
|---|---|---|
| データが少ない | ◎ | 少量でも高精度を出しやすい |
| 高次元データ | ◎ | テキストや画像などベクトル化データと相性が良い |
| 大量データ | △〜× | 学習コストが大きく、他のアルゴリズムの方が現実的なことも多い |
| 複雑な非線形 | ○ | RBFカーネルなどで対応可能。ただしパラメータ調整は慎重に行う必要あり |
| 解釈性重視 | △ | 決定木系やルールベースモデルの方が有利 |
実務では、まずロジスティック回帰や決定木などシンプルなモデルを試し、それらで性能が頭打ちになったときに、SVMを次の候補として検討する、という使い方が多いです。
他アルゴリズムとの比較でわかるSVMの立ち位置
SVMを選ぶべきかどうかは、他の代表的なアルゴリズムと比較してみるとイメージしやすくなります。
ロジスティック回帰との比較
- ロジスティック回帰:軽量で実装も解釈もシンプルだが、基本的には線形な決定境界しか表現できない
- SVM:カーネルを活用することで非線形境界にも対応でき、より高い表現力を持つ
「まずロジスティック回帰でざっくり試してみて、決定境界が明らかに非線形でありそうならSVMも検討する」という流れはよく取られるアプローチです。
決定木・ランダムフォレストとの比較
- 決定木:ルールがそのままツリー構造で可視化でき、解釈性が高い一方で過学習しやすい
- ランダムフォレスト:多数の決定木を組み合わせることで精度と安定性が増すが、高次元データでは学習・予測コストが大きくなりやすい
- SVM:高次元データに強く、適切なハイパーパラメータ調整を行えば汎化性能が安定しやすい
ニューラルネットとの比較
| 項目 | SVM | ニューラルネット |
|---|---|---|
| 必要データ量 | 少ないデータでも使いやすい | 多量の学習データが必要になりやすい |
| 計算負荷 | 中程度(データ量が増えると重くなる) | 大きい(パラメータ数も多い) |
| 非線形対応 | カーネル手法で実現 | 多層構造(深い層)で実現 |
| 学習の安定性 | ハイパーパラメータ次第だが比較的安定 | ネットワーク設計や最適化手法に大きく依存 |
深層学習が得意とするような大規模データ・複雑なパターンではニューラルネットが有利ですが、データがそこまで多くない場面では、SVMの方が導入しやすく、安定した性能を得られることも多くあります。
Pythonで学ぶSVMの実装とパラメータ調整
ここからは、scikit-learnを使ったSVMの基本的な実装手順と、C・カーネル・γといったハイパーパラメータの扱い方を見ていきます。
分類(SVC)の基本フロー
SVMで分類を行うときの典型的な流れは、以下のようになります。
- 特徴量の標準化(スケーリング)の実施
- カーネル(kernel)の選択(まずは RBF から)
- C や γ の初期値の設定
- モデルの学習と、ホールドアウトやクロスバリデーションによる精度評価
具体的なコード例として、IrisデータセットをSVMで分類する場合を見てみましょう。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
# データの読み込み
iris = load_iris()
X = iris.data
y = iris.target
# 学習用とテスト用に分割(層化サンプリング)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# スケーリング + SVM をまとめたパイプライン
pipeline = Pipeline([
("scaler", StandardScaler()),
("svc", SVC(kernel="rbf", C=1.0, gamma="scale"))
])
# モデル学習
pipeline.fit(X_train, y_train)
# 予測と精度評価
y_pred = pipeline.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))Pipeline を使うことで、「標準化 → SVM」という処理をひとまとめにでき、ハイパーパラメータ探索時にも扱いやすくなります。また、scikit-learnでは kernel="rbf" と gamma="scale" がRBFカーネルの標準的な設定としてよく使われます。
C・kernel・gamma の調整ポイント
精度をさらに高めたいときは、C・kernel・gamma を少しずつ調整していきます。役割を整理すると次のようになります。
- C:誤分類をどれだけ許すか(大きいほど厳しく、小さいほどゆるやか)
- kernel:決定境界の形(線形か、非線形か、どの程度の柔軟性か)
- gamma:RBFなどのカーネルで、境界の細かさ(大きいほど局所的・過学習寄り、小さいほどなだらか)
最初の一歩としては、「RBFカーネル+C=1.0+gamma=”scale”」を基準にし、Cやγを1桁ずつ大きく/小さく動かしながら、バリデーションデータの精度がどう変わるかを観察するのが現実的です。
GridSearchCV の利用
ハイパーパラメータを体系的に調整したい場合は、GridSearchCV を用いると便利です。あらかじめ候補の値をいくつか決めておき、その組み合わせを総当たりで試してくれます。
| 項目 | 典型的な範囲 | 目的 |
|---|---|---|
| C | 0.1, 1, 10, 100 | 境界の厳しさ(誤分類許容度)の調整 |
| γ | 0.001–1 | 境界の複雑さ(局所性)の調整 |
| kernel | linear, rbf | 表現力と計算コストのバランス調整 |
先ほどのパイプラインに、GridSearchCV を組み合わせる例は次のようになります。
from sklearn.model_selection import GridSearchCV
# パラメータグリッドの設定(パイプライン名に合わせて指定)
param_grid = {
"svc__C": [0.1, 1, 10, 100],
"svc__gamma": [0.001, 0.01, 0.1, 1],
"svc__kernel": ["rbf", "linear"],
}
grid = GridSearchCV(
estimator=pipeline,
param_grid=param_grid,
cv=5, # 5分割のクロスバリデーション
n_jobs=-1 # 可能な限り並列実行
)
grid.fit(X_train, y_train)
print("Best params:", grid.best_params_)
print("Best CV score:", grid.best_score_)
# ベストモデルでテストデータを評価
best_model = grid.best_estimator_
y_pred = best_model.predict(X_test)
print("Test Accuracy:", accuracy_score(y_test, y_pred))このように、GridSearchCVを使うことで「どの組み合わせが最も良いか」を客観的に判断しながら、SVMの性能を底上げすることができます。
SVRによる回帰
SVMの考え方は、分類だけでなく回帰にも応用できます。scikit-learnでは SVR クラスを使って、連続値の予測を行います。基本的なパラメータ(C・kernel・gamma)の考え方は分類とほぼ同じです。
from sklearn.svm import SVR
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error
# 回帰用データセットの例(バージョンによっては別のデータセットを利用)
data = load_boston()
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
svr_model = Pipeline([
("scaler", StandardScaler()),
("svr", SVR(kernel="rbf", C=1.0, gamma="scale"))
])
svr_model.fit(X_train, y_train)
y_pred = svr_model.predict(X_test)
print("RMSE:", mean_squared_error(y_test, y_pred, squared=False))SVRを使うことで、線形回帰では表現しきれない非線形な傾向をとらえやすくなります。ただし、分類と同様にハイパーパラメータの調整が重要になる点には注意が必要です。
SVMが使われる代表的な応用分野
最後に、SVMが現実の問題でどのように使われているかを、代表的な応用分野を通して確認しておきましょう。
手書き文字認識(MNIST)
画像をベクトルとして扱う高次元データに対しても、比較的軽量に学習できることから、かつてはSVMが代表的な手法として広く用いられてきました。深層学習が一般的になった今でも、基礎的な手法としてよく教材に登場します。
医療・バイオ領域
遺伝子発現データなど、特徴量が非常に多い一方でサンプル数は限られる、といった場合にSVMがよく使われます。少データ × 高次元という条件で、マージン最大化の考え方がうまく機能しやすいためです。診断支援やリスクスコアリングなどのタスクで利用されます。
自然言語処理
TF-IDF や Bag-of-Words でベクトル化したテキストデータは次元数が大きくなりがちですが、SVMはこうした高次元ベクトルとの相性が良く、中小規模のテキスト分類問題(スパム判定、感情分析など)で今でも使われています。
異常検知(One-Class SVM)
One-Class SVM は、「正常データのみ」を使って学習し、それから外れるサンプルを「異常」とみなす手法です。不正検知や機械の故障予兆検知など、異常データの収集が難しい場面で役立ちます。
| 分野 | 特徴 |
|---|---|
| 手書き認識 | 高次元画像ベクトルを効率よく扱える |
| 医療データ | 少データ × 高次元の組み合わせで強みを発揮 |
| テキスト分類 | TF-IDFなどベクトル化テキストとの相性が良い |
| 異常検知 | One-Class SVM で正常データからの外れ値を検出 |
まとめ
SVMは、少ないデータでも安定した精度を出しやすく、高次元データにも強い、応用範囲の広いアルゴリズムです。マージン最大化というシンプルな原理のうえに、カーネルトリックやソフトマージンといった仕組みが組み合わさることで、線形・非線形の両方に対応できる柔軟性を持っています。
- 少量データや高次元データでも安定した性能を発揮しやすい
- マージン最大化により、ノイズに強く汎化性能が高いモデルを構築できる
- カーネルトリックと C・γ の調整によって、非線形な境界も表現できる
- GridSearchCV などを使ったハイパーパラメータ探索で、性能をさらに引き上げられる
- テキスト分類、医療データ、異常検知など、さまざまな実務領域で活用されている
SVMの考え方とパラメータの意味が分かると、「なぜこの設定でうまくいくのか」「どこからチューニングを始めればよいのか」が見通しやすくなります。まずは簡単なデータセットとサンプルコードから試し、少しずつCやγ、カーネルを動かしながら、自分のデータに合った設定を探してみてください。
romptn ai厳選のおすすめ無料AIセミナーでは、AIの勉強法に不安を感じている方に向けた内容でオンラインセミナーを開催しています。
AIを使った副業の始め方や、収入を得るまでのロードマップについて解説しているほか、受講者の方には、ここでしか手に入らないおすすめのプロンプト集などの特典もプレゼント中です。
AIについて効率的に学ぶ方法や、業務での活用に関心がある方は、ぜひご参加ください。
\累計受講者10万人突破/




