一、前言

在感知器算法中,如下图

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

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


二、逻辑斯蒂回归的原理

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

其中:z=  ,为样本特征与权重的线性组合函数图像如下:

为什么变量与因变量要选用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博客, 图像如下:

如上图所示,纵坐标为损失值,蓝线为  的图像,红线为  的图像

(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博客。

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

  1. 逻辑斯蒂回归分类算法

    逻辑斯蒂回归分类算法 首先来看一个线性回归来进行分类的问题: 怎样判断肿瘤是否恶性? 很明显线性回归用于分类问题无法处理边界点的位置. 同时,线性回归健壮性不够,一旦有噪声,立刻"投降&qu ...

  2. 机器学习第八篇:详解逻辑斯蒂回归算法

    01|基本概念: 在介绍逻辑回归模型以前,先介绍一下逻辑斯谛分布. 设X是连续型随机变量,X服从逻辑斯蒂分布是指X具有下列分布函数F(x)和密度函数f(x): 逻辑斯谛分布的分布函数F(x)的曲线如图 ...

  3. 数据挖掘-二项逻辑斯蒂回归模型算法的R实现

    本次为学生时期所写的实验报告,代码程序为课堂学习和自学,对网络程序有所参考,如有雷同,望指出出处,谢谢! 基础知识来自教材:李航的<统计学习方法> 本人小白,仍在不断学习中,有错误的地方恳 ...

  4. matlab 逻辑斯蒂回归,梯度下降法解逻辑斯蒂回归

    本文是Andrew Ng在Coursera的机器学习课程的笔记. Logistic回归属于分类模型.回顾线性回归,输出的是连续的实数,而Logistic回归输出的是[0,1]区间的概率值,通过概率值来 ...

  5. 逻辑斯蒂回归 逻辑回归_逻辑回归简介

    逻辑斯蒂回归 逻辑回归 Logistic regression is a classification algorithm, which is pretty popular in some commu ...

  6. 【Python-ML】SKlearn库逻辑斯蒂回归(logisticregression) 使用

    # -*- coding: utf-8 -*- ''' Created on 2018年1月12日 @author: Jason.F @summary: Scikit-Learn库逻辑斯蒂回归分类算法 ...

  7. 【机器学习】逻辑斯蒂回归(Logistic Regression)详解

    引言 LR回归,虽然这个算法从名字上来看,是回归算法,但其实际上是一个分类算法,学术界也叫它logit regression, maximum-entropy classification (MaxE ...

  8. 逻辑斯蒂回归算法详解

    逻辑斯蒂回归算法可用于分类问题,其本质是在线性回归的算法上用sigmoid函数进行模型变换,使得目标值介于0-1之间.本文用于对逻辑斯蒂回归算法(Logistics Regression)进行详细讲述 ...

  9. 细讲逻辑斯蒂回归与朴素贝叶斯、最大熵原理的爱恨交织(长文)

    好早之前就发现逻辑斯蒂回归好像和朴素贝叶斯里面的后验概率公式还有最大似然.信息熵.交叉熵.伯努利分布.回归分析.几率(odds)等等有着千丝万缕CZFZ(错综复杂).PSML(扑朔迷离)的关系.一直感 ...

最新文章

  1. python计算生态的命名_Python计算生态之random库
  2. go语言支持继承吗_Go语言的结构体嵌入为什么不算继承?
  3. Vue.js安装使用教程
  4. C++ 常用拷贝和替换算法
  5. cefpython基础入门
  6. Maya+3dsMax三维建模
  7. 多个集合计算笛卡尔积-Python
  8. 盈建科弹性板6计算_盈建科(300935):国内建筑结构设计软件行业的领先企业...
  9. CPU负载均衡之loadavg计算
  10. 使用docker部署redis中间件
  11. 中国大数据风控企业揭秘系列之航天信息
  12. aic准则python_Python数据科学:线性回归
  13. 什么软件可以测试手长,手相测试扫一扫软件
  14. linux虚拟机克隆mac地址冲突,虚拟机下linux迁移造成MAC地址异常处理办法(示例代码)...
  15. c语言topic函数,ROS学习笔记(一) 话题topic的定义与使用(publisher 和 subscriber)
  16. 【品牌DTC增长力】私域,你做的可能是“假的”
  17. Debian11 更换软件源
  18. 后台cs代码控制html控件,在asp.net中*.aspx.cs肿么用后台代码编写前台的事件?
  19. shell脚本编程学习笔记7(XDL)——字符处理命令和条件判断
  20. SMETA验厂辅导,提出过不合规项的所有部分,应对以下内容有清楚的解释

热门文章

  1. js微信抢红包脚本代码_使用AutoJs实现微信抢红包的代码
  2. websocket binary 数据解析_WebSocket实现原理相关知识点
  3. 操作篇 ospf认识和应用
  4. shell脚本详解(十)——sed编辑器的使用方法
  5. keil c语言表用什么数据类型,面向51单片机的Keil uVision4基本数据类型简介
  6. access课程均不及格_access 第二章 查询 练习题 -
  7. 跟计算机断层扫描相关的技术,计算机断层扫描技术(简称PET)
  8. 开发html5单页用什么框架,GitHub - mmcai/single-page-react-h5: 基于React框架的单页活动框架,可以基于此代码上进行相关的H5活动等相关内容的开发...
  9. linux配置服务器心得体会,linux 学习 linux上搭建dhcp服务器
  10. c语言试卷浙江理工大学杀人案件追踪,浙江理工大学c语言期末考试模拟试卷6 .pdf...