【機械学習】サポートベクターマシン(SVM)について簡単に解説!Pythonで使ってみよう

こんにちは!

皆さんは、サポートベクターマシン(SVM)という機械学習アルゴリズムをご存知ですか?

Python初心者
かっこいい名前だね!

サポートベクターマシンは、古典的な機械学習手法であるにもかかわらず、非常に使い勝手が良く、性能も高いと言われているアルゴリズムです。

そのため、とりあえず機械学習みたいなことをやってみたい!という方には、非常におすすめのアルゴリズムです。

サポートベクターマシンは英語で、Support Vector Machineと呼ばれ、SVMと略されることが多いので、以降はSVMと記述します。

今回の記事では、以下の内容について紹介します。

  • SVMについて
  • PythonでSVMを使ってみた

サポートベクターマシン(SVM)とは

SVMは、教師あり学習の1つで、応用範囲が広く使い勝手が良いので、広く愛用されてきた機械学習アルゴリズムです。

教師あり学習というのは以下の記事で説明しています。

【機械学習】教師あり学習、教師なし学習について簡単に解説!それぞれのアルゴリズムを紹介

SVMを使うことで、境界線を引くことができ、その境界線によってクラスを分類することができます。

Python初心者
いい感じに境界線が引けたらうまく分類できるんだね!

では、どのような条件で境界線を引くのでしょうか?

それを簡単に説明していきましょう。

SVMの動作

SVMでは、サポートベクトルマージンという言葉が重要になってきます。

サポートベクトルというのは、境界線に一番近いデータ
マージンというのは、サポートベクトルと境界の距離です。

SVMは、このマージンを最大化するように計算することで最適な境界を求めるアルゴリズムです。

以下の図の実線ように境界線が引かれていたとすると、点線と被っている点がサポートベクトル、点線と実線の間の距離がマージンです。

このマージンを最大化するように、境界線を移動させます。

すると、以下の図のようになり、これがSVMによる境界線になります。

数学的な知識がなくても、この動作さえ覚えておけば、SVMについてはまず大丈夫です。

PythonでSVMを使ってみる

PythonでSVMを使ってみましょう。

今回はirisデータセットを用いて、線形のSVMで学習して分類を行なってみます。

scikit-learn、pandasというライブラリを使用するため、インストールしておきましょう。

scikit-learnのインストール方法

ソースコード

from sklearn.datasets import load_iris
from sklearn import model_selection, svm, metrics
import pandas as pd

iris = load_iris()
iris_data = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_label = pd.Series(data=iris.target)

data_train, data_test, label_train, label_test = model_selection.train_test_split(iris_data, iris_label, random_state=42)

clf = svm.SVC(kernel="linear")
clf.fit(data_train, label_train)
test_predict = clf.predict(data_test)

ac_score = metrics.accuracy_score(label_test, test_predict)

print(ac_score)

解説

from sklearn.datasets import load_iris
必要なライブラリを読み込んでいます。
iris = load_iris()
iris_data = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_label = pd.Series(data=iris.target)
irisデータセットをインポートし、PandasのDataFrame型に変換しています。
機械学習では、DataFrameを使うとわかりやすく簡単です。
data_train, data_test, label_train, label_test = model_selection.train_test_split(iris_data, iris_label, random_state=42)
irisのデータをトレーニングデータとテストデータに分割しています。
デフォルトでは、トレーニングデータ:テストデータ=7.5:2.5で分割します。
random_stateを設定することで、実行ごとにデータ分割が変わらないようにしています。
clf = svm.SVC(kernel=”linear”)
clf.fit(data_train, label_train)
scikit-learnを用いた機械学習の際は、機械学習モデルを作成する際、基本的にこのように記述します。
linearというのが線形のSVMを使用するということです。
学習にはトレーニングデータを渡してあげましょう。
test_predict = clf.predict(data_test)
作成した機械学習モデルを用いて、予測を行います。
予測にはテストデータを使います。
ac_score = metrics.accuracy_score(label_test, test_predict)
AUCを求めています。

実行結果

1.0

AUCが1.0ということは、テストデータの予測が完璧に行えているということです。

Python初心者
簡単に高性能の予測をすることができたね!

まとめ

今回の記事では、以下の内容について紹介しました。

  • SVMについて
    →古典的だが強力な機械学習アルゴリズム
     マージンを最大化させるように境界線を引く
  • PythonでSVMを使ってみた
    →簡単に高性能な分類ができた!
Python初心者
機械学習って難しそうに見えて簡単にできるんだね!

皆さんも是非試してみてください!

広告