一文“妙”解逻辑斯蒂回归(LR)算法

一、前言

在感知器算法中,如下图

如果我们使用一个f(z)=z函数,作为激励函数,那么该模型即为线性回归。而在逻辑斯蒂回归中,我们将会采用f(z)=sigmoid(z) 函数作为激励函数,所以它被称为sigmoid回归也叫逻辑斯蒂回归(logistic regression)。需要注意的是,虽然逻辑斯蒂回归的名字中带有回归,但事实上它并不是一种回归算法,而是一种分类算法。作为经典的二分类算法,逻辑斯蒂回归的应用极为广泛。

本文第2节介绍了逻辑斯蒂回归模型的原理,第3节阐述了模型的代价函数,第4节讲解了模型的权重更新,第5节介绍了模型的决策边界,第6节演示了R编程实战,第7节作出总结。


二、逻辑斯蒂回归的原理

逻辑斯蒂回归是针对线性可分问题的一种易于实现而且性能优异的分类模型。对于二分类问题,假设某件事发生的概率为p,那么这件事不发生的概率为(1-p),需要通过一个函数将线性回归模型 w^{T}x+b 的输出值映射到[0,1]范围内,这个函数就是逻辑斯蒂函数(logistic function), 也称为sigmoid函数。

其中:z= w^{T}x+b ,为样本特征与权重的线性组合函数图像如下:

为什么变量与因变量要选用logistic关系呢,因为这里(1)我们需要Y代表的是概率即Y∈(0,1); (2)我们需要样本特征与权重的线性组合在0附近变化幅度比较大,并且是非线性的变化。而在很大或很小的时候,几乎不变化,这是基于概率的一种认识与需要。感性的一个例子,想想你学习努力的程度与从60分提高到80分和80提高到100分并不是线性的;(3)这个关系的公式要在之后形成的cost function是凸函数。所以就选择了sigmoid函数。可参考逻辑斯蒂(logistic)回归深入理解、阐述与实现 - happy_lion - 博客园

于是对于某个样本x,它的预测概率为

y表示为:当输入为x时,它被分为1类的概率为p,也属于1类别的条件概率, 即p(y=1|x)。

如在预测天气的时候,我们需要预测出明天属于晴天和雨天的概率,已知根天气相关的特征和权重,定义y=1为晴天,y=0为雨天,根据天气的相关特征和权重可以获得z,然后再通过sigmoid函数可以获取到明天属于晴天的概率ϕ(z)=P(y=1|x),一般我们取明天属于晴天的概率阈值为50%,那么当ϕ(z)>=0.5时,就属于晴天,小于0.5时就属于雨天。逻辑斯蒂回归除了应用于天气预测之外,还可以应用于某些疾病预测,所以逻辑斯蒂回归在医疗领域也有广泛的应用。


三、逻辑斯蒂回归的代价函数

对于线性回归问题,定义的代价函数为所有数据误差的平方和。但是对于逻辑回归来说,这样定义所得的代价函数为非凸函数,容易陷入局部最优。比如下图

左边为凸函数,局部最优即全局最优;右边为非凸函数,容易陷入局部最优。于是,逻辑斯蒂回归的代价函数转变为:

上面的式子其实由最大似然函数推导过来,想深入了解的话可移步用最大似然估计求逻辑回归参数 - CSDN博客, 图像如下:

如上图所示,纵坐标为损失值,蓝线为 -log(\phi(z)) 的图像,红线为 -log(1-\phi(z)) 的图像

(1)属于类别1的蓝线:若样本正确被划分为类别1中,代价将趋向于0;被误分到类别0中,代价将无穷大。

(2)属于类别0的红线:若样本正确被划分为类别0中,代价将趋向于0;被误分到类别1中,代价将无穷大。

所以,相对于之前的线性回归而言,logistic回归错误预测所带来的代价要大的多。因为y的标签为1和0,所以上面两个约束条件可以变成一个约束方程,从而方便我们的计算


四、logistic回归权重更新三步走

构建了损失函数(为凸函数)后,我们的优化目标为:使损失函数 J(w) 达到最小,从而求出最优的w (注意常数b的权重作为1,放入w向量里),最终得到分类平面的表达式。因此,梯度下降法就派上用场了。

下面我将logistc回归权重的更新分为简单的三步走

首先计算sigmoid(z) 函数的偏导:

然后计算对数似然函数对第j个权重的偏导:

求得偏导后,最终通过梯度下降公式我们就可以不断更新w

公式参考逻辑斯谛回归(logistic regression)


五、逻辑斯蒂回归模型的决策边界

在逻辑斯蒂模型中,预测变量越复杂,即当模型中包含自变量的2次项、交叉项甚至更高次项时,模型的决策边界就越复杂,就越能拟合非线性决策面。所以在LR模型中,自变量x及其多项式的选择非常重要。而在神经网络中,一般预测变量只需要输入变量x,通过设置多个隐藏层来自动进行特征选择就能达到不错的效果。因此,相比于神经网络的智能和自动化,LR模型更具有艺术性和经验性。通过图形我们来直观地了解下:

(1)欠拟合

当逻辑斯蒂回归模型只包含两个预测变量,而不包含其高次项或者交叉项时,模型的决策面是一条直线,显得有点欠拟合(偏差大)

