決定木のROC曲線をどのように描くことができますか?


13

通常、決定木のような離散的な分類器に対してROC曲線を描くことはできません。私は正しいですか?DtreesのROC曲線を描く方法はありますか?


1
あなたはここにあなたのaswerを見つけることができます:stats.stackexchange.com/questions/105501/...
rapaio

[Rの「トレーニングセット」対「テストセット」のデシジョンツリーモデルの評価] [1] [1]:stats.stackexchange.com/questions/49416/… ここで答えを見つけることができます。
サングラム14

@rapaio申し訳ありませんが、リンクは1〜0(連続値)の間の出力を生成する分類子のしきい値を見つけるためのROC曲線を示しています。
DataMiner 14

@SangramこれらはRのソリューションですが、その仕組みを理解したいだけです。
DataMiner 14

回答:


15

分類子がスコアなしで因子の結果のみ(ラベルのみ)を生成する場合でも、ROC曲線を描画できます。ただし、このROC曲線はポイントにすぎません。ROCスペースを考慮すると、このポイントは。ここで、FPR-偽陽性率およびTPR-真陽性率です。バツy=FPRTPRFPRTPR

これがどのように計算されるかについては、ウィキペディアのページをご覧ください

0011

TFTFスコアTスコアF=カウントTカウントT+カウントFカウントFカウントT+カウントF=10/155/15=0.660.33


12

デシジョンツリーの場合、クラスはある程度の確実性で予測されます。答えはすでに@rapaioによって与えられていますが、もう少し詳しく説明します。

以下の決定木を想像してみて(それはこの少し変更したバージョンです1

決定木の例

各ノードには多数クラスのラベルだけでなく、その葉で終わった他のラベルもあるため、ラベルを予測する葉に確実性の度合いを割り当てることができます。

たとえば、次のデータを考えます

データ

それを実行し、実際のラベルではなく、出力にスコアを割り当てます。これにより、ここで提案しようなROC曲線を描くことができます

roc曲線

ただし、それを使用してしきい値を調整することはほとんど意味がありません(もちろん、決定木にはしきい値などはありません)が、AUCの計算には使用できます。この場合は0.92です。

ここで使用されるRコード:

outlook = c('rain', 'overcast', 'rain', 'sunny', 'rain', 
            'rain', 'sunny', 'overcast', 'overcast', 'overcast', 
            'sunny', 'sunny', 'rain', 'rain', 'overcast',
            'sunny', 'overcast', 'overcast', 'sunny', 'sunny',
            'sunny', 'overcast')
humidity = c(79, 74, 80, 60, 65, 79, 60, 74, 77, 80, 
             71, 70, 80, 65, 70, 56, 80, 70, 56, 70,
             71, 77)
windy = c(T, T, F, T, F, T, T, T, T, F, T, F, F, F, T, T, F, T, T, F, T, T)
play = c(F, F, T, F, T, F, F, T, T, T, F, F, T, T, T, T, T, T, F, T, F, T)

game = data.frame(outlook, humidity, windy, play)
game$score = NA

attach(game)
game$score[outlook == 'sunny' & humidity <= 70] = 5/8
game$score[outlook == 'sunny' & humidity > 70] = 1 - 3/4
game$score[outlook == 'overcast'] = 4/5
game$score[outlook == 'rain' & windy == T] = 1 - 2/2
game$score[outlook == 'rain' & windy == F] = 3/3
detach(game)

game$predict = game$score >= 0.5
game$correct = game$predict == game$play

library(ROCR)

pred = prediction(game$score, game$play)
roc = performance(pred, measure="tpr", x.measure="fpr")
plot(roc, col="orange", lwd=2) 
lines(x=c(0, 1), y=c(0, 1), col="red", lwd=2)

auc = performance(pred, 'auc')
slot(auc, 'y.values')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.