답변:
예측 된 확률이 있으면 사용하려는 임계 값에 달려 있습니다. 감도, 특이성 또는 응용 프로그램의 맥락에서 가장 중요한 측정 값을 최적화하기 위해 임계 값을 선택할 수 있습니다 (일부 추가 정보는 여기에서보다 구체적인 답변에 도움이됩니다). ROC 곡선 및 최적 분류와 관련된 기타 측정 값을보고 싶을 수 있습니다.
편집 : 이 대답을 다소 명확하게하기 위해 예를 들어 보겠습니다. 실제 해답은 최적 컷오프는 응용 프로그램의 맥락에서 중요한 분류기의 속성에 달려 있다는 것입니다. 하자 관찰에 대한 진정한 가치가 될 , 그리고 예측 클래스합니다. 몇 가지 일반적인 성능 측정 값은
(1) 감도 : - '1'의 비율로 정확하게 식별됩니다.
(2) 특이성 : -올바르게 식별되는 '0'의 비율
(3) (올바른) 분류 비율 : -정확한 예측 비율.
(1)은 True Positive Rate라고도하며, (2)는 True Negative Rate라고도합니다.
예를 들어 분류자가 비교적 안전한 치료법을 가진 심각한 질병에 대한 진단 테스트를 평가하려는 경우 민감도는 특이성보다 훨씬 중요합니다. 다른 경우에, 질병이 비교적 경미하고 치료가 위험하다면, 특이성이 제어에 더 중요 할 것이다. 일반적인 분류 문제의 경우 감도와 사양을 공동으로 최적화하는 것이 "좋은"것으로 간주됩니다. 예를 들어 지점에서 유클리드 거리를 최소화하는 분류기를 사용할 수 있습니다 .
는 응용의 맥락 에서 으로부터의보다 합리적인 거리 측정을 반영하기 위해 다른 방법으로 가중치를 부여하거나 수정할 수 있습니다 .-(1,1)로부터의 유클리드 거리는 설명을 위해 임의로 선택되었습니다. 어쨌든 응용 프로그램에 따라이 네 가지 측정 모두가 가장 적절할 수 있습니다.
다음은 로지스틱 회귀 모델의 예측을 사용하여 분류 한 시뮬레이션 예제입니다. 컷오프는이 세 가지 측정 값 각각에서 "최상의"분류기를 제공하는 컷오프를보기 위해 다양합니다. 이 예에서 데이터는 세 개의 예측 변수가있는 로지스틱 회귀 모델에서 나온 것입니다 (아래 그림의 R 코드 참조). 이 예에서 볼 수 있듯이 "최적"컷오프는 이러한 측정 중 어느 것이 가장 중요한지에 따라 달라집니다. 이는 전적으로 응용 프로그램에 따라 다릅니다.
편집 2 : 및 , 양의 예측 값 및 음의 예측 값 ( 이는 동일 하지 않습니다 . 감도 및 특이성)도 유용한 성능 측정 방법이 될 수 있습니다.
# data y simulated from a logistic regression model
# with with three predictors, n=10000
x = matrix(rnorm(30000),10000,3)
lp = 0 + x[,1] - 1.42*x[2] + .67*x[,3] + 1.1*x[,1]*x[,2] - 1.5*x[,1]*x[,3] +2.2*x[,2]*x[,3] + x[,1]*x[,2]*x[,3]
p = 1/(1+exp(-lp))
y = runif(10000)<p
# fit a logistic regression model
mod = glm(y~x[,1]*x[,2]*x[,3],family="binomial")
# using a cutoff of cut, calculate sensitivity, specificity, and classification rate
perf = function(cut, mod, y)
{
yhat = (mod$fit>cut)
w = which(y==1)
sensitivity = mean( yhat[w] == 1 )
specificity = mean( yhat[-w] == 0 )
c.rate = mean( y==yhat )
d = cbind(sensitivity,specificity)-c(1,1)
d = sqrt( d[1]^2 + d[2]^2 )
out = t(as.matrix(c(sensitivity, specificity, c.rate,d)))
colnames(out) = c("sensitivity", "specificity", "c.rate", "distance")
return(out)
}
s = seq(.01,.99,length=1000)
OUT = matrix(0,1000,4)
for(i in 1:1000) OUT[i,]=perf(s[i],mod,y)
plot(s,OUT[,1],xlab="Cutoff",ylab="Value",cex.lab=1.5,cex.axis=1.5,ylim=c(0,1),type="l",lwd=2,axes=FALSE,col=2)
axis(1,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
axis(2,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
lines(s,OUT[,2],col="darkgreen",lwd=2)
lines(s,OUT[,3],col=4,lwd=2)
lines(s,OUT[,4],col="darkred",lwd=2)
box()
legend(0,.25,col=c(2,"darkgreen",4,"darkred"),lwd=c(2,2,2,2),c("Sensitivity","Specificity","Classification Rate","Distance"))