RでSVMの分類器作るときの段取りまとめ。kernlabとe1071を使用。

いつものアイリスデータで。。。

##################################################################################################
#アイリスデータセットを使用
d <- iris

#学習データと検証データを作る
set.seed(256)
id.random <- sample(nrow(d),nrow(d)/2)
d.train <- d[id.random,]
d.test <- d[setdiff(1:nrow(d),id.random),]

##################################################################################################
#とりあえずデフォのパラメータでSVMをやる
library( kernlab )
#学習データでSVMの分類器を作る
d.ksvm <- ksvm(Species ~.,type="C-svc", kernel="rbfdot",data=d.train,cross=5,prob.model=TRUE)

#トレーニングエラー
d.ksvm@error
#交差検証エラー
d.ksvm@cross

#検証データで精度を確認
d.pred <- predict(d.ksvm, newdata=d.test)
rt <- table(d.pred, d.test$Species)
rt

#正答率
before_tune <- as.integer(rt[1]+rt[5]+rt[9]) / as.integer(length(d.pred))
before_tune

そしたら、SVMのパラメータの値をチューニングしてく。


##################################################################################################
#チューニング1回目(適当にコストとガンマの範囲を決めて、1刻みくらいでやる)
library(e1071)
t <- tune.svm(Species ~.,data=d.train,gamma=10^(seq(-10,10,1)),cost=10^(seq(-10,10,1)),tunecontrol=tune.control(sampling="cross",cross=5))
#コストの一番いい値
t$best.parameters$cost
#ガンマの一番いい値
t$best.parameters$gamma
#一番いいパフォーマンス
100-100*tuning$best.performance
#プロット x軸:gamma y軸:cost
plot(t,transform.x=log10,transform.y=log10)

プロットすると↓の感じのグラフが出る。 sample01
そしたら、青い部分が濃い辺りの範囲を再度指定してチューニングを実行する。(ちょっと時間かかる)

##################################################################################################
#チューニング2回目
#1回目のプロットで濃い青になってる辺りを中心に今度は0.1刻みで実行
library(e1071)
t <- tune.svm(Species ~.,data=d.train,gamma=10^(seq(-4,1,0.1)),cost=10^(seq(1,6,0.1)),tunecontrol=tune.control(sampling="cross",cross=5))
#コストの一番いい値
t$best.parameters$cost
#ガンマの一番いい値
t$best.parameters$gamma
#一番いいパフォーマンス
100-100*tuning$best.performance
#プロット x軸:gamma y軸:cost
plot(t,transform.x=log10,transform.y=log10)

プロットしたら↓の感じのが出る。 sample02
もういいでしょ。というこーとで、「best.parameters$cost」の値をSVMのパラメータに入れて実行する。

##################################################################################################
#チューニングしたコストを指定して実行。kparは"automatic"にしておけば勝手にやるらしい。
library( kernlab )
#学習データでSVMの分類器を作る
d.ksvm <- ksvm(Species ~.,type="C-svc", kernel="rbfdot",C=t$best.parameters$cost, kpar="automatic",data=d.train,cross=5,prob.model=TRUE)

#トレーニングエラー
d.ksvm@error
#交差検証エラー
d.ksvm@cross

#検証データで確認
d.pred <- predict(d.ksvm, newdata=d.test)
rt <- table(d.pred, d.test$Species)
rt
after_tune <- as.integer(rt[1]+rt[5]+rt[9]) / as.integer(length(d.pred))
after_tune

自分のPCでは正答率は↓の感じになった。

チューニング前:93.3%
チューニング後:96%

精度は上がった模様。

おまけ。”probabilities”の引数渡すとそれぞれの所属確率を出してくれる。↓の感じ。

d.allprob <- predict(d.ksvm,newdata=d,type="probabilities")
head(d.allprob)
        setosa versicolor  virginica
[1,] 0.9770838 0.01094580 0.01197041
[2,] 0.9563003 0.01973656 0.02396311
[3,] 0.9708821 0.01357799 0.01553994

そしたら、元データにくっつけてCSVあたりに吐けば、個別データを吟味しやすい。

#元データに結合(列)
d.withprob <- cbind(d,d.allprob)
#CSVに出力
write.csv(d.withprob, "iris_withprob.csv")

CSVに出すと↓の感じ。 sample03