サポートベクターマシンとは?統計ソフトRでどうやる?

にほんブログ村 科学ブログ 数学へ

いまやコンピューターで自動的に分類する方法がたくさん開発されている。

自動分類の方法によって、

・この電子メールはスパムメールかどうか

・この画像は男性か女性か

・この画像は食べ物かどうか

などという分類に応用されている。

サポートベクターマシンというのもそういう分類のための方法の一つ。

 

サポートベクターマシンを説明する前に最大マージン分類器から話を始めねばならない。

最大マージン分類器、サポートベクター分類器、サポートベクターマシンの順番に説明していかないとサポートベクターマシンのよさが伝わらない。

 

最大マージン分類器とは?

最大マージン分類器とは、マージンを最大化する分類器のこと。

マージンとは何か?

マージンとは、データを分類する境界線からデータまでの距離のこと。

データを区切る境界線はいくつか引くことができるが、データからの距離が最大化するように規定された境界線が、最大マージン分類器と呼ばれる。

参考ウェブサイト

s0sem0y.hatenablog.com

 

データを二分して区切る線形の分類器は、二次元なら直線、三次元なら平面、四次元以上は超平面になる。

 

f:id:toukeier:20180912205130p:plain

出典:https://onlinecourses.science.psu.edu/stat857/node/240

この画像の黒線が最大マージン分類器 maximum margin classifier。

赤の点と青の点からもっとも離れている。

赤い線も緑の線もちょっとずれると赤の点や青の点に触れてしまう。

誤分類が起こりやすい。

誤分類が起こりにくそうなのは黒線。

分類器として優れていそうな黒線が、最大マージン分類器になる。

 

サポートベクター分類器とは?最大マージン分類器の弱点とは?

最大マージン分類器は、上図のようにきちんと二分割できないと使えない。

きれいに二分割できるデータばかりではないので、現実問題として使いにくい。

サポートベクター分類器 support vector classifier は、きちんと二分割できなくてもOKで、誤分類を認めることにした線形の分類器。

最大マージン分類器より応用範囲が広がった。

誤分類をどのくらい認めるかで、分類器の予測性能も決まってくる。

誤分類をなるべく認めないかなりきわどい線にすると、学習データではあてはまりがよくても、テストデータであてはまらないという過学習 overfitting が起きてしまう。

テストデータの当てはまりが、予測性能。

機械学習 machine learning の目的は、予測性能の高い分類器を作成することなので、テストデータの当てはまりは重要。

誤分類をある程度認め、新たなデータにも当てはまる、分類器を作ることを目指している。

 

サポートベクターマシンとは?サポートベクター分類器との違いは?

サポートベクターマシン support vector machine は、サポートベクター分類器と同じ、誤分類はある程度認めたうえで、さらに、境界が非線形

出典:https://www.slideshare.net/tojimat/tokyor-41

上記の図は、非線形の関数を使って分類するイメージ図。

サポートベクターマシンは、線形の関数では決して分類できない状況でも分類する方法を考えてくれる方法。

サポートベクターマシンも複雑性を増しすぎると過学習してしまうため、分類精度を保持しつつ、予測精度も確保するために、クロスバリデーションが必要になる。

 

統計ソフトRでサポートベクターマシンを使ってみよう!

統計ソフトRでサポートベクター分類器・サポートベクターマシンを使って機械学習させるにはどうすればよいか?

必要なパッケージは?

e1071パッケージを使う。

まず最初一回インストール。

install.packages("e1071")

 

呼び出して使う準備をする。

library(e1071)

 

サポートベクター分類器で分類するには?

例として、irisデータで分類器を作ってみる。

svm()という関数を使う。

Speciesを分類するサポートベクター分類器を作って分類させてみる。

kernel="linear"で、サポートベクター分類器を指定している。

cross=5は5-fold cross validationを実施するように指示している。

model <- svm(Species ~ ., data = iris, kernel="linear", cross=5)

 

予測値を算出し、Confusion matrixを作り、正答率を計算する。

pred <- fitted(model)
(svc.confusion <- table(iris$Species, pred))
sum(diag(svc.confusion))/sum(svc.confusion)

 

誤分類は150例中3例、正答率は96.7%だった。

> (svc.confusion <- table(iris$Species, pred))
            pred
             setosa versicolor virginica
  setosa         50          0         0
  versicolor      0         46         4
  virginica       0          1        49
> sum(diag(svc.confusion))/sum(svc.confusion)
[1] 0.9666667

 

サポートベクターマシンで分類するには?

先ほどのkernel="linear"を削除して、デフォルト値を使う。

デフォルトはkernel="radial"で、これはradial basisという方法。

model1 <- svm(Species ~ ., data = iris, cross=5)
pred1 <- fitted(model1)
(svm.confusion <- table(iris$Species, pred1))
sum(diag(svm.confusion))/sum(svm.confusion)

 

誤分類は5例から4例に減り、正答率は97.3%になった。

> (svm.confusion <- table(iris$Species, pred1))
            pred1
             setosa versicolor virginica
  setosa         50          0         0
  versicolor      0         48         2
  virginica       0          2        48
> sum(diag(svm.confusion))/sum(svm.confusion)
[1] 0.9733333

 

まとめ

機械学習のための分類器の一つに、サポートベクターマシンがある。

サポートベクターマシンの大元は、最大マージン分類器。

最大マージン分類器の弱点は、二分割完全にできないと使えない点。

二分割できない場合に誤分類を認めたのがサポートベクター分類器。

線形分類器のサポートベクター分類器を、非線形分類器に拡張したのがサポートベクターマシン

統計ソフトRではe1071パッケージで、サポートベクターマシンを実行できる。