Một khi bạn có xác suất dự đoán, tùy thuộc vào ngưỡng bạn muốn sử dụng. Bạn có thể chọn ngưỡng để tối ưu hóa độ nhạy, độ đặc hiệu hoặc bất kỳ biện pháp nào quan trọng nhất trong ngữ cảnh của ứng dụng (một số thông tin bổ sung sẽ hữu ích ở đây để có câu trả lời cụ thể hơn). Bạn có thể muốn xem xét các đường cong ROC và các biện pháp khác liên quan đến phân loại tối ưu.
Chỉnh sửa: Để làm rõ câu trả lời này phần nào tôi sẽ đưa ra một ví dụ. Câu trả lời thực sự là việc cắt tối ưu phụ thuộc vào thuộc tính nào của trình phân loại là quan trọng trong ngữ cảnh của ứng dụng. Hãy là giá trị đích thực cho quan sát tôi , và Y i là lớp dự đoán. Một số biện pháp phổ biến của hiệu suất làYiiY^i
(1) Độ nhạy: - tỷ lệ '1 của được xác định một cách chính xác như vậy.P(Y^i=1|Yi=1)
P(Y^i=0|Yi=0)
P(Yi=Y^i)
(1) cũng được gọi là Tỷ lệ dương thực sự, (2) cũng được gọi là Tỷ lệ âm tính thực sự.
(1,1)
δ=[P(Yi=1|Y^i=1)−1]2+[P(Yi=0|Y^i=0)−1]2−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√
δ(1,1)
Dưới đây là một ví dụ mô phỏng sử dụng dự đoán từ mô hình hồi quy logistic để phân loại. Điểm cắt được thay đổi để xem mức cắt nào mang lại cho phân loại "tốt nhất" theo từng biện pháp trong ba biện pháp này. Trong ví dụ này, dữ liệu đến từ mô hình hồi quy logistic với ba yếu tố dự đoán (xem mã R bên dưới biểu đồ). Như bạn có thể thấy từ ví dụ này, việc cắt "tối ưu" phụ thuộc vào biện pháp nào là quan trọng nhất - điều này hoàn toàn phụ thuộc vào ứng dụng.
P(Yi=1|Y^i=1)P(Yi=0|Y^i=0)
# 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"))