2013-12-11 363 views
2

當我在R(PROC包)使用multiclass.roc功能,比如,我訓練數據隨機林中,這裏是我的代碼:如何處理R(pROC包)中的多類ROC分析?

# randomForest & pROC packages should be installed: 
# install.packages(c('randomForest', 'pROC')) 
data(iris) 
library(randomForest) 
library(pROC) 
set.seed(1000) 
# 3-class in response variable 
rf = randomForest(Species~., data = iris, ntree = 100) 
# predict(.., type = 'prob') returns a probability matrix 
multiclass.roc(iris$Species, predict(rf, iris, type = 'prob')) 

,其結果是:

Call: 
multiclass.roc.default(response = iris$Species, predictor = predict(rf,  
iris, type = "prob")) 
Data: predict(rf, iris, type = "prob") with 3 levels of iris$Species: setosa, 
versicolor, virginica. 
Multi-class area under the curve: 0.5142 

這是正確的嗎?謝謝!!!

「過程」參考:http://www.inside-r.org/packages/cran/pROC/docs/multiclass.roc

回答

7

正如你在參考文獻中看到的,multiclass.roc需要一個「數字向量(...)」,並且從那裏鏈接的roc的文檔(由於某些原因,不在你提供的鏈接中)進一步說「與response相同的長度「。您正在傳遞一個3列的數字矩陣,這顯然是錯誤的,自從pROC 1.6開始不再支持。我不知道它在做什麼,可能不是你所期望的。

這意味着您必須在數字模式的單個原子矢量中總結您的預測。在模型的情況下,可以使用以下,但一般並沒有真正意義的一個因素轉換成一個數字:

predictions <- as.numeric(predict(rf, iris, type = 'response')) 
multiclass.roc(iris$Species, predictions) 

這段代碼確實是計算3條ROC曲線您預測(一個與setosa vs. versicolor,一個與versicolor vs. virginica,另一個與setosa vs. virginica),平均AUC。

三篇更多評論:

  • 我說的一個因素轉化爲數字是沒有意義的,因爲你會得到不同的結果,如果你沒有一個完美的分類和重新排列你的水平。這就是爲什麼它不能在pROC中自動完成:你必須在你的設置中考慮它。
  • 一般來說,這種多類別平均並不真正有意義,而且您最好在二元分類方面重新考慮您的問題。還有更多先進的多類方法(使用ROC曲面等)還沒有在pROC中實現
  • 正如@cbeleites所述,使用其訓練數據(重新替代)來評估模型是不正確的,因此在真正的例子,你必須保留測試或使用交叉驗證。
1

假設你做的resubstitution估計只對最低工作示例代碼對我來說很好的緣故。

我很快嘗試使用「prob」類型獲得oob預測,但沒有成功。因此,您需要在randomForest函數外部進行驗證。

就我個人而言,我不會試圖將整個多類模型歸納爲一個無條件數。但這是一個完全不同的問題。

+0

我很抱歉,我不太瞭解你的意思。 –

+0

有一個例子顯示'multiclass.auc' [link](http://www.inside-r.org/packages/cran/pROC/docs/multiclass.roc)的方法,但我不知道是什麼's100b'的意思是。它一定不是概率,但它是什麼?謝謝! –

0

我複製了你的代碼,得到了.83的AUC。不知道有什麼不同。

你是對的,s100b列不是概率。 aSAH(動脈瘤性蛛網膜下腔出血)數據集是一組臨牀數據集。 s100b是一種在大腦神經膠質細胞中發現的蛋白質。從關於數據集的研究報告中,s100b列似乎代表血樣中可能的s100b蛋白濃度(ug/l)。

+0

你的意思是你的實驗結果是0.83?另外,你的意思是's100b'是一個真正的變量,但不是'分數'?但是當我使用'multiclass.roc'函數時,'predictor'是一個概率矩陣,因此它應該是錯誤的。這個問題的確切答案是什麼? –

+0

對不起,如果我讓事情更混亂。 pROC幫助文檔只是指出'predictor'參數是一個數字向量。所以我相信你在虹膜數據上的第一個例子是正確的。所以我正在評論你在pROC文檔中使用的例子(使用aSAH數據集)。數據(aSAH)'之後,我查看了幫助中鏈接的研究論文('?aSAH')。如果你搜索s100b,你會發現它看起來像一種蛋白質的濃度。 –

+0

實際上,我最初的例子'虹膜數據'在'multiclass.roc'函數中使用了概率矩陣作爲'predictor'。但問題是AUC的結果並不顯着(_0.5142_)!因此,我認爲我的代碼錯了,雖然我不知道如何糾正它。謝謝! –