【机器学习】(基础篇五) —— 逻辑回归

news2024/9/22 19:09:08

逻辑回归

逻辑回归(Logistic Regression)是一种广义线性模型,主要用于处理因变量为二分类或多分类(通过独热编码或多输出逻辑回归)的问题。尽管名字中带有“回归”二字,但实际上逻辑回归是一种分类算法,特别适用于估计某种事件发生的概率。实际上,“分类”是应用逻辑回归的目的和结果,但中间过程依旧是“回归”。

因为通过逻辑回归模型,我们得到的计算结果是0-1之间的连续数字,可以把它称为“可能性”(概率)。然后,给这个可能性加一个阈值,就成了分类。例如,利用逻辑回归估算出贷款违约的可能性>0.5,将借款人预判为坏客户。

逻辑回归和线性回归

在二分类问题中,只取0、1两个值。假设我们有这样一组数据:给不同的用户投放不同金额的广告,记录他们购买广告商品的行为,1代表购买,0代表未购买。

在这里插入图片描述假如此时依旧考虑线性回归模型,得到如下拟合曲线:

在这里插入图片描述

线性回归拟合的曲线,看起来和散点毫无关系,似乎没有意义。可以看出线性回归并不能很好的完成这个任务。

但我们可以在计算出预测值的结果后,加一个限制,即预测值>0.5,就认为其属于1这一类,购买了商品,否则认为其不会购买,即:

y ^ = { 1 , f ( x ) > 0.5 0 , f ( x ) < 0.5 \left.\hat{y}=\left\{\begin{array}{c}1,f(x)>0.5\\0,f(x)<0.5\end{array}\right.\right. y^={1,f(x)>0.50,f(x)<0.5

由于拟合方程为

y ^ = 0.34 ∗ x \hat{y}=0.34*x y^=0.34x

那么上面的限制就等价于:

y ^ = { 1 , x > 1.47 0 , x ≤ 1.47 \left.\hat{y}=\left\{\begin{array}{c}1,x>1.47\\0,x\leq1.47\end{array}\right.\right. y^={1,x>1.470,x1.47

这样就相当于是当x大于1.47时,将y预估为1,即将其判断为会进行购买;而x小于1.47时,将y预估为0,即将其判断为不会进行购买

这种形式,非常像阶跃函数:

在这里插入图片描述

把阶跃函数向右平移一下,就可以比较好地拟合上面的散点图。但是阶跃函数有个问题,它不是连续函数。我们希望可以用一个单调可导的函数来代替阶跃函数。

sigmoid函数

因为阶跃函数不好进行数学上的计算,不连续,也不可导,所以使用sigmoid函数对其进行代替逻辑回归算法的拟合函数,相当于优化后的阶跃函数:

f ( x ) = 1 1 + e − z f(x)=\frac1{1+e^{-z}} f(x)=1+ez1

其函数图像如下:

在这里插入图片描述

sigmoid函数是一个s形曲线,就像是阶跃函数的温和版,阶跃函数在0和1之间是突然的起跳,而sigmoid有个平滑的过渡。

从图形上看,sigmoid曲线就像是被掰弯捋平后的线性回归直线,将取值范围(−∞,+∞)映射到(0,1) 之间,更适宜表示预测的概率,即事件发生的“可能性” 。还是用上面广告的例子,如果使用sigmoid函数进行表示,然后有一个点的x为1.5,其在sigmoid函数中对应的y的预估值为0.7,则表示又70%的会进行购买。

此处的sigmoid函数的z可以看作是嵌套函数,z是一个线性组合 z = w 1 x 1 + w 2 x 2 + . . . + w n x n + b z=w_1x_1+w_2x_2+...+w_nx_n+b z=w1x1+w2x2+...+wnxn+b

结合起来就是 P ( y = 1 ∣ x ; w , b ) = 1 1 + e − ( b + w 1 x 1 + w 2 x 2 + ⋯ + w p x p ) P(y=1|x;w,b)=\frac{1}{1+e^{-(b+w_1x_1+w_2x_2+\cdots+w_px_p)}} P(y=1∣x;w,b)=1+e(b+w1x1+w2x2++wpxp)1

逻辑函数的构造算是完成了。找到了合适的函数,下面就是求函数中的未知参数向量 w w w了。

因为sigmoid函数最终给出的是一个概率,所以我们需要的损失函数就是用来计算模型预测的概率与实际观察到的类别的差异,对数损失函数可以实现这个要求,它会对错误的预测进行惩罚。

单个样本的对数损失函数的表达式为:

L ( p , y ) = − y log ⁡ ( p ) − ( 1 − y ) log ⁡ ( 1 − p ) L(p,y)=-y\log(p)-(1-y)\log(1-p) L(p,y)=ylog(p)(1y)log(1p)

这里,当 y=1(正例)时,损失函数简化为 −log⁡§,这意味着如果模型预测的概率 p 接近1,则损失较小;反之,如果 p 接近0,则损失很大。同理,当 y=0(反例)时,损失函数简化为 −log⁡(1−p),意味着如果模型预测的概率 p接近0,则损失较小;反之,如果 p 接近1,则损失很大。让损失函数最小,最中就能得到和真实情况最接近的预测情况所需要的参数w和b

为了优化参数 w 和 b,我们需要最小化所有样本的损失函数的平均值,也就是交叉熵损失(Cross-Entropy Loss),其数学表达式为:

J ( w , b ) = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ ( p ( i ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − p ( i ) ) ] J(w,b)=-\frac1m\sum_{i=1}^m[y^{(i)}\log(p^{(i)})+(1-y^{(i)})\log(1-p^{(i)})] J(w,b)=m1i=1m[y(i)log(p(i))+(1y(i))log(1p(i))]

其中,mm 是样本数量,p(i)是第 i 个样本的预测概率。

使用梯度下降法求出其中的参数

【示例】sklearn中有一个乳腺癌数据集用于二分类,刚好可以使用逻辑回归对其分类

from sklearn.datasets import load_breast_cancer 
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
 
# 导入数据集
cancer = load_breast_cancer()
#print(cancer)
# 提取中数据集中的数据
data=cancer["data"]
# 提取数据集中的特征名称
col = cancer['feature_names']
# 将特征名字和数据组合,并转换为DataFrame类型
x = pd.DataFrame(data,columns=col)
# 目标值的提取同理
target = cancer.target.astype(int)
y = pd.DataFrame(target,columns=['target'])
# 划分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=1)
model = LogisticRegression()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
# 输出模型报告
print(classification_report(y_test, y_pred))

运行结果:

在这里插入图片描述

在sklearn中,逻辑回归模型位于sklearn.linear_model模块下,对应的类名为LogisticRegression。其具体的使用方法和线性模型类似。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQLite数据库的增删改查(CRUD)

文章目录 SQLite数据库的增删改查&#xff08;CRUD&#xff09;添加数据更新数据删除数据查询数据使用SQL操作数据库添加数据的方法如下&#xff1a;更新数据的方法如下&#xff1a;删除数据的方法如下&#xff1a;查询数据的方法如下&#xff1a; SQLite数据库的增删改查&…

web技术1——jdk目录结构(重要),tomcat服务器(重要)

jdk文件夹结构(重要) bin目录&#xff1a; 里面都是.exe可执行文件。java&#xff0c;javac&#xff0c;javadoc&#xff0c;java编译工具&#xff0c;java监测工具等.exe文件都在这里。 include目录: 底层有用c写的东西&#xff0c;这里面包含很多c语言的文件&#xff0c…

Qt传入参数到mysql语句

试过两种方法都成功了 方法1&#xff1a;使用bool QSqlQuery::prepare和void QSqlQuery::bindValue传入参数,然后再使用bool QSqlQuery::exec() 执行Mysql语句 QSqlDatabase db //数据库 QSqlQuery result(db); // 基于已连接的数据库db建立 QSqlQuery 对象 QString strTime…

Linux du命令估算文件空间使用情况

du命令&#xff0c;估算文件空间使用情况&#xff0c;命令格式&#xff1a; du [option]... [file]... option&#xff1a; -a, --all显示所有文件的计数&#xff0c;而不仅仅是目录-d, --max-depthN打印文件夹深度小于等于N的总空间-h, --human-readable以人性化可读格式打…

Kotlin学习-01创建kotlin学习环境

安装idea https://www.jetbrains.com/zh-cn/ 创建项目 选择kotlin 修改Main.kt fun main() {print("Hello World!") }运行

类与对象(中(1))

开头 上一期内容&#xff0c;我们初步学习了类与对象中的基础知识&#xff0c;了解了类的定义&#xff0c;实例化以及this指针等相关内容&#xff0c;不知各位是否有一定的收获。今天&#xff0c;我们将更进一步&#xff0c;对类与对象中的默认成员函数部分进行一个初步的了解…

【排序篇】实现快速排序的三种方法

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 文章目录 1 交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare版本1.2.2 挖坑法1.2.3 前后指针…

C++求职LinuxWebServer面试篇(项目介绍)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏定期更新Qt的一些项目Demo 项目与…

【数学建模】趣味数模问题——棋子颜色问题

问题描述&#xff1a; 在任意拿出黑白两种颜色的棋子共 n 个&#xff0c;随机排成一个圆圈。然后根据以下规则放置棋子&#xff1a; 在两颗颜色相同的棋子中间放一颗黑色棋子在两颗颜色不同的棋子中间放一颗白色棋子 放完后撤掉原来所放的棋子&#xff0c;重复以上过程&…

仿某知识蝉在线学习副业项目知识付费系统小程序源码

一、仿知识蝉知识付费系统源码简介 知识付费系统&#xff0c;集合了图文、音频、视频、直播授课&#xff0c;专栏&#xff0c;品牌商城等主流功能和付费形式&#xff0c;并且包含多种多样的营销方案和互动模块&#xff0c;打造属于自己的知识付费系统。 安装步骤&#xff1a;…

聚星文社的工具使用0.2.9版本

聚星文社是一个在线写作社区&#xff0c;提供多种工具供用户使用。以下是聚星文社的工具使用说明&#xff1a; 聚星文社的工具https://docs.qq.com/doc/DRU1vcUZlanBKR2xy 写作工具&#xff1a;聚星文社提供了一个强大的在线写作工具&#xff0c;包括富文本编辑器、字数统计、拼…

计算机毕业设计选题推荐-民宿管理系统-酒店预定系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

windows下TortoiseSVN切换账号的方法

前言 在项目开始初期的时候大家会使用一个默认账号,后面会根据需要给每个人分配各自的个人账号,这个时候就需要重登陆新的svn账号,下面就是讲解下怎样在windows下修改登录TortoiseSVN的账号。 方法 1.首先在桌面右键&#xff0c;选择TortoiseSVN-settings 2.进入设置页面&a…

Android常见的界面布局

目录 ​前言 1.线性布局LinearLayout 2.相对布局RelativeLayout 3.表格布局TableLayout 4.网格布局GridLayout 实现一个计算器界面 改Button按钮颜色 5.帧布局FrameLayout 前言 在Android应用程序中&#xff0c;界面是由布局和控件组成的。控件是功能单元&#xff0c;负…

【C++】深入探索类和对象:初始化列表及其static成员与友元

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇 本章将分享C中类和对象最后章节“深入探索类和对象&#xff1a;初始化列表及其static成员与友元”&#xff0c;希望通过这几篇关于类和对象文…

JavaScript 错误 - Throw 和 Try to Catch

try 语句使您能够测试代码块中的错误。 catch 语句允许您处理错误。 throw 语句允许您创建自定义错误。 finally 使您能够执行代码&#xff0c;在 try 和 catch 之后&#xff0c;无论结果如何。 实例 在本例中&#xff0c;我们通过 adddlert 编写警告代码来故意制造了一个…

实用库/函数之string的用法

目录 1.使用: 2.定义 3.访问(两种方式) (1)通过下标访问(像字符数组那样) (2)通过迭代器访问 4.常用函数 (1)operator+=:string的加法,将两个string直接拼接起来 (2)compare operator:两个string类型可以直接使用==、!=、<、<=、>、>=比较大…

<数据集>红绿灯识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;7884张 标注数量(xml文件个数)&#xff1a;7884 标注数量(txt文件个数)&#xff1a;7884 标注类别数&#xff1a;3 标注类别名称&#xff1a;[light_green, light_red, light_yellow] 序号类别名称图片数框数1lig…

数据结构与算法 - 分治

一、概述 分治思想 将大问题划分为两个到多个子问题子问题可以继续拆分成更小的子问题&#xff0c;直到能简单求解如有必要&#xff0c;将子问题的解进行合并&#xff0c;得到原始问题的解 1. 二分查找 public static int binarySearch(int[] a, int target) {return recursi…