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实现的jpg格式图片修复代码
Apr 21 Python
Python Django使用forms来实现评论功能
Aug 17 Python
Python序列操作之进阶篇
Dec 08 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
python中将zip压缩包转为gz.tar的方法
Oct 18 Python
python 实现图片旋转 上下左右 180度旋转的示例
Jan 24 Python
Python将主机名转换为IP地址的方法
Aug 14 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 Python
Python实现疫情通定时自动填写功能(附代码)
May 27 Python
python numpy实现rolling滚动案例
Jun 08 Python
Python Pandas知识点之缺失值处理详解
Pytorch实现图像识别之数字识别(附详细注释)
浅谈Python基础之列表那些事儿
详解Python牛顿插值法
Python中使用subprocess库创建附加进程
有趣的二维码:使用MyQR和qrcode来制作二维码
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 #Python
You might like
php中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
HTML上传控件取消选择
2013/03/06 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
2016/12/06 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
2020/05/08 Javascript
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
python入门:argparse浅析 nargs='+'作用
2020/07/12 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
提高EJB性能都有哪些技巧
2012/03/25 面试题
日语专业求职信
2014/07/04 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
单位委托书格式范本
2014/09/29 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
2014年城管工作总结
2014/11/20 职场文书
工作时间调整通知
2015/04/24 职场文书
纪委立案决定书
2015/06/24 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs