2014-02-08 94 views
2

我使用R中的caret包來訓練徑向基SVM進行分類;另外,線性SVM用於變量選擇。使用度量=「精度」,這工作得很好,但最終我對優化度量=「ROC」更感興趣。雖然計算所有適合的模型的ROC,但彙總ROC值似乎存在一些問題。RFE in ROT()in caret package for R

下面是一些示例代碼:

library(caret) 
library(mlbench) 

set.seed(0) 

data(Sonar) 
x<-scale(Sonar[,1:60]) 
y<-as.factor(Sonar[,61]) 

# Custom summary function to use both 
# defaultSummary() and twoClassSummary 
# Also input and output of summary function are printed 

svm.summary<-function(data, lev = NULL, model = NULL){ 
print(head(data,n=3)) 
a<-defaultSummary(data, lev, model) 
b<-twoClassSummary(data, lev, model) 
out<-c(a,b) 
print(out) 
out} 

fitControl <- trainControl(
method = "cv", 
number = 2, 
classProbs = TRUE, 
summaryFunction=svm.summary, 
verbose=T, 
allowParallel = FALSE) 

# Ranking function: Rank Variables using a linear 
# SVM 

rankSVM<-function(object,x,y) { 
print("ranking") 
obj<-ksvm(x=as.matrix(x), y=y, 
    kernel=vanilladot, 
    kpar=list(), C=10, 
    scaled=F) 
w<-t([email protected][[1]]%*%[email protected][[1]]) 
z<-abs(w)/sqrt(sum(w^2)) 
ord<-order(z,decreasing=T) 
data.frame(var=dimnames(z)[[1]][ord],Overall=z[ord]) 
} 


svmFuncs<-getModelInfo("svmRadial",regex=F) 

svmFit<-function(x,y,first,last,...) { 
out<-train(x=x,y=as.factor(y),  
    method="svmRadial", 
    trControl=fitControl, 
    scaled=F, 
    metric="Accuracy", 
    maximize=T, 
    returnData=T) 
    out$finalModel} 

selectionFunctions<-list(summary=svm.summary, 
fit=svmFit, 
pred=svmFuncs$svmRadial$predict, 
prob=svmFuncs$svmRadial$prob, 
rank=rankSVM, 
selectSize=pickSizeBest, 
selectVar=pickVars)       

selectionControl<-rfeControl(functions=selectionFunctions, 
rerank=F, 
verbose=T, 
method="cv", 
number=2) 

subsets<-c(1,30,60) 

svmProfile<-rfe(x=x,y=y, 
sizes=subsets, 
metric="Accuracy", 
maximize=TRUE, 
rfeControl=selectionControl) 

svmProfile 

的最終輸出是下面的:

> svmProfile 

Recursive feature selection 

Outer resampling method: Cross-Validated (2 fold) 

Resampling performance over subset size: 

Variables Accuracy Kappa ROC Sens Spec AccuracySD KappaSD ROCSD SensSD SpecSD Selected 
     1 0.8075 0.6122 NaN 0.8292 0.7825 0.02981 0.06505 NA 0.06153 0.1344  * 
     30 0.8028 0.6033 NaN 0.8205 0.7825 0.00948 0.02533 NA 0.09964 0.1344   
     60 0.8028 0.6032 NaN 0.8206 0.7823 0.00948 0.02679 NA 0.12512 0.1635   

The top 1 variables (out of 1): 
V49 

ROC爲NaN。檢查輸出(作爲冗長= T和摘要函數修補以顯示其輸出和它的輸入的部分兩者)揭示了調諧在內部循環的支持向量機時,同時,ROC似乎正確計算:

+ Fold1: sigma=0.01172, C=0.25 
    pred obs   M   R 
1 M R 0.6658878 0.3341122 
2 M R 0.5679477 0.4320523 
3 R R 0.2263576 0.7736424 
Accuracy  Kappa  ROC  Sens  Spec 
0.6730769 0.3480826 0.7961310 0.6428571 0.7083333 
- Fold1: sigma=0.01172, C=0.25 
+ Fold1: sigma=0.01172, C=0.50 
    pred obs   M   R 
1 M R 0.7841249 0.2158751 
2 M R 0.7231365 0.2768635 
3 R R 0.3033492 0.6966508 
Accuracy  Kappa  ROC  Sens  Spec 
0.7692308 0.5214724 0.8407738 0.9642857 0.5416667 
- Fold1: sigma=0.01172, C=0.50 

[...] 

在外迭代中似乎存在問題。 「介於」兩個摺痕,我們得到如下:

-(rfe) fit Fold1 size: 1 
    pred obs Variables 
1 M R   1 
2 M R   1 
3 M R   1 
Accuracy  Kappa  ROC  Sens  Spec 
0.7864078 0.5662328  NA 0.8727273 0.6875000 
    pred obs Variables 
1 R R  30 
2 M R  30 
3 M R  30 
Accuracy  Kappa  ROC  Sens  Spec 
0.7961165 0.5853939  NA 0.8909091 0.6875000 
    pred obs Variables 
1 R R  60 
2 M R  60 
3 M R  60 
Accuracy  Kappa  ROC  Sens  Spec 
0.7961165 0.5842783  NA 0.9090909 0.6666667 
+(rfe) fit Fold2 size: 60 

所以在這裏,似乎對彙總函數的輸入是不包含類的概率,但變量,而不是數量,所以ROCS不能是一個矩陣計算/彙總正確。有人知道如何防止這種情況嗎?我忘了告訴脫字符在某個地方輸出類概率嗎?

非常感謝您的幫助,因爲caret是一款非常酷的軟件包,如果我能夠正確運行,將會爲我節省大量工作。

托拉爾夫

回答

3

getModelInfo旨在幫助代碼train並不會自動與rfe工作(我會在文檔中記下)。 rfe不尋找名爲probs的插槽,沒有概率預測意味着不是ROC概要。

您可能希望將您的代碼基於caretFuncs,該代碼旨在與rfe一起使用,並且應該自動執行許多我認爲您想要執行的操作。

例如,在caretFuncs,該pred模塊將創建類和概率的預測:

function(object, x) { 
    tmp <- predict(object, x) 
    if(object$modelType == "Classification" & 
    !is.null(object$modelInfo$prob)) { 
     out <- cbind(data.frame(pred = tmp), 
         as.data.frame(predict(object, x, type = "prob"))) 
     } else out <- tmp 
     out 
    } 

你也許可以簡單地在你的rankSVM插入caretFuncs$rank。請參閱feature selection page on the website。它有關於你需要什麼代碼模塊的細節。

+1

謝謝,這幫了很多!我希望它也能在我目前正在研究的更大範例中發揮作用...... Thoralf – user3287622

+0

http://topepo.github.io/caret/featureselection.html – rafaelvalle

+1

@rafaelvalle就像一個提示:你所做的編輯沒有實際上工作。在使用'[text](url)'鏈接格式時,必須包含'http://'部分,否則鏈接將不起作用。我這次爲你解決了這個問題,只是爲了將來的情況記住這一點。 – Pokechu22