Python机器学习之逻辑回归


Posted in Python onMay 11, 2021

一、题目

1.主题:逻辑回归

2.描述:假设你是某大学招生主管,你想根据两次考试的结果决定每个申请者的录取
机会。现有以往申请者的历史数据,可以此作为训练集建立逻辑回归模型,并用
其预测某学生能否被大学录取。

3.数据集:文件 ex2data1.txt ,第一列、第二列分别表示申请者两次
考试的成绩,第三列表示录取结果(1 表示录取,0 表示不录取)。

二、目的

1.理解逻辑回归模型

2.掌握逻辑回归模型的参数估计算法

三、平台

1.硬件:计算机

2.操作系统:WINDOWS

3.编程软件:Pycharm

4.开发语言:python

四、基本原理

注:基本原理是我们在学习逻辑回归过程中的一些总结,包括为什么要选择对数损失函数等。

4.1 逻辑回归

逻辑回归就是将样本的特征可样本发生的概率联合起来,概率就是一个数,所以就是解决分类问题,一般解决二分类问题。
对于线性回归中,f ( x ) = w T x + b ,这里 f ( x ) 的范围为[ − ∞ , + ∞ ],说明通过线性回归中我们可以求得任意的一个值。对于逻辑回归来说就是概率,这个概率取值需要在区间[0,1]内,通常我们使用Sigmoid函数表示。

Sigmoid函数其表达式为(2)

Python机器学习之逻辑回归

最终我们可以通过Sigmoid函数求出对于每组自变量使得因变量预测为1的概率P;

即:

Python机器学习之逻辑回归

(当P>0.5时预测为1,小于0.5为0)
在分类情况下,经过学习后的LR分类器其实就是一组权值θ ,当有测试样本输入时,这组权值与测试数据按照加权得到

Python机器学习之逻辑回归

之后按照Sigmoid函数的形式求出

Python机器学习之逻辑回归

从而去判断每个测试样本所属的类别。

4.2 损失函数

实验一我们做线性回归模型时,给出了线性回归的代价函数的形式(误差平方和函数),具体形式如:

Python机器学习之逻辑回归

但是并不能应用到逻辑回归中,这是因为LR的假设函数的外层函数是Sigmoid函数,Sigmoid函数是一个复杂的非线性函数,这就使得我们将逻辑回归的假设函数

Python机器学习之逻辑回归

带入上式时,我们得到的 是一个非凸函数,如下图:

Python机器学习之逻辑回归

因此,此处我们需要重新考虑损失函数;
在逻辑回归中,我们最常用的损失函数为对数损失函数,对数损失函数可以为LR提供一个凸的代价函数,有利于使用梯度下降对参数求解。对数函数图像如图:

Python机器学习之逻辑回归

蓝色的曲线表示的是对数函数的图像,红色的曲线表示的是负对数 的图像,该图像在0-1区间上有一个很好的性质,如图粉红色曲线部分。在0-1区间上当z=1时,函数值为0,而z=0时,函数值为无穷大。这就可以和代价函数联系起来,在预测分类中当算法预测正确其代价函数应该为0;当预测错误,我们就应该用一个很大代价(无穷大)来惩罚我们的学习算法,使其不要轻易预测错误。
因此,我们重新定义逻辑回归的代价函数为:


Python机器学习之逻辑回归
损失函数的求解为:
Python机器学习之逻辑回归

五、实验步骤

1.数据可视化

在python中通过文件导入数据,并使用matlibplot工具建立对应散点图:

Python机器学习之逻辑回归

需要注意的是,我们的theta是三元组,θ0对应的X特征值固定为1,因此读取数据时,如上图最左侧加入一个1;

Python机器学习之逻辑回归

可以看到,被录取与不被录取的数据有较为清晰的一个界限,接下来我们要求解的就是这条界线;

2. 将线性回归参数初始化为0,计算代价函数(cost function)的初始值

根据基本原理中的代价计算公式,这里将sigmoid、损失公式代码化:

Python机器学习之逻辑回归

将theta初始化为(0,0,0)后,直接调用cost函数求值:

Python机器学习之逻辑回归

得到代价函数初始值:

Python机器学习之逻辑回归

3. 选择一种优化方法求解逻辑回归参数

梯度下降法

我们选择先用梯度下降法来观察theta参数结果;
梯度下降算法代码实现如图:

Python机器学习之逻辑回归

