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使用Tkinter显示网络图片的方法
Apr 24 Python
Python2.x中文乱码问题解决方法
Jun 02 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
Python实现文件内容批量追加的方法示例
Aug 29 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
Feb 20 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
python super用法及原理详解
Jan 20 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
Django多数据库联用实现方法解析
Nov 12 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 05 Python
Django中的JWT身份验证的实现
May 07 Python
Python Pandas知识点之缺失值处理详解
Pytorch实现图像识别之数字识别(附详细注释)
浅谈Python基础之列表那些事儿
详解Python牛顿插值法
Python中使用subprocess库创建附加进程
有趣的二维码:使用MyQR和qrcode来制作二维码
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 #Python
You might like
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
this[] 指的是什么内容 讨论
2007/03/24 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
jQuery.each使用详解
2015/07/07 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
Python回调函数用法实例详解
2015/07/02 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
浅析python中的del用法
2020/09/02 Python
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
护士实习生自我鉴定范文
2013/12/10 职场文书
六十岁生日答谢词
2014/01/10 职场文书
计算机网络专业自荐信
2014/07/04 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
企业员工辞职信范文
2015/05/12 职场文书
雷锋之歌观后感
2015/06/10 职场文书
Mysql基础之常见函数
2021/04/22 MySQL
python中os.path.join()函数实例用法
2021/05/26 Python
java中如何截取字符串最后一位
2022/07/07 Java/Android