의사 결정 트리에 대한 ROC 곡선을 그리는 방법은 무엇입니까?


13

일반적으로 의사 결정 트리와 같은 이산 분류기의 ROC 곡선을 그릴 수 없습니다. 내가 맞아? Dtrees에 ROC 곡선을 그리는 방법이 있습니까?


1
여기에서 aswer를 찾을 수 있습니다 : stats.stackexchange.com/questions/105501/…
rapaio

[R의 "훈련 세트"와 "테스트 세트"에 대한 의사 결정 트리 모델 평가] [1] [1] : stats.stackexchange.com/questions/49416/… 여기에서 답변을 찾을 수 있습니다.
Sangram

@rapaio 죄송합니다. 링크에서 분류기에서 1과 0 (연속 값) 사이의 출력을 생성하는 임계 값을 찾기위한 ROC 곡선이 표시됩니다.
DataMiner

@ Sangram 이들은 R의 솔루션이지만 작동 방식을 이해하고 싶습니다.
DataMiner

답변:


15

분류 기가 점수없이 요인 결과 만 (라벨 만) 생성하는 경우에도 ROC 곡선을 그릴 수 있습니다. 그러나이 ROC 곡선은 단지 포인트입니다. ROC 공간을 고려할 때이 점은 . 여기서 FPR- 위양성 비율 및 TPR- 양수 비율입니다.(x,y)=(FPR,TPR)FPRTPR

Wikipedia 페이지 에서이 계산 방법에 대해 자세히 알아보십시오 .

(0,0)(1,1)

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


12

의사 결정 트리의 경우 클래스는 여전히 어느 정도 확실하게 예측됩니다. 대답은 이미 @rapaio가 제공하지만 조금 더 확장하겠습니다.

(이것은이 약간의 수정 된 버전의 다음과 같은 의사 결정 트리를 상상 )

의사 결정 트리 예

각 노드에는 대다수 클래스 레이블뿐만 아니라 해당 리프에서 끝나는 다른 레이블도 있으므로 레이블을 예측하는 해당 리프에 확실성을 지정할 수 있습니다.

예를 들어 다음 데이터를 고려하십시오.

데이터

우리는 그것을 실행하고 실제 레이블이 아닌 출력에 점수를 할당합니다. 이를 통해 여기에 제안 된 것처럼 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.