コンピュータ設定悪戦苦闘メモ

困ったこととその解決策のメモ.万人に有効なことは保証できませんが,お役に立てればうれしいな.

8.Rのsvmの交差検定オプションでcross=nrow(データ)で設定しても結果が変わることがある罠

やりたいこと:Rのsvm(e1071パッケージのやつ)でLeave-one-out交差検定をしたい

環境:R version 3.2.3 (Windows7)
 

【状況】

e1071パッケージにあるsvmには,交差検定の数を指定するcrossオプションがある.この値をデータ数と同じにすれば,Leave-one-out交差検定が再現できるはず…なんだけど,なぜか実行するたびに結果が変わる.Leave-one-outでないk-分割交差検定ならば,k分割の仕方によって結果が変わるのは当然なんだけど,Leave-one-outは分割の仕方は変わらないはず.それにSVMニューラルネットワークと違って初期状態がランダム生成されないから,なおさら実行のたびに結果が変わるとは思えない.

ネットで検索してみたところ,同じような状態で助けを求める書き込みをいくつか発見したんだけど,まだどれにも回答はついてなかった.

 

《試したスクリプト(crossオプション使用)》

> library(e1071)
>
> i<-1
> while(i<11){
+ model<-svm(Answer~.,data=testdata2,cross=nrow(testdata2))
+ m<-summary(model)
+ cat("accuracy =", m$tot.accuracy, "\n")
+ i<-i+1
+ }
accuracy = 60.6383
accuracy = 61.06383
accuracy = 60.6383
accuracy = 60.85106
accuracy = 60.85106
accuracy = 61.06383
accuracy = 60.85106
accuracy = 60.85106
accuracy = 61.06383
accuracy = 60.6383

 

【解決策】

いろいろ調べたり試したりしたけど分からなかったので,当面は地道にループ回すしかなさそうやね.

 

《試したスクリプト(crossオプション不使用)》

> library(e1071)
>
> i<-1
> while(i<11){
+ class<-1
+ correct<-0
+ while(class<=nrow(testdata2)){  #Leave-one-out cross validation
+ model<-svm(Answer~.,data= testdata2[-class,])
+ if(predict(model,testdata2[class,])==testdata2[class, ncol(testdata2)]) correct<-correct+1
+ class<-class+1
+ } # /LOOCV
+ tot.accuracy=correct/nrow(testdata2)*100
+ cat("accuracy =", tot.accuracy, "\n")
+ i<-i+1
+ }
accuracy = 60.42553
accuracy = 60.42553
accuracy = 60.42553
accuracy = 60.42553
accuracy = 60.42553
accuracy = 60.42553
accuracy = 60.42553
accuracy = 60.42553
accuracy = 60.42553
accuracy = 60.42553

 

 【感想】

なぜかirisデータではcrossオプション使っても結果が安定したんだよね.データのせい?だとしたらどんなデータだとダメなん?