Shikata Ga Nai

Private? There is no such things.

30. サポートベクターマシン(SVM)入門

Hello there, ('ω')ノ

📌 1. SVMとは?

SVM(サポートベクターマシン) は、分類問題を解くための強力なアルゴリズムです。
データを分類するために 「最適な境界線(超平面)」 を見つけることが目的です。

📌 SVMの考え方
1. データを分類する「境界線(決定境界)」を探す
2. 境界線と最も近いデータ(サポートベクター)の距離(マージン)を最大化する
3. 線形分類だけでなく、カーネル法を使うと非線形データも分類できる!

📌 分類のイメージ

        ◯  ◯  ◯  ◯  ◯   ← クラス1(ポジティブ)
    --------------------- ← 最適な境界線(決定境界)
        ×  ×  ×  ×  ×   ← クラス2(ネガティブ)

「最も良い境界線」を見つけるのがSVMのポイント!


📌 2. マージン最大化とサポートベクター

✅ 最適な境界線(超平面)を決める

SVMでは、クラスを分ける「境界線」をどこに引くか? が重要です。

📌 境界線の決め方(マージン最大化)
- 境界線に最も近いデータ(サポートベクター) を見つける
- サポートベクターと境界線の距離(マージン)を最大化する

「クラスの間隔が最大になるような線」を決定するのがSVMの特徴!


📌 3. カーネル法とは?

SVMは、「線形」な分類だけでなく、「非線形」なデータにも対応できる!

📌 線形分離できるデータ

○  ○  ○  ○  ○   ---  ×  ×  ×  ×  ×

直線でクラスを分けられるので、そのまま分類可能!

📌 線形分離できないデータ

○  ○  ○        ×  ×  ×
    ○              ×
    ○              ×
○  ○  ○        ×  ×  ×

通常の線形分類では、うまく分けられない…!

📌 そこで、カーネル法を使う! - データを 高次元にマッピング し、線形分離できるように変換
- カーネル関数 を使って、計算コストを抑える

📌 代表的なカーネル関数

カーネル関数 特徴 用途
線形カーネル(linear) 線形データに適用 直線で分離できる問題
RBFカーネル(rbf) 非線形データに適用 ほとんどのケースに適用可能
多項式カーネル(poly) 高次の特徴を捉える 曲線的な分類境界が必要な場合

「非線形データでも分類できる」のがSVMの強み!


📌 4. PythonでSVMを実装

scikit-learn を使って、SVMを実装し、分類タスクを試してみましょう!

✅ ① SVM(線形カーネル)で分類

Irisデータセットを使って、SVMの基本的な分類 を行います。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# データの読み込み(Irisデータセット)
iris = datasets.load_iris()
X, y = iris.data, iris.target

# データを学習用・テスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# SVMモデル(線形カーネル)
svm_model = SVC(kernel="linear")
svm_model.fit(X_train, y_train)

# 予測
y_pred = svm_model.predict(X_test)

# 精度を評価
print(f"Accuracy: {accuracy_score(y_test, y_pred):.2f}")

線形SVMでIrisデータセットを分類!
カーネルを「linear」にすると線形SVMになる!


✅ ② カーネルSVM(非線形データ)

次に、非線形なデータに対して RBFカーネル(ガウシアンカーネル) を使って分類してみます。

# RBFカーネルを使ったSVMモデル
svm_rbf = SVC(kernel="rbf", gamma="scale")
svm_rbf.fit(X_train, y_train)

# 予測
y_pred_rbf = svm_rbf.predict(X_test)

# 精度の評価
print(f"RBF Kernel SVM Accuracy: {accuracy_score(y_test, y_pred_rbf):.2f}")

非線形データでも高精度な分類が可能!
カーネルを「rbf」にすると非線形SVMになる!

実際のデータでは「RBFカーネル」が一般的に強力!


📌 5. SVMのメリット・デメリット

✅ メリット

高次元データに強い(特徴量が多い場合でもうまく機能)
小規模データでも高精度(少ないデータでも適用可能)
カーネル法で非線形データも分類できる

✅ デメリット

計算コストが高い(データが大きいと学習が遅くなる)
パラメータ調整が必要(カーネルの選択やC, γ の調整が難しい)

データが小さい&高次元ならSVM! 大規模データならランダムフォレストやXGBoostが良い!


🎯 まとめ

SVMは「最適な境界線」を探し、データを分類するモデル!
マージン最大化により、過学習を防ぎつつ分類できる!
カーネル法を使うと、非線形データも扱える!
PythonでSVMを実装し、分類タスクを試してみよう!
大規模データには向かないが、小規模データなら強力な手法!

Best regards, (^^ゞ