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
予測は分類の連続予測であり、ラベルは各変数のバイナリの真実です。
したがって、次のようなものが機能するはずです。
> 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, ...)
}
@Jeffが言ったように、あなたの予測はROCR
のprediction
関数に対して連続的である必要があります。 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]
などになるため、呼び出している各関数のヘルプファイルを確認してください。
これはあなたがそれを行う方法です:
データを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
問題は、他の人が指摘したように、ROCRの予測は数値を期待していることです。 randomForest
から予測を挿入する場合(ROCRの予測への最初の引数として)、その予測は、デフォルトのtype='prob'
ではなくtype='response'
によって生成される必要があります。または、type='response'
の結果を取得して数値に変換することもできます(つまり、応答が0/1の場合)。しかし、それをプロットすると、ROCRはROC曲線上に単一の意味のあるポイントを生成します。 ROC曲線上に多くのポイントを持つためには、各予測に関連付けられた確率が本当に必要です。つまり、予測の生成にtype='prob'
を使用します。
これを試してください:
library(ROCR)
pred<-ROCR::prediction(bankrf.pred$y, bank_testing$c(0,1)
関数の予測が存在する多くのパッケージです。 ROCRにあるものを使用するには、明示的に(ROCR::)を指定する必要があります。これは私のために働いた。
問題は、たとえば交差検証の場合、複数の実行で予測関数を実行したいことです。
予測(predictions、labels、label.ordering = NULL)関数のこの場合、「predictions」および「labels」変数のクラスはリストまたは行列でなければなりません。