R语言数据分析系列之九
—— by comaple.zhang
本节将一下逻辑回归和R语言实现,逻辑回归(LR,LogisticRegression)其实属于广义回归模型,根据因变量的类型和服从的分布可以分为,普通多元线性回归模型,和逻辑回归,逻辑回归是指因变量是离散并且取值范围为{0,1}两类,如果离散变量取值是多项即变为 multi-class classification,所以LR模型是一个二分类模型,可以用来做CTR预测等。那么我们现在来引出逻辑回归如何做二分类问题。
问题引入
在多元线性回归中我们的模型公式是这样子的(参考前两节内容),
这里的f(x,w)是连续的变量,如果我们的因变量是离散的如何处理呢,比如我们得数据是这样子的。
x <- seq(-3,3,by=0.01)
y <- 1/(1+exp(-x))
gdf <- data.frame(x=x,y=y)
ggplot(gdf,aes(x=x,y=x+0.5)) +geom_line(col='green')
这样显然无法拟合我们{0,1}输出,为了能够拟合离散的{0,1}输出我们引入sigmoid函数如下:
ggplot(gdf,aes(x=x,y=y))+geom_line(col='blue')+ geom_vline(xintercept=c(0),col='red') + geom_hline(yintercept=c(0,1),lty=2)
用R将该函数的图行画出来如下图:
又来这个函数我们可以很方便的将线性关系转换为离散的{0,1}输出
ggplot(gdf,aes(x=x,y=y))+geom_line(col='blue')+ geom_vline(xintercept=c(0),col='red') + geom_hline(yintercept=c(0,1),lty=2) +geom_line(aes(x=x,y=x+0.5),col='green')
于是我们的类别概率可以表示为:
这样我们的转化就完成了,模型最后化简为如下形式:
LR的损失函数(cost function)
上面引出了sigomid得函数并将其用于我们得模型,那如何定义损失函数呢,总不能去做减法吧,除了做减法我们还可以怎么做呢,对于离散变量的模型,我们希望能够达到,每个分类预测正确的个数越多越好,即模型的联合概率密度最大:
即我们要最大化L(w),为了优化L(w)取最大值,我们对L(w)去负对数似然,从而将最大化问题转化为最小化问题:
接下来我们来优化这个损失函数的到是的L(w)最小的那组w。
优化方法有,牛顿法,梯度下降,L-BFGS这里不再对这几种方法详述,后面其他系列里面会讲到。
LR在R语言中的实现
我们利用iris数据集,进行逻辑回归二分类测试,该数据集是R语言自带得数据集,包括我个属相,和三个分类。逻辑回归我们用glm函数实现,该函数提供了各种类型得回归,如:提供正态、指数、gamma、逆高斯、Poisson、二项。我们用的logistic回归使用的是二项分布族binomial。
index <- which(iris$Species == 'setosa')
ir <- iris[- index,]
levels(ir$Species)[1] <- ''
split <- sample(100,100*(2/3))
#生成训练集
ir_train <- ir[split,]
#生成测试集
ir_test <- ir[-split,]
fit <- glm(Species ~.,family=binomial(link='logit'),data=ir_train)
summary(fit)
real <- ir_test$Species
data.frame(real,predict)
predict <- predict(fit,type='response',newdata=ir_test)
res <- data.frame(real,predict =ifelse(predict>0.5,'virginca','versicorlor'))
#查看模型效果
plot(res)