Bagaimana kita bisa menggambar kurva ROC untuk pohon keputusan?

13

Biasanya kita tidak bisa menggambar kurva ROC untuk pengklasifikasi diskrit seperti pohon keputusan. Apakah saya benar? Apakah ada cara untuk menggambar kurva ROC untuk Dtrees?

DataMiner
sumber
1
Anda dapat menemukan aswer Anda di sini: stats.stackexchange.com/questions/105501/...
rapaio
[Evaluasi model pohon keputusan untuk "set pelatihan" vs "set pengujian" dalam R] [1] [1]: stats.stackexchange.com/questions/49416/… Anda dapat menemukan jawaban Anda di sini.
Sangram
@rapaio Maaf, tautan Anda menampilkan kurva ROC untuk menemukan ambang batas dalam pengklasifikasi yang menghasilkan output antara 1 dan 0 (nilai kontinu).
DataMiner
@Sangram Ini adalah solusi dalam R tetapi saya ingin hanya mengerti cara kerjanya.
DataMiner

Jawaban:

15

Jika classifier Anda hanya menghasilkan hasil faktor (hanya label), tanpa skor, Anda masih bisa menggambar kurva ROC. Namun kurva ROC ini hanya satu titik. Mempertimbangkan ruang ROC, poin ini adalah , di mana FPR - tingkat positif palsu dan TPR - tingkat positif sejati.(x,y)=(FPR,TPR)FPRTPR

Lihat lebih lanjut tentang bagaimana ini dihitung pada halaman Wikipedia .

(0,0)(1,1)

TFTF(scoreT,scoreF)=(countTcountT+countF,countFcountT+countF)=(10/15,5/15)=(0.66,0.33)

rapaio
sumber
12

Untuk Decision Tree, kelas masih diprediksi dengan tingkat kepastian tertentu. Jawabannya sudah diberikan oleh @rapaio, tapi saya akan sedikit mengembangkannya.

Bayangkan pohon keputusan berikut (itu versi sedikit modifikasi dari ini satu )

contoh pohon keputusan

Pada setiap node tidak hanya label kelas mayoritas, tetapi juga orang lain apa yang berakhir di daun itu, sehingga kita dapat menetapkan tingkat kepastian untuk daun di mana kita memprediksi label.

Sebagai contoh, perhatikan data berikut

data

Kami menjalankannya, dan menetapkan skor ke output, bukan label yang sebenarnya. Dengan ini, kita bisa menggambar kurva ROC, seperti yang disarankan di sini

kurva roc

Namun, tidak masuk akal untuk menggunakannya untuk menyetel ambang Anda (karena, tentu saja, tidak ada yang namanya ambang di Pohon Keputusan), tetapi masih dapat digunakan untuk menghitung AUC, yang, dalam hal ini, adalah 0,92

Kode R yang digunakan di sini:

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')
Alexey Grigorev
sumber