Альтернативы логистической регрессии в 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')
Tal Galili
источник
Должны ли мы предполагать, что вы рассматриваете фиксированный набор предикторов, т.е. вы заинтересованы в получении надежного предсказания с учетом предикторов, или вас также интересует какое-то наказание для X j?k ? Xj(j=1k)
ЧЛ
Я признаю, что для моего личного интереса наказание не было бы необходимым, и ради знания здесь я бы сказал, что оба являются соответствующими ответами :)
Tal Galili
Для дальнейшего использования: вы могли бы сформулировать этот вопрос таким образом, чтобы мы могли разрешить его как вопрос, не относящийся к ХО. См. Meta.stats.stackexchange.com/questions/290/…
Шейн,
Спасибо за ссылку Шейн. Очень интересная дискуссия, которую вы открыли там. Прочитав ответ Thomasas, я считаю, что это все-таки должна быть вики-страница сообщества, поскольку я намеревался найти как можно больше альтернатив (что-то, что, я сомневаюсь, сможет предложить любой человек). И все же, еще раз, спасибо за то, что направили меня в эту ветку!
Тал Галили
На самом деле это не слишком широкий вопрос, чтобы отвечать за него - в настоящее время у него 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 Саймона Вуда. Обобщенные аддитивные модели обеспечивают большую гибкость, чем логистическая регрессия, поскольку вы можете использовать сплайны для моделирования ваших предикторов.

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 автоматически подберет параметры для выбранной вами модели.

jphoward
источник
7

Наивный байесовский метод - хороший простой метод обучения данных, чтобы найти двоичный ответ.

library(e1071)
fitNB <- naiveBayes(y~x)
predict(fitNB, x)
IEORTools
источник
3

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

Разница между логитовой и пробитной моделями

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. Хотеллинг Т2.

Последнее замечание: логистическая регрессия - это то же самое, что небольшая нейронная сеть без скрытых слоев и только одна точка в последнем слое. Поэтому вы можете использовать реализации нейронных сетевых пакетов, таких как nnetв R.

Редактировать:

Несколько недель спустя я понял, что есть также алгоритм Виннов и Перцептрон . Оба являются классификаторами, которые работают также для классификации на две группы, но за последние 15 лет они потеряли популярность.

Ферди
источник