サポートベクターマシン(SVM)の基礎とカーネル法
サポートベクターマシン(SVM)は、教師あり学習アルゴリズムの一つで、特に分類問題でよく使用されます。SVMの目標は、異なるクラスのデータを区別するための最適な超平面(ハイパープレーン)を見つけることです。
SVMの基本概念
サポートベクターマシンの基本は、2つの異なるクラスを最も大きなマージン(余白)で分ける線(もしくは高次元空間では平面)を見つけることです。
- サポートベクター:最適なハイパープレーンに最も近いデータポイントであり、これらが分類を決定する重要なデータです。
- ハイパープレーン:データを分類するための決定境界。2次元では直線、3次元では平面、それ以上の次元では一般化された形になります。
- マージン:ハイパープレーンと最も近いデータポイント(サポートベクター)との距離。SVMは、このマージンを最大化することで最適な分離を目指します。
カーネル法とは?
カーネル法は、線形に分離できないデータを扱うための技術です。カーネル関数を使用することで、データを高次元空間に変換し、線形で分離可能にすることができます。
以下のようなカーネルが一般的に使用されます:
カーネルの種類 | 説明 |
---|---|
線形カーネル | 線形に分離可能なデータに対して使用される基本的なカーネル。 |
多項式カーネル | データの非線形性をキャプチャするために、データを多項式的に変換します。 |
RBFカーネル (放射基底関数カーネル) |
最も広く使用されるカーネルで、データを無限次元空間にマッピングし、非線形なデータを分離可能にします。 |
PythonでのSVMの実装例
次に、Pythonのライブラリである scikit-learn
を使用して、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 = iris.data
y = iris.target
# データを訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# SVMモデルのインスタンス作成(RBFカーネルを使用)
svm_model = SVC(kernel='rbf')
# モデルの訓練
svm_model.fit(X_train, y_train)
# テストデータで予測
y_pred = svm_model.predict(X_test)
# モデルの精度を評価
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
このコードでは、scikit-learnのSVC
クラスを使用してSVMを実装しています。カーネルとしてRBFカーネルを選び、データセットを訓練してからテストデータで精度を評価しています。
パラメータの調整
SVMにはいくつかの重要なハイパーパラメータがあります。特に以下の2つが重要です:
- Cパラメータ:誤分類を許容する度合いを制御します。大きなC値では誤分類を少なくする傾向がありますが、過学習のリスクがあります。小さなC値ではマージンが大きくなり、汎化性能が向上します。
- ガンマパラメータ:カーネルの影響範囲を制御します。ガンマが大きいとモデルが複雑になり、過学習しやすくなります。逆にガンマが小さいと単純なモデルになります。
# ハイパーパラメータの調整
svm_model = SVC(kernel='rbf', C=1.0, gamma='scale')
svm_model.fit(X_train, y_train)
上記のコードでは、C
とgamma
を指定してSVMモデルを構築しています。これにより、データに応じた柔軟な調整が可能になります。
結論
SVMは、分類タスクにおいて強力なアルゴリズムです。特に高次元のデータや線形分離不可能なデータに対しては、カーネル法を使用することで非常に有効な結果が得られます。モデルのパフォーマンスを最大限に引き出すためには、ハイパーパラメータの調整が重要です。