Отримання прогнозованих значень (Y = 1 або 0) з моделі логістичної регресії


50

Скажімо, у мене є об'єкт класу glm(відповідає логістичній регресійній моделі), і я хотів би перетворити передбачувані ймовірності, отримані за predict.glmдопомогою аргументу, type="response"у бінарні відповіді, тобто або . Який найшвидший і найбільш канонічний спосіб зробити це в R?Y=1Y=0

Хоча, знову ж таки, мені відомо predict.glm, я не знаю, де саме живе значення - і я думаю, що це мій головний камінь спотикання тут.P(Yi=1|X^i)

Відповіді:


77

Після того, як у вас є прогнозовані ймовірності, саме від вас залежить, який поріг ви хочете використовувати. Ви можете вибрати поріг, щоб оптимізувати чутливість, специфіку чи будь-який мір, який є найважливішим у контексті програми (дещо додаткова інформація буде корисна тут для більш конкретної відповіді). Ви можете переглянути криві ROC та інші заходи, пов'язані з оптимальною класифікацією.

Редагувати: Щоб дещо уточнити цю відповідь, я надам приклад. Справжня відповідь полягає в тому, що оптимальне відсічення залежить від того, які властивості класифікатора важливі в контексті програми. Нехай - справжнє значення для спостереження , а - передбачуваний клас. Деякі загальні заходи ефективності єYiiY^i

(1) Чутливість: - частка '1, які правильно ідентифіковані як так.P(Y^i=1|Yi=1)

(2) Специфіка: - частка '0, які правильно ідентифіковані як такP(Y^i=0|Yi=0)

(3) (Правильний) Коефіцієнт класифікації: - частка правильних прогнозів.P(Yi=Y^i)

(1) також називається істинною позитивною швидкістю, (2) також називається істинною негативною швидкістю.

Наприклад, якщо ваш класифікатор мав на меті оцінити діагностичний тест на серйозне захворювання, яке має відносно безпечне лікування, чутливість набагато важливіша, ніж специфічність. В іншому випадку, якщо хвороба була відносно незначною, а лікування було ризикованим, важливіше було б контролювати специфіку. Для загальних проблем із класифікацією вважається "добре" спільно оптимізувати чутливість та специфікацію - наприклад, ви можете використовувати класифікатор, що мінімізує їх евклідову відстань від точки :(1,1)

δ=[P(Yi=1|Y^i=1)1]2+[P(Yi=0|Y^i=0)1]2

δ може бути зважена або модифікована іншим способом, щоб відобразити більш розумну міру відстані від в контексті програми - евклідова відстань від (1,1) тут була обрана довільно для ілюстративних цілей. У будь-якому випадку всі ці чотири заходи можуть бути найбільш підходящими, залежно від заявки.(1,1)

Нижче наводиться модельований приклад з використанням прогнозування з логістичної регресійної моделі для класифікації. Обрізання залежить від того, який зріз дає "найкращий" класифікатор за кожним із цих трьох заходів. У цьому прикладі дані походять з логістичної регресійної моделі з трьома предикторами (див. Код R нижче графіку). Як видно з цього прикладу, "оптимальне" відсічення залежить від того, який із цих заходів є найважливішим - це повністю залежить від застосування.

Редагуйте 2: та , додатне прогнозне значення та від'ємне передбачувальне значення (зверніть увагу, що вони НЕ однакові як чутливість та специфічність) також можуть бути корисними заходами ефективності.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"))

2
(+1) Дуже приємна відповідь. Мені подобається приклад. Чи є у вас готова інтерпретація, яка вам відома, щоб мотивувати використання евклідової дистанції, яку ви дали? Я також думаю, що може бути цікавим в цьому контексті зазначити, що крива ROC по суті отримується шляхом внесення пост-хок модифікації оцінки перехоплення логістичної моделі.
кардинал

@Cardinal, я знаю, що пороги для двійкової класифікації часто вибираються виходячи з того, яка точка на кривій ROC найбільш близька до (1,1) - евклідова відстань довільно визначила визначення "відстань" у моєму прикладі
Макрос

Я бачу. Я думав, що може бути інтуїтивне тлумачення цієї кількості з точки зору основної моделі, якої я не бачив. (Можливо, є [?])
кардинал

Можливо, це тому, що я виявив, що криві чутливості та специфічності перетинаються - це те саме місце, де зведено до мінімуму ...δ
Макрос

Наразі у мене немає терміналу, який я б міг використовувати, але мені цікаво, чи можливий ефект, який ви бачите, частково пояснюється тим, що ваше моделювання повинно генерувати приблизно приблизно 0 і 1 відповідей. Якщо ви змінюєте частку одиниць, стосунки все-таки зберігаються? R
кардинал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.