Rのe1071を使ってSVMを試してみる

最近,ちょっとRに注目しています.
Webをスクレイピングしてデータを集めてみたはいいけれど,その後どうしよう状態になっていて,
何かいい手段はないか探していました.
CRANを使ったライブラリが充実していることもあって,よさげな感じです.
ちょうどSVMに関するチュートリアルがあったのでやってみました.

SVM

SVMの実装にも多々あるようですが,Rで使えるSVMでググってみると結構出てくるのがe1071.
チュートリアルもあります.(SVM-Tutorial using R (e1071-package))
e1071にはnaiveBayesも入っていたりするので,使えそう.
他にもLIBLINERをR上で使えるLiblineaRもあるようです.

e1071インストール

本当にこれだけだった...

> install.packages('e1071')

irisデータで実行

上記のチュートリアルを見ながら,irisで実行してみます.
データを一部参照してみると↓のようになっています.

> iris[c(1,100,150),]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
100          5.7         2.8          4.1         1.3 versicolor
150          5.9         3.0          5.1         1.8  virginica

Species(setosa, versicolor, virginicaの3種)に合わせて分類します.


とりあえず結果を得るために,こんな感じでやってみました.
チューニングはせずデフォルトのまま.

library(e1071)

train <- seq.int(1, 150, by=2)
test <- setdiff(1:150, train)

iris.svm <- svm(Species~., data=iris[train,])
iris.pred <- predict(iris.svm, iris[test,])
table(iris[test,5], iris.pred)

この中にあるsvm(Species~., data=iris[train,])の"Species~."って?と思われたかもしれません.
自分もWeb上で初めて見たときは「何だこりゃ?」となりました.manを見てみると,

## S3 method for class 'formula'
svm(formula, data = NULL, ..., subset, na.action =
na.omit, scale = TRUE)

...

formula	
a symbolic description of the model to be fit.

と書かれていて,"Species~."でSpeciesにフィットさせる式を表すようです.
最後の"."は全ての変数を使うことを示しているらしい.


実行すると,ほぼ正しく分類できていることが分かります.(正答率96%)

 要求されたパッケージ class をロード中です 
            iris.pred
             setosa versicolor virginica
  setosa         25          0         0
  versicolor      0         25         0
  virginica       0          3        22