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)
プロットすると↓の感じのグラフが出る。
そしたら、青い部分が濃い辺りの範囲を再度指定してチューニングを実行する。(ちょっと時間かかる)
################################################################################################## #チューニング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)
プロットしたら↓の感じのが出る。
もういいでしょ。というこーとで、「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")