R中逻辑回归的替代方案

机器算法验证 r 回归 物流 分类 预测模型
2022-01-16 05:07:57

我想要尽可能多的算法来执行与逻辑回归相同的任务。那是可以对具有一些解释变量 (X) 的二元响应 (Y) 进行预测的算法/模型。

如果在您命名算法之后,如果您还展示如何在 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')
4个回答

现在流行的是 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")

实际上,这取决于您想要获得什么。如果您仅对预测执行逻辑回归,则可以使用任何适合您的数据的监督分类方法。另一种可能性:判别分析(来自包 MASS 的 lda() 和 qda())

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')

另一方面,如果您需要预测的置信区间或估计的标准误差,大多数分类算法都不会帮助您。您可以使用广义的加法(混合)模型,其中有许多可用的软件包。我经常使用 Simon Wood 的 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")

...

我推荐Simon Wood 关于广义加法模型的书

我同意乔的观点,并补充说:

原则上可以使用任何分类方法,尽管它取决于数据/情况。例如,您还可以使用 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)

大约有 100 个分类和回归模型可以通过caret 包进行训练。您可以选择任何分类模型(与需要连续响应的回归模型相反)。例如训练一个随机森林:

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

有关可用模型的完整列表,请参阅分发随附的插入符号模型训练小插图。它分为两用模型和分类模型(您都可以使用)和仅回归模型(您不能使用)。caret 会自动为您训练所选模型的参数。