Альтернативи логістичній регресії в R


55

Мені б хотілося стільки алгоритмів, які виконують те саме завдання, що і логістична регресія. Це алгоритми / моделі, які можуть передбачити двійкову відповідь (Y) з деякою пояснювальною змінною (X).

Буду радий, якби ви назвали алгоритм, ви також показали, як його реалізувати в R. Ось код, який можна оновити за допомогою інших моделей:

set.seed(55)
n <- 100
x <- c(rnorm(n), 1+rnorm(n))
y <- c(rep(0,n), rep(1,n))
r <- glm(y~x, family=binomial)
plot(y~x)
abline(lm(y~x), col='red', lty=2)
xx <- seq(min(x), max(x), length=100)
yy <- predict(r, data.frame(x=xx), type='response')
lines(xx, yy, col='blue', lwd=5, lty=2)
title(main='Logistic regression with the "glm" function')

Чи слід вважати, що ви розглядаєте фіксовану сукупність предикторів, тобто ви зацікавлені в отриманні надійного прогнозування, передбаченого провісниками, або вас також цікавить якась пеналізація на X jк ? Хj(j=1к)
chl

Я визнаю, що для мого особистого інтересу пеналізація не потрібна, і заради знань тут я б сказав, що обидва є відповідними відповідями :)
Тал Галілі

Для подальшої довідки: ви, можливо, змогли б сформулювати це питання таким чином, щоб ми дозволили це як питання, що не стосується CW. Дивіться meta.stats.stackexchange.com/questions/290/…
Шейн

Дякую за посилання Шейн. Дуже цікава дискусія, яку ви там відкрили. Прочитавши відповідь Томаса, я вважаю, що це все ж має бути вікі спільноти, оскільки мій намір полягав у тому, щоб знайти якомога більше альтернатив (у чому я сумніваюся, будь-яка людина зможе запропонувати). Але знову ж таки, дякую, що ви направили мене до цієї теми!
Тал Галілі

Це насправді не надто широко, щоб відповідати - на даний момент це 6 відповідей (5 схвалених). Більше того, питання є дуже схваленим і вподобаним, & CW. Він повинен залишатися відкритим, ІМО.
gung - Відновити Моніку

Відповіді:


28

Популярними зараз є randomForest та gbm (звані MART або Gradient Boosting у машинній навчальній літературі), rpart для простих дерев. Також популярним є bayesglm, який використовує MAP з пріорами для регуляризації.

install.packages(c("randomForest", "gbm", "rpart", "arm"))

library(randomForest)
library(gbm)
library(rpart)
library(arm)

r1 <- randomForest(y~x)
r2 <- gbm(y~x)
r3 <- rpart(y~x)
r4 <- bayesglm(y ~ x, family=binomial)

yy1 <- predict(r1, data.frame(x=xx))
yy2 <- predict(r2, data.frame(x=xx))
yy3 <- predict(r3, data.frame(x=xx))
yy4 <- predict(r4, data.frame(x=xx), type="response")

24

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

r <- lda(y~x) # use qda() for quadratic discriminant analysis

xx <- seq(min(x), max(x), length=100)
pred <- predict(r, data.frame(x=xx), type='response')
yy <- pred$posterior[,2]

color <- c("red","blue")

plot(y~x,pch=19,col=color[pred$class])
abline(lm(y~x),col='red',lty=2)
lines(xx,yy, col='blue', lwd=5, lty=2)
title(main='lda implementation')

З іншого боку, якщо вам потрібні інтервали довіри навколо ваших прогнозів або стандартні помилки ваших оцінок, більшість алгоритмів класифікації вам не допоможуть. Можна використовувати узагальнені моделі добавок (змішані), для яких доступна низка пакетів. Я часто використовую mgcv пакет Simon Wood. Узагальнені моделі добавок дозволяють отримати більшу гнучкість, ніж логістична регресія, оскільки ви можете використовувати сплайни для моделювання ваших прогнозів.

set.seed(55)
require(mgcv)
n <- 100
x1 <- c(rnorm(n), 1+rnorm(n))
x2 <- sqrt(c(rnorm(n,4),rnorm(n,6)))
y <- c(rep(0,n), rep(1,n))
r <- gam(y~s(x1)+s(x2),family=binomial)

xx <- seq(min(x1), max(x1), length=100)
xxx <- seq(min(x2), max(x2), length=100)
yy <- predict(r, data.frame(x1=xx,x2=xxx), type='response')

color=c("red","blue")
clustering <- ifelse(r$fitted.values < 0.5,1,2)

plot(y~x1,pch=19,col=color[clustering])
abline(lm(y~x1),col='red',lty=2)
lines(xx,yy, col='blue', lwd=5, lty=2)
title(main='gam implementation')

Є ще багато чого:

op <- par(mfrow=c(2,1))
plot(r,all.terms=T)
par(op)

summary(r)
anova(r)

r2 <- gam(y~s(x1),family=binomial)
anova(r,r2,test="Chisq")

...

Я рекомендую книгу Саймона Вуда про узагальнені моделі добавок


14

Я погоджуюся з Джо і додаю:

Будь-який метод класифікації в принципі може бути використаний, хоча це залежатиме від даних / ситуації. Наприклад, ви також можете використовувати SVM, можливо, з популярною моделлю C-SVM. Ось приклад від kernlab з використанням функції ядра радіальної основи:

library(kernlab)
x <- rbind(matrix(rnorm(120),,2),matrix(rnorm(120,mean=3),,2))
y <- matrix(c(rep(1,60),rep(-1,60)))

svp <- ksvm(x,y,type="C-svc")
plot(svp,data=x)

12

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

library(caret)
train(response~., data, method="rf")

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


7

Naive Bayes - це хороший простий метод навчання даних, щоб знайти бінарний відгук.

library(e1071)
fitNB <- naiveBayes(y~x)
predict(fitNB, x)

3

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

Різниця між моделями logit і probit

set.seed(55)
n <- 100
x <- c(rnorm(n), 1+rnorm(n))
y <- c(rep(0,n), rep(1,n))
r <- glm(y~x, family=binomial(link="probit"))
plot(y~x)
abline(lm(y~x),col='red',lty=2)
xx <- seq(min(x), max(x), length=100)
yy <- predict(r, data.frame(x=xx), type='response')
lines(xx,yy, col='red', lwd=5, lty=2)
title(main='Probit regression with the "glm" function')

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

elrm(formula = y ~ x)

Крім того, існують і інші альтернативи, які слід згадати:

  1. Двостороння таблиця надзвичайних ситуацій
  2. Двогруповий аналіз дискримінантних функцій.
  3. T2 Хотелінга.

Заключне зауваження: Логістична регресія - це те саме, що невелика нейронна мережа без прихованих шарів і лише одна точка в кінцевому шарі. Тому ви можете використовувати реалізацію нейронних мережевих пакетів, таких як nnetR.

Редагувати:

Через кілька тижнів я зрозумів, що є також алгоритм Вінноу і Перцепрон . Обидва є класифікаторами, які працюють також для класифікації на дві групи, але обидві не вигідні за останні 15 років.

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