機械学習で分類問題に取り組む際、高い精度と汎用性から多くの場面で候補に挙がるのがSVC (Support Vector Classifier)、すなわち**SVM (サポートベクターマシン)**です。
しかし、その強力さゆえに「パラメータが多くて難しそう…」と感じる方もいるかもしれません。
この記事では、Scikit-learnのSVCの基本的な使い方から、モデルの性能を最大限に引き出すための最重要パラメータまで、図解を交えながら分かりやすく解説します。この一本でSVCの動かし方と調整のコツを掴みましょう。
はじめに:SVCとは?なぜ強力な分類モデルなのか
SVCは、SVMというアルゴリズムを分類タスクに用いるためのモデルです。その強さの秘密は「マージン最大化」と「カーネル法」という2つの核心アイデアにあります。
SVMの核心アイデア「マージン最大化」とは
SVMは、データを2つのクラスに分けるとき、最も識別しやすい境界線を引こうとします。具体的には、境界線と最も近いデータとの距離(マージン)が最大になるように境界線を決定します。
この「できるだけ余裕を持たせた境界線」を引くアプローチにより、未知のデータに対する高い分類性能(汎化性能)を実現します。
「カーネル法」で複雑なデータも分類可能に
直線一本では到底分けられないような、複雑に入り組んだデータもあります。SVMは**カーネル法(カーネルトリック)**というテクニックを使うことで、こうした非線形データも綺麗に分類できます。
これは、元の空間では分離できなくても、データを高次元の空間に写し取ることで、分離可能な形に変形させてしまう魔法のような手法です。Scikit-learnのSVCでは、この強力な機能をkernelパラメータ一つで簡単に利用できます。
SVCの使い方:分類モデル構築の4ステップ
理論は少し難しく聞こえるかもしれませんが、Scikit-learnを使えば実装は非常にシンプルです。ここでは4つのステップで使い方を解説します。
Step 1: 準備 – ライブラリのインポートとデータ読み込み
まず、必要なライブラリとデータセットを準備します。今回はおなじみのIrisデータセットを使います。
# 必要なライブラリをインポート
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# データをロード
iris = load_iris()
X, y = iris.data, iris.targetStep 2: データ分割 – 訓練用とテスト用に分ける
モデルの性能を正しく評価するために、データを学習に使う「訓練データ」と評価用の「テストデータ」に分割します。
# データを7:3の割合で分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)Step 3: 学習 – SVCモデルを.fit()で訓練
SVCのインスタンスを作成し、.fit()メソッドで訓練データを学習させます。
# SVCモデルのインスタンスを作成
# ここではデフォルトのパラメータを使用
svc_model = SVC(random_state=42)
# モデルを訓練データで学習
svc_model.fit(X_train, y_train)
print("モデルの学習が完了しました。")Step 4: 予測と評価 – 未知のデータで性能を確認
学習済みモデルを使い、テストデータで予測を行い、その精度を評価します。
# テストデータで予測
y_pred = svc_model.predict(X_test)
# 正解率を計算して評価
accuracy = accuracy_score(y_test, y_pred)
print(f"モデルの正解率: {accuracy:.4f}")基本的な使い方は以上です。しかし、SVCの真価はここからのパラメータ調整にあります。
【図解】SVCの性能を操る!最重要ハイパーパラメータ3選
SVCの性能は、いくつかのハイパーパラメータによって大きく変わります。ここでは、絶対に押さえておきたい3つのパラメータを解説します。
① kernel – 分類境界の”形”を決めるエンジン
kernelは、どのような形の境界線を引くかを指定します。
'rbf'(デフォルト): Radial Basis Functionカーネル。非線形データに非常に強く、ほとんどのケースで第一候補となる万能なカーネルです。'linear': 線形カーネル。データを直線で分離します。データが線形分離可能な場合や、特徴量が非常に多い場合に高速で効果的です。'poly': 多項式カーネル。より複雑な境界を引けますが、調整が難しい上級者向けのカーネルです。
まずは'rbf'を試し、それでうまくいかなければ'linear'を検討するのが良いスタートです。
② C (正則化パラメータ) – 誤分類への”厳しさ”を調整
Cは、どれだけ誤分類を許さないか、つまりマージンの厳格さをコントロールします。
[Image illustrating the effect of C parameter]
Cが大きい: 誤分類を厳しく罰するため、マージンは狭くなり、訓練データに細かくフィットしようとします。**過学習(オーバーフィット)**のリスクが高まります。Cが小さい: 誤分類に対して寛容になり、マージンは広くなる傾向があります。より汎用的なモデルになりますが、**学習不足(アンダーフィット)**になる可能性もあります。
Cは10^-2から10^2のような範囲で調整することが一般的です。
③ gamma (rbfカーネル用) – データ点の影響が及ぶ”範囲”
gammaは、rbfカーネルなどにおいて、一つのデータ点からの影響がどこまで及ぶかを決めます。
[Image illustrating the effect of gamma parameter]
gammaが大きい: 各データ点の影響範囲が狭くなります。境界線は個々のデータに強く引きずられ、非常に複雑でギザギザな形になります。過学習のリスクが高まります。gammaが小さい: 各データ点の影響範囲が広くなります。境界線はより大局的な視点で引かれ、滑らかな形になります。学習不足になる可能性もあります。
Cとgammaは密接に関連しており、この2つをバランス良く調整することが、SVCで高い精度を出すための鍵となります。
まとめ:SVCを使いこなすためのポイント
今回は、Scikit-learnの強力な分類器SVCの使い方と、その性能を最大限に引き出すための主要パラメータについて解説しました。
- SVCは「マージン最大化」と「カーネル法」で高い分類性能を実現するアルゴリズム。
- 基本的な使い方は、インスタンス化 →
.fit()→.predict()の3ステップ。 - 性能の鍵を握るのは
kernel,C,gammaの3つのハイパーパラメータ。 kernelはまず'rbf'、Cとgammaは過学習と学習不足のバランスを取るように調整する。
SVCはパラメータ調整の奥深さがありますが、その分、様々なデータに対して柔軟かつ強力な分類モデルを構築できます。ぜひこのガイドを片手に、あなたのデータでSVCを試してみてください。


コメント