6

私は、MatLab ではこれが非常に簡単であることを知っています ('-v 10')。

しかし、私はRでそれを行う必要がありcross = 10ます。パラメーターとして追加することについてのコメントが1つ見つかりました。しかし、これはヘルプ ファイルで確認されていないため、懐疑的です。

svm(Outcome ~. , data= source, cost = 100, gamma =1, cross=10)

R の成功した SVM スクリプトの例は、まだいくつかの行き止まりに直面しているため、高く評価されますか?

編集:これに libsvm パッケージを使用していることをタグの外で言及するのを忘れていました。

4

3 に答える 3

7

また、10 倍の交差検証を実行しようとしています。この関数はパラメーターの最適化には使用されますが、モデルのトレーニングとテストには使用されないため、tune を使用することは正しい方法ではないと思います。

Leave-One-Out クロス検証を実行する次のコードがあります。データセットが、データが格納された data.frame であるとします。各 LOO ステップで、観察された対予測されたマトリックスが追加され、最終的に結果にグローバルな観察された対予測されたマトリックスが含まれるようになります。

#LOOValidation
for (i in 1:length(dataset)){
    fit = svm(classes ~ ., data=dataset[-i,], type='C-classification', kernel='linear')
    pred = predict(fit, dataset[i,])
    result <- result + table(true=dataset[i,]$classes, pred=pred);
}
classAgreement(result)

したがって、10 倍のクロス検証を実行するには、データセットを手動で分割し、フォールドを使用してモデルをトレーニングおよびテストする必要があると思います。

for (i in 1:10)
    train <- getFoldTrainSet(dataset, i)
    test <- getFoldTestSet(dataset,i)
    fit = svm(classes ~ ., train, type='C-classification', kernel='linear')
    pred = predict(fit, test)
    results <- c(results,table(true=test$classes, pred=pred));

}
# compute mean accuracies and kappas ussing results, which store the result of each fold

これがお役に立てば幸いです。

于 2012-11-13T16:43:14.370 に答える
1

パッケージを使用せずに 10 個のテスト フォールドとトレーニング フォールドを作成する簡単な方法を次に示します。

#Randomly shuffle the data
yourData<-yourData[sample(nrow(yourData)),]

#Create 10 equally size folds
folds <- cut(seq(1,nrow(yourData)),breaks=10,labels=FALSE)

#Perform 10 fold cross validation
for(i in 1:10){
    #Segement your data by fold using the which() function 
    testIndexes <- which(folds==i,arr.ind=TRUE)
    testData <- yourData[testIndexes, ]
    trainData <- yourData[-testIndexes, ]
    #Use test and train data howeever you desire...
}
于 2014-07-04T20:18:35.353 に答える
0

これは、インデックス フォールドを生成するために cvsegments によって支援される k フォールド クロス検証を実行するための私の一般的なコードです。

# k fold-cross validation
set.seed(1)
k <- 80;
result <- 0;
library('pls');
folds <- cvsegments(nrow(imDF), k);
for (fold in 1:k){
    currentFold <- folds[fold][[1]];
    fit = svm(classes ~ ., data=imDF[-currentFold,], type='C-classification', kernel='linear')
    pred = predict(fit, imDF[currentFold,])
    result <- result + table(true=imDF[currentFold,]$classes, pred=pred);   
}
classAgreement(result)
于 2012-11-14T18:06:04.607 に答える