web-dev-qa-db-ja.com

ROCRパッケージを使用したRのROC曲線

ROCRでROC曲線をプロットする方法を教えてください。私は最初に実行する必要があることを知っています:

prediction(predictions, labels, label.ordering = NULL)

その後:

performance(prediction.obj, measure, x.measure="cutoff", ...)

私は予測とラベルが何を意味するのか明確ではありません。 ctreeとcforestを使用してモデルを作成し、最終的に両方のROC曲線で比較したいと思います。私の場合、クラス属性はy_nであり、ラベルに使用する必要があります。しかし、予測はどうですか?ここに私がすることの手順があります(データセット名= bank_part):

pred<-cforest(y_n~.,bank_part)
tablebank<-table(predict(pred),bank_part$y_n)
prediction(tablebank, bank_part$y_n)

最後の行を実行した後、私はこのエラーを受け取ります:

Error in prediction(tablebank, bank_part$y_n) : 
Number of cross-validation runs must be equal for predictions and labels.

前もって感謝します!

別の例を次に示します。トレーニングデータセット(bank_training)とテストデータセット(bank_testing)があり、以下のようにrandomForestを実行しました。

bankrf<-randomForest(y~., bank_training, mtry=4, ntree=2,    
keep.forest=TRUE,importance=TRUE) 
bankrf.pred<-predict(bankrf, bank_testing, type='response')

これで、bankrf.predは、ラベルc =( "0"、 "1")を持つ因子オブジェクトです。それでも、ROCをプロットする方法がわかりません。予測の部分にこだわるからです。これが私がやることだ

library(ROCR) 
pred<-prediction(bankrf.pred$y, bank_testing$c(0,1) 

しかし、これはまだ間違っています。エラーメッセージが表示されるからです。

Error in bankrf.pred$y_n : $ operator is invalid for atomic vectors
22
spektra

予測は分類の連続予測であり、ラベルは各変数のバイナリの真実です。

したがって、次のようなものが機能するはずです。

> pred <- prediction(c(0.1,.5,.3,.8,.9,.4,.9,.5), c(0,0,0,1,1,1,1,1))
> perf <- performance(pred, "tpr", "fpr")
> plot(perf)

rOCを生成します。

編集:質問に再現可能なサンプルコードを含めると役立つ場合があります(コメントの解釈に苦労しています)。

ここに新しいコードはありませんが、... ROCのプロットによく使用する関数を次に示します。

 plotROC <- function(truth, predicted, ...){
   pred <- prediction(abs(predicted), truth)    
   perf <- performance(pred,"tpr","fpr")

   plot(perf, ...)
}
24
Jeff Allen

@Jeffが言ったように、あなたの予測はROCRprediction関数に対して連続的である必要があります。 require(randomForest); ?predict.randomForestは、デフォルトで_predict.randomForest_が元のスケール(分類ではクラスラベル)で予測を返し、predict.randomForest(..., type = 'prob')は各クラスの確率を返すことを示します。そう:

_require(ROCR)
data(iris)
iris$setosa <- factor(1*(iris$Species == 'setosa'))
iris.rf <- randomForest(setosa ~ ., data=iris[,-5])
summary(predict(iris.rf, iris[,-5]))
summary(iris.preds <- predict(iris.rf, iris[,-5], type = 'prob'))
preds <- iris.preds[,2]
plot(performance(prediction(preds, iris$setosa), 'tpr', 'fpr'))
_

あなたが欲しいものを与えます。予測パッケージを取得するには、分類パッケージごとに異なるコマンドが必要です。場合によってはpredict(..., type='probs')predict(..., type='prob')[,2]などになるため、呼び出している各関数のヘルプファイルを確認してください。

7
lockedoff

これはあなたがそれを行う方法です:

データをcsvファイル( "data_file.csv")に保存しますが、ここで完全なパスを指定する必要があります。そのファイルには列ヘッダーがあり、ここでは「default_flag」、「var1」、「var2」、「var3」を使用します。default_flagは0または1で、他の変数には任意の値があります。 Rコード:

rm(list=ls())
df <- read.csv("data_file.csv") #use the full path if needed
mylogit <- glm(default_flag ~  var1 + var2 + var3, family = "binomial" , data = df)

summary(mylogit)
library(ROCR)

df$score<-predict.glm(mylogit, type="response" )
pred<-prediction(df$score,df$default_flag)
perf<-performance(pred,"tpr", "fpr")
plot(perf)
auc<- performance(pred,"auc")
auc

Df $ scoreはデフォルトの確率を与えることに注意してください。このロジット(同じ回帰係数)を使用して、クロス検証用に別のデータdf2セットでテストする場合は、

df2 <- read.csv("data_file2.csv")

df2$score<-predict.glm(mylogit,newdata=df2, type="response" )

pred<-prediction(df2$score,df2$default_flag)
perf<-performance(pred,"tpr", "fpr")
plot(perf)
auc<- performance(pred,"auc")
auc
4
Mariav

問題は、他の人が指摘したように、ROCRの予測は数値を期待していることです。 randomForestから予測を挿入する場合(ROCRの予測への最初の引数として)、その予測は、デフォルトのtype='prob'ではなくtype='response'によって生成される必要があります。または、type='response'の結果を取得して数値に変換することもできます(つまり、応答が0/1の場合)。しかし、それをプロットすると、ROCRはROC曲線上に単一の意味のあるポイントを生成します。 ROC曲線上に多くのポイントを持つためには、各予測に関連付けられた確率が本当に必要です。つまり、予測の生成にtype='prob'を使用します。

1
Oytun

これを試してください:

library(ROCR)
pred<-ROCR::prediction(bankrf.pred$y, bank_testing$c(0,1)

関数の予測が存在する多くのパッケージです。 ROCRにあるものを使用するには、明示的に(ROCR::)を指定する必要があります。これは私のために働いた。

0
Jawahar Sam

問題は、たとえば交差検証の場合、複数の実行で予測関数を実行したいことです。

予測(predictions、labels、label.ordering = NULL)関数のこの場合、「predictions」および「labels」変数のクラスはリストまたは行列でなければなりません。

0
sztup