X:对于线性回归中的常量b,我们可以将它的系数视为1,然后和变量x组成一个m行3列的矩阵,其中m是数据规模,这个矩阵就是X。
Y:一个m行1列的矩阵,对应是否录取。
alpha:学习率
第一步,将我们的Θ初始化为[[0][0][0]]。
第二步,对于给定的步长alpha和此时的梯度gradient,更新我们的theta。然后计算此时thrta对应的梯度更新gradient。
第三步,重复第二步30万次
第四步,返回theta,即为我们线性回归的参数。

但是,对于逻辑回归来说,这里遇到了一个问题,那就是alpha和迭代次数的取值,如果alpha过小,损失函数将收敛的非常慢,迭代次数达到40万时才勉强收敛,但如果alpha过大,又会导致过大的步长使得准确率下降;
alpha = 0.001时的收敛函数,在50万次时收敛: 0.005时在25万次时收敛;

Python机器学习之逻辑回归

而如果alpha继续增大(如0.01),将导致不够准确,其界限与收敛图形如下:

Python机器学习之逻辑回归

(界限太差,仅80%准确率,且需要20万次迭代)
因此,我们在运行该数据时需要运行稍长的时间;alpha=0.005,迭代次数为30万时可以得到一组回归参数:

Python机器学习之逻辑回归

它的划分边界如图所示,其准确率为92%:该参数的划分准确率计算方法如下:

Python机器学习之逻辑回归

测试准确率:

Python机器学习之逻辑回归

比较简单,预测正确则加一,最后除以全部样本数。

牛顿迭代法

因为上述的迭代下降法所需迭代次数过多,因此这里使用一种优化方法来求解参数;

方法介绍

牛顿迭代法的原理较为复杂,因此不在这里写出来。
对比这牛顿迭代法方法与梯度下降法的参数更新公式可以发现,两种方法不同在于牛顿法中多了一项二阶导数,这项二阶导数对参数更新的影响主要体现在 改变参数更新方向上。

Python机器学习之逻辑回归

如图所示,红色是牛顿法参数更新的方向,绿色为梯度下降法参数更新方向,因为牛顿法考虑了二阶导数,因而可以找到更优的参数更新方向,在每次更新的步幅相同的情况下,可以比梯度下降法节省很多的迭代次数。
迭代过程:

Python机器学习之逻辑回归

代码实现

Python机器学习之逻辑回归

h值为sigmoid函数求得的概率;
J为一阶偏导数
H为Hession矩阵(海森矩阵),二阶偏导数

牛顿迭代法得到的theta:

Python机器学习之逻辑回归

优点

对于同样的学习率alpha = 0.005,cost仅需要1000次迭代就差不多收敛了;
而如果放大alpha,如alpha = 0.5,那么它只需要迭代10次即可收敛。

Python机器学习之逻辑回归

并且准确率保持在89%(数据较小);

4. 某学生两次考试成绩分别为 42、85,预测其被录取的概率

这里直接使用sigmoid函数以及牛顿迭代法求得的theta来进行其概率的计算:

Python机器学习之逻辑回归

得到结果:

Python机器学习之逻辑回归

即,y=1的概率为0.65145509,也就是被录取的概率

5. 画出分类边界

在上面已经画出了梯度下降法的分类边界,这里给出牛顿迭代法的边界

Python机器学习之逻辑回归

到此这篇关于Python机器学习之逻辑回归的文章就介绍到这了,更多相关Python逻辑回归内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python使用百度翻译进行中翻英示例
Apr 14 Python
在Python中使用base64模块处理字符编码的教程
Apr 28 Python
python创建进程fork用法
Jun 04 Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
Python爬豆瓣电影实例
Feb 23 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
Jun 25 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
Python Pandas知识点之缺失值处理详解
Pytorch实现图像识别之数字识别(附详细注释)
浅谈Python基础之列表那些事儿
详解Python牛顿插值法
Python中使用subprocess库创建附加进程
有趣的二维码:使用MyQR和qrcode来制作二维码
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 #Python
You might like
php的正则处理函数总结分析
2008/06/20 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
PHP asXML()函数讲解
2019/02/03 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
javascript与CSS复习(二)
2010/06/29 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
JQuery live函数
2010/12/24 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
js中cookie的添加、取值、删除示例代码
2013/10/21 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
2014/05/23 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
JavaScript 正则表达式中global模式的特性
2016/02/25 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
机器学习之KNN算法原理及Python实现方法详解
2018/07/09 Python
python集合常见运算案例解析
2019/10/17 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
一文读懂Python 枚举
2020/08/25 Python
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
《雷雨》教学反思
2014/02/20 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
法人任命书范本
2014/06/04 职场文书
红头文件任命书范本
2014/06/05 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
初一军训感言
2015/08/01 职场文书
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang