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, (^^ゞ