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 相关文章推荐
pygame学习笔记(5):游戏精灵
Apr 15 Python
Python3实现从指定路径查找文件的方法
May 22 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
May 11 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
Python人脸识别第三方库face_recognition接口说明文档
May 03 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
Oct 16 Python
python使用SQLAlchemy操作MySQL
Jan 02 Python
Python定时器线程池原理详解
Feb 26 Python
python如何求100以内的素数
May 27 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
Python Pandas知识点之缺失值处理详解
Pytorch实现图像识别之数字识别(附详细注释)
浅谈Python基础之列表那些事儿
详解Python牛顿插值法
Python中使用subprocess库创建附加进程
有趣的二维码:使用MyQR和qrcode来制作二维码
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 #Python
You might like
PHP求小于1000的所有水仙花数的代码
2012/01/10 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
2013/11/21 Javascript
js转化毫秒为时间格式代码
2014/04/10 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
jQuery扩展+xml实现表单验证功能的方法
2016/12/25 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
vue.js实现照片放大功能
2020/06/23 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
Python切片索引用法示例
2018/05/15 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
Python 互换字典的键值对实例
2019/02/12 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
ColourPop美国官网:卡拉泡泡,洛杉矶彩妆品牌
2019/04/28 全球购物
自荐信格式技巧有哪些呢
2013/11/19 职场文书
产品售后服务承诺书
2014/05/21 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
Java elasticsearch安装以及部署教程
2021/06/28 Java/Android