トップ 履歴 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

SVM

*disclaimer
603198

[R]

SVM: Support Vector Machine サポートベクターマシーン

  • 分類には、境界部分のデータポイントに注目
  • できるだけ距離を置いて分けられる方が良いという発想
install.packages("kernlab", dependencies = T)
library(kernlab)

サンプリングの方法(トレーニングデータとテストデータの二種類のデータセットの作成)

rnd.number <- sample(全体の数,ランダムサンプルする数)
training.data <- data.frame[rnd.number, ]
test.data     <- data.frame[-rnd.number, ]

SVM関数


ksvm(分類カテゴリ~説明変数, data=データフレーム, kernel="使用するカーネル関数", kpar=パラメタ)
  • これでモデルを作って、predictでテストデータを使って試す
predict(モデル, テストデータ)
  • もしくは、オプションで交差検証法を使う
    • cross=交差検証法の回数

  • カーネル関数
    • vanilladot 線形カーネル
    • polydot 多項式カーネル
      • kpar=list(degree=2) で2乗の多項式
    • rbfdot ガウシアンカーネル
      • kpar=list(sigma=1) sigmaが大きいと細かく複雑になる

  • kernelもkparも指定しなければ、自動で最適なものを適用してくれる!
ksvm(分類カテゴリ~説明変数, data=データフレーム)

だけでOK

 分析例

> str(training.errdat5)
'data.frame':	200 obs. of  52 variables:
 $ Criterion   : Factor w/ 5 levels "1","2","3","4",..: 3 5 3 3 3 4 4 3 3 3 ...
 $ M.ADJ       : num  0 0 0 0 0 0 0 0 0 0 ...
 $ M.ADV       : num  0 1.08 1.1 0 0 ...
 $ M.CONJ      : num  0 0.54 0 0 0 ...
 $ M.CONTR     : num  0 0 0 0 0 0 0 0 0 0 ...
 $ M.DET       : num  8.9 1.62 1.1 1.58 6.57 ...

> str(test.errdat5)
'data.frame':	179 obs. of  52 variables:
 $ Criterion   : Factor w/ 5 levels "1","2","3","4",..: 3 4 4 3 5 5 4 3 3 4 ...
 $ M.ADJ       : num  0 1.154 2.493 0 0.709 ...
 $ M.ADV       : num  2.985 1.154 3.324 0 0.709 ...
 $ M.CONJ      : num  0 0 0 0 0 ...
 $ M.CONTR     : num  0 0 0 0 0 0 0 0 0 0 ...
 $ M.DET       : num  1.49 1.15 0 1.64 4.96 ...

> rnd.number <- sample(379,200)
> training.errdat5 <- errdat5[rnd.number, ]
> test.errdat5    <- errdat5[-rnd.number, ]

> errdat5.svm <- ksvm(Criterion~., data=training.errdat5)
> errdat5.svm
Support Vector Machine object of class "ksvm" 

SV type: C-svc  (classification) 
 parameter : cost C = 1 

Gaussian Radial Basis kernel function. 
 Hyperparameter : sigma =  0.0130333504236064 

Number of Support Vectors : 200 

Objective Function Value : -1.4671 -1.4843 -1.4522 -1.3289 -24.5718 -23.2186 -15.5245 -108.7821 -35.9234 -37.528 
Training error : 0.29 

> errdat5.pred <- predict(errdat5.svm, test.errdat5)
> table(errdat5.pred, test.errdat5$Criterion)
            
errdat5.pred  1  2  3  4  5
           1  0  0  0  0  0
           2  0  0  0  0  0
           3  1  4 61 23  3
           4  0  2 20 53 12
           5  0  0  0  0  0

> errdat5.table <- table(errdat5.pred, test.errdat5$Criterion)
> 1-sum(diag(errdat5.table))/sum(errdat5.table)
[1] 0.3631285
  • 誤判別率36%(判別率あまりよくない)

confusion matrixから誤判別率の出し方

  • diag()で対角線の値を取り出すのがポイント
    • つまり、confusion matrixで、対角線のところが正しく判別できたところになる。
    • 合ってた数の合計をテーブル全体を足した数で割れば、正判別率になる。
    • それを1から引けば、誤判別率


 References

https://www.cis.doshisha.ac.jp/mjin/R/31/31.html
http://yut.hatenablog.com/entry/20120827/1346024147
https://shohei-doi.github.io/notes/posts/2019-05-20-classification/#SVM