2016-05-17 10 views
1

RのROCRパッケージを使用して簡単なケースをテストしています。基本的に、ここに私のコードです。私は真の値のセットを持っており、それぞれの値に対して予測があり、予測が| 2 |真の値、およびそれ以外の場合は0、このようなの:ROCRパッケージ...何が得られないのですか?

ID<- c(1,2,3,4,5) 
    preds<-c(6,3,2,1,4) 
    truevals<- c(8,4,2,1,7) 
    df<-data.frame(ID, preds,truevals) 
    df<- mutate(df, labels = ifelse(abs(df$preds - df$truevals) < 2, 1, 0)) 
    predtest<-prediction(df$preds, df$labels) 
    auc <- performance(predtest, 'auc') 

しかし、私の計算されたAUCが0である、すなわち

> [email protected][[1]] 
[1] 0 

私の質問は、私が間違って何をやっているのですか?明らかに、いくつかの分類は「正しい」ので、なぜAUCはゼロでなければならないのですか?私は何を理解していないのですか?私の値はIDで整理されています。つまり、IDが1から5の人々の測定値であると仮定しています。考慮していない発注の問題はありますか?ありがとう。

+0

どちらも良い回答 – roccomay

答えて

1

今ウィキペディアからのAUCの定義を見て:

[AUC]は分類器がランダムに選択され 負の(より高い ランダムに選択された正のインスタンスをランク付けする確率に等しいです。 「陽性」が「陰性」より高いと仮定して)。 (1)

は、今大会で、1 Sは通常陽性とみなされ、0のネガされます。

A.場合:私達はちょうど見たように、あなたの1秒、今陽性、ランクネガ(0秒)よりも低く、その確率は、彼らは高いが0

であることをあなたは3つのオプションを持っていますあなたの1 sがネガあり、ROCRはlabel.ordering引数があります:あなたの1 sが陽性は確かであれば陽性が高くなるように、あなたの予測を逆にすることができ、

predtest <- prediction(df$preds, df$labels, label.ordering = c(1, 0)) 
auc <- performance(predtest, 'auc') 
[email protected][[1]] 
[1] 1 

B.を(- SIGに気付きますN df$labelsの前):

predtest <- prediction(df$preds, -df$labels) 
auc <- performance(predtest, 'auc') 
[email protected][[1]] 
[1] 1 

C.すなわちクラシファイアがランダムに選択された負のより低いランダムに選択された正のインスタンスをランク付けする確率になるようにあなたはまた、AUCの定義を逆にできました。 ROCRはこれをサポートしていませんが、他のパッケージでは自動的にこれを選択することもできます。

結局のところ、あなたのAUCが0.5よりも高いか小さいかは問題ではありませんが、対角線からどれだけ離れていますか。それが0.5よりも低い場合、または「ランダムより悪い」場合は、ランダムを上回る効果を発揮するために解釈を逆にするだけです。

2

あなたのデータははっきりと分離可能です。 pred 1あなたはそれがちょうど参照の問題です0のAUCと同じである1に等しいAUCを与えるべきであるラベル0

label 1と4と6、外出先で行く3。

library(ROCR) 
ID = c(1,2,3,4,5) 
preds = c(6,3,2,1,4) 
truevals = c(8,4,2,1,7) 
df = data.frame(ID, preds,truevals) 
df = mutate(df, labels = ifelse(abs(df$preds - df$truevals) < 2, 1, 0)) 
#Changing the labels is just a matter of reference 
#the algorithm is oblivious to their meaning 
df$labels = 1 - df$labels 
predtest = prediction(df$preds, df$labels) 
auc = performance(predtest, "auc") 

出力:

> [email protected][[1]] 
[1] 1 

スイッチングラベルがが漏れに関する問題を提起が、私はそれが問題の範囲内ではないと仮定し

は、ここでの例です。

EDIT: AUCは分離可能性の尺度であり、ランダムなポジティブなインスタンスをランダムなネガティブなインスタンスよりも高くランク付けする確率です。 ROC曲線は、単純にx:1-特異性およびy:感受性で、予測値の分類のしきい値が異なります。

ので、:

[...]私は値の任意のセットと それらの値の予測のセットを持っている場合、どのように私はROC曲線を得るのですか?私は本当に混乱しています。私は 予測が近いほど良いと思いますか?私はちょうどそれを行う方法がわからない これ。私はクラスを本当の値に割り当てる方法を知らない。 いくつかの並べ替えのランキングが必要ですか?

バイナリカテゴリデータのセットと連続予測子があります。ここで、プレディクタにしきい値を設定し、そのしきい値より高い観測値を1つのクラスまたはそれ以外のクラスに分類します。特異性と感度を測定し、その点をあなたのカーブにマークしてください。他の閾値を試してください(SensとSpecを変更する有限の可能性があります)、それらの点を曲線にプロットしてください。これがROC曲線です。

AUCは、予測子に関するクラスの分離度が高いほど高くなります。それらが重ね合わされるほど、AUCは低くなる。0クラスの予測が1クラスのものより高い方法

boxplot(preds ~ labels, data = df) 

Boxplot of predictions as a function of labels

注意:データのボックスプロットを描画し、何が起こっているか理解する

+0

こんにちは?これは役に立たない。 ROC曲線をプロットすると、斜め下になります。これは正しいことではありません。 – roccomay

+0

しかし、これらのラベルは、予測が有効かどうかを示すことを目的としています。分離可能なデータがない場合はどうなりますか?これはどうやって変わるだろうか? – roccomay

+0

0.5は、無差別線a.k.a.ランダム確率予測のAUCである。それは最悪の結果です。 –

関連する問題