*disclaimer
632812
[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
https://sugiura-ken.org/wiki/