2016-05-16 43 views
1

私はcaretパッケージで生成されたSVM-RFEモデルとのクロスバリデーションデータ(10回繰り返し5回)を扱っています。私は、パッケージでcaretパッケージが動作することを知っていますが、平均ROCを得るにはROCRパッケージを使用する必要があります。しかし、平均的なAUC値は各パッケージを使用するときに同じではないことに気づいたので、両方のパッケージを区別して使用する必要があるかどうかはわかりません。ROCRとpROC(R)を使用した平均AUC計算の差

私はそれを証明するために使用されるコードは次のとおりです。

predictions_NG3<-list() 
labels_NG3<-list() 

optSize <- svmRFE_NG3$optsize 

resamples<-(split(svmRFE_NG3$pred,svmRFE_NG3$pred$Variables)) 
resamplesFOLD<-(split(resamples[[optSize]],resamples[[optSize]]$Resample)) 

auc_pROC <- vector() 
auc_ROCR <- vector() 

for (i in 1:50){ 
    predictions_NG3[[i]]<-resamplesFOLD[[i]]$LUNG 
    labels_NG3[[i]]<-resamplesFOLD[[i]]$obs 

    #WITH pROC 
    rocCurve <- roc(response = labels_NG3[[i]], 
        predictor = predictions_NG3[[i]], 
        levels = c("BREAST","LUNG")) #LUNG POSITIVE 

    auc_pROC <- c(auc_pROC,auc(rocCurve)) 

    #WITH ROCR 
    pred_ROCR <- prediction(predictions_NG3[[i]], labels_NG3[[i]], 
          label.ordering = c("BREAST","LUNG")) #LUNG POSITIVE 

    auc_ROCR <- c(auc_ROCR,performance(pred_ROCR,"auc")@y.values[[1]]) 

} 

auc_mean_pROC <- mean(auc_pROC) 
auc_sd_pROC <- sd(auc_pROC) 
auc_mean_ROCR <- mean(auc_ROCR) 
auc_sd_ROCR <- sd(auc_ROCR) 

結果は多少異なります

auc_mean_pROC auc_sd_pROC auc_mean_ROCR auc_sd_ROCR 
1  0.8755556 0.1524801  0.8488889 0.2072751 

は私が平均AUCの計算は次のように、多くの場合、私に異なる結果を与えていることに気づきました

> auc_pROC 
[1] 0.8333333 0.8333333 1.0000000 1.0000000 0.6666667 0.8333333 0.3333333 0.8333333 1.0000000 1.0000000 1.0000000 1.0000000 
[13] 0.8333333 0.5000000 0.8888889 1.0000000 1.0000000 1.0000000 0.8333333 0.8333333 0.8333333 0.6666667 0.6666667 0.8888889 
[25] 0.8333333 0.6666667 1.0000000 0.6666667 1.0000000 0.6666667 1.0000000 1.0000000 0.8333333 0.8333333 0.8333333 1.0000000 
[37] 0.8333333 1.0000000 0.8333333 1.0000000 0.8333333 1.0000000 1.0000000 0.6666667 1.0000000 1.0000000 1.0000000 1.0000000 
[49] 1.0000000 1.0000000 
> auc_ROCR 
[1] 0.8333333 0.8333333 1.0000000 1.0000000 0.3333333 0.8333333 0.3333333 0.8333333 1.0000000 1.0000000 1.0000000 1.0000000 
[13] 0.8333333 0.5000000 0.8888889 1.0000000 1.0000000 1.0000000 0.8333333 0.8333333 0.8333333 0.3333333 0.6666667 0.8888889 
[25] 0.1666667 0.6666667 1.0000000 0.6666667 1.0000000 0.6666667 1.0000000 1.0000000 0.8333333 0.8333333 0.8333333 1.0000000 
[37] 0.8333333 1.0000000 0.8333333 1.0000000 0.8333333 1.0000000 1.0000000 0.6666667 1.0000000 1.0000000 1.0000000 1.0000000 
[49] 1.0000000 1.0000000 
[5][22][25]で私は他のSVM-RFEモデルで試しましたが、問題は残っています。なぜこうなった?私は何か間違っているのですか?

答えて

3

デフォルトでは、pROC内のroc関数は、コントロールとケースの観察の応答レベル(levels引数を設定してデフォルトをオーバーロードしたもの)とコントロールの値の大小を判断する必要があります。後者を設定するのに、direction引数を使用していません。

データを再サンプリングすると、この自動検出はすべてのサンプルで行われます。また、サンプルのサイズが小さかったり、AUCが0.5に近くなったりすると、反対方向のROC曲線が生成され、平均値をより高い値に偏らせることができます。

rocCurve <- roc(response = labels_NG3[[i]], 
       predictor = predictions_NG3[[i]], 
       direction = "<", 
       levels = c("BREAST","LUNG")) 
+0

をありがとう:あなたは、例えば、ROC曲線または類似をリサンプリングするとき

は、したがって、あなたは常に明示的direction引数を設定する必要があります!あなたのソリューションは機能しました! 'caret'パッケージを使ってSVM-RFEモデルを計算するときにこの' direction'引数を設定する方法があるかどうか知っていますか? 'rfe'関数によって計算された自動平均AUC値は間違っています。 –