Scikit-learnのSVC(SVM)で機械学習!主要パラメータと使い方を解説

Python

機械学習で分類問題に取り組む際、高い精度と汎用性から多くの場面で候補に挙がるのが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.target

Step 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が小さい: 誤分類に対して寛容になり、マージンは広くなる傾向があります。より汎用的なモデルになりますが、**学習不足(アンダーフィット)**になる可能性もあります。

C10^-2から10^2のような範囲で調整することが一般的です。

③ gamma (rbfカーネル用) – データ点の影響が及ぶ”範囲”

gammaは、rbfカーネルなどにおいて、一つのデータ点からの影響がどこまで及ぶかを決めます。

[Image illustrating the effect of gamma parameter]

  • gammaが大きい: 各データ点の影響範囲が狭くなります。境界線は個々のデータに強く引きずられ、非常に複雑でギザギザな形になります。過学習のリスクが高まります。
  • gammaが小さい: 各データ点の影響範囲が広くなります。境界線はより大局的な視点で引かれ、滑らかな形になります。学習不足になる可能性もあります。

Cgammaは密接に関連しており、この2つをバランス良く調整することが、SVCで高い精度を出すための鍵となります。

まとめ:SVCを使いこなすためのポイント

今回は、Scikit-learnの強力な分類器SVCの使い方と、その性能を最大限に引き出すための主要パラメータについて解説しました。

  • SVCは「マージン最大化」と「カーネル法」で高い分類性能を実現するアルゴリズム。
  • 基本的な使い方は、インスタンス化 → .fit().predict()の3ステップ。
  • 性能の鍵を握るのはkernel, C, gammaの3つのハイパーパラメータ。
  • kernelはまず'rbf'Cgammaは過学習と学習不足のバランスを取るように調整する。

SVCはパラメータ調整の奥深さがありますが、その分、様々なデータに対して柔軟かつ強力な分類モデルを構築できます。ぜひこのガイドを片手に、あなたのデータでSVCを試してみてください。

コメント

タイトルとURLをコピーしました