(2)合适拟合:

当模型包含两个预测变量,并且同时包含其二次项和交叉项时,模型的决策面是一条曲线。虽然有两个样本被分类错误,但看起来刚好拟合

(3)过拟合:

当模型包含两个预测变量,并且同时包含二次项甚至更高项以及交叉项时,模型的决策面是一条非常复杂的曲线。虽然样本全部被分类正确,但显示出过拟合的问题(方差大)


六、LR回归的R语言实现

1)加载包

rm(list=ls())  #清理内存空间
setwd("E:/R语言模型代码清单1111/离不开的R代码")  #设置工作空间
library(ggplot2)
library(pROC)

2)数据预处理

data(iris)  #使用R自带的iris鸢尾花数据集
table(iris$Species) #查看分类变量的类别个数

可以看到总共150个数据,3种花分别为50个

iris1=iris[(which(iris$Species!="versicolor")), ]  #提取除去versicolor的另外两个类别,做2分类
table(iris1$Species)

虽然没有选择versicolor花,但它仍然存在因子中,所以接下想办法剔除这个因子水平

iris1$Species=as.factor(as.character(iris1$Species))
table(iris1$Species)

这样因子就只剩下两个了

sub<-sample(1:nrow(iris1),round(nrow(iris1)*2/3))  #选取下标,选2/3的数据作为训练集
iris.learn<-iris1[sub,] #取2/3的数据作为训练集
iris.valid<-iris1[-sub,] #取1/3的数据作为测试集
table(iris.valid$Species)

测试数据总共还剩33个

3)调用glm函数训练逻辑斯蒂二元模型

logit.fit <- glm(Species~Petal.Width+Petal.Length,family = binomial(link = 'logit'),data = iris.learn) #logistic回归使用的是二项分布族binomial。Binomial族默认连接函数为logit,可设置为probit
summary(logit.fit)

结果展示了call(调用),Residuals(残差), Coifficients(系数),结果类似于线性回归

4)性能评估

prdict_res <- predict(logit.fit, type="response", newdata=iris.valid[,-5])  #测试数据产生概率
relationship=data.frame(predict=prdict_res, real=iris.valid$Species)
head(relationship)
#查看数据产生概率和实际分类的关系

可以看到setosa的预测概率趋向于0,也说明概率大于0.5的花就预测为virginica

soft_hard=data.frame(predict=ifelse(prdict_res>0.5,"virginica", "setosa"), real=iris.valid$Species);
head(soft_hard)

前6个数据全部预测正确了,感觉模型还行

table(data.frame(predict=ifelse(prdict_res>0.5, "virginica", "setosa"), real=iris.valid$Species)) #混淆矩阵

LR模型成功地拟合了鸢尾花数据集,不过说实在的,这个数据集非常容易划分,所以准确率达到了100%

接下来画ROC曲线

pred=ifelse(prdict_res>0.5, "virginica", "setosa")
pred2=as.numeric(as.factor(pred))-1 #预测值必须转化为数字
modelroc <- roc(iris.valid$Species,pred2) #前面为真实值,后面为预测值
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),grid.col=c("green", "red"), max.auc.polygon=F,legacy.axes=TRUE, auc.polygon.col="skyblue", print.thres=F,col="red") #作图

AUC已经达到了1,可怕不,社会社会。

 

5)可视化

为了更好地展示决策边界,在这里以花萼长度和花萼宽度为自变量,iris1为数据集,重新训练一个模型

new_fit <- glm(Species~Sepal.Length+Sepal.Width,family = binomial(link = 'logit'),data = iris1)
w <- new_fit$coef  #模型系数
inter <- -w[1]/w[3] #分类线的截距
slope <- -w[2]/w[3] #分类线的斜率

最后用ggplot函数作图

ggplot(data=iris1,aes(x=Sepal.Length,y=Sepal.Width,col=Species,shape=Species))+geom_point(size=3)+geom_abline(intercept = inter,slope = slope,size=1.2,colour="red")+scale_color_brewer(palette = 'Accent')+scale_shape_manual(values = c(17,16))+theme_bw()+theme(panel.border = element_blank(),panel.grid.major = element_blank(),panel.grid.minor = element_blank(),axis.line = element_line(colour = "black"))

上图展示了模型对于setosa和virginica这两种花共100个数据样本的划分情况,横坐标为花萼长度,纵坐标为花萼宽度。图中并没有出现被划分错误的样本,可知准确率达到了100%。但是,分类线的位置暗示着模型过拟合的极大可能性。


七、总结

LR回归与多重线性回归实际上有很多相同和相异之处,最大的区别就在于他们的因变量不同,其他的基本都差不多,正是因为如此,这两种回归可以归于同一个家族,即广义线性模型。这一家族中的模型形式基本上都差不多,不同的就是因变量不同,如果是连续的,就是多重线性回归,如果是二项分布,就是logistic回归,如果是poisson分布,就是poisson回归,如果是负二项分布,就是负二项回归,等等。只要注意区分它们的因变量就可以了。logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。所以实际中最为常用的就是二分类的logistic回归。可参考彻底搞懂逻辑斯蒂回归 - CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值