[Python] 什么是逻辑回归模型?使用scikit-learn中的LogisticRegression来解决乳腺癌数据集上的二分类问题

什么是线性回归和逻辑回归?

线性回归是一种用于解决回归问题的统计模型。它通过建立自变量(或特征)与因变量之间的线性关系来预测连续数值的输出。线性回归的目标是找到一条直线(或超平面),使得预测值与观察值之间的残差(误差)最小化。这条直线或超平面可以用来表示输入变量与输出变量之间的关系。线性回归假设输入特征与输出之间存在线性关系,并且残差服从正态分布。线性回归适用于预测和推断,常见应用包括房价预测、销售预测、股票预测等。

线性回归方程式:

\Theta被统称为模型的参数,其中 被称为截距(intercept),\Theta1 ~ \Thetan被称为系数(coefficient),这个表达式,其实就和我 们小学时就无比熟悉的 是同样的性质。我们可以使用矩阵来表示这个方程,其中x被看做是一 个列矩阵,\Theta被看作是一个行矩阵,则有:

线性回归的任务,就是构造一个预测函数 Z 来映射输入的特征矩阵x和标签值y的线性关系,而构造预测函数的核心就是找出模型的参数\ThetaT和\Theta0,著名的最小二乘法就是用来求解线性回归中参数的数学方法。

通过函数 ,线性回归使用输入的特征矩阵 X 来输出一组连续型的标签值 y_pred,以完成各种预测连续型变量的任务 (比如预测产品销量,预测股价等等)。

那如果我们的标签是离散型变量,尤其是,如果是满足0-1分布的离散型变量,我们要怎么办呢?我们可以通过引入联系函数(link function),将线性回归方程z变换为g(z),并且令g(z)的值分布在(0,1)之间,且当g(z)接近0时样本的标签为类别0,当g(z)接近1时样本的标签为类别1,这样就得到了一个分类模型。而这个联系函数对于逻辑回归来说,就是Sigmoid函数:

Sigmoid函数是一个S型的函数,当自变量z趋近正无穷时,因变量g(z)趋近于1,而当z趋近负无穷时,g(z)趋近 于0,它能够将任何实数映射到(0,1)区间,使其可用于将任意值函数转换为更适合二分类的函数。 因为这个性质,Sigmoid函数也被当作是归一化的一种方法,与我们之前学过的MinMaxSclaer同理,是属于 数据预处理中的“缩放”功能,可以将数据压缩到[0,1]之内。区别在于,MinMaxScaler归一化之后,是可以取 到0和1的(最大值归一化后就是1,最小值归一化后就是0),但Sigmoid函数只是无限趋近于0和1。

线性回归中 Z = \ThetaT X,于是我们将 \ThetaT带入,就得到了二元逻辑回归模型的一般形式: 

而g(z)就是我们逻辑回归返回的标签值。此时, y(x) 的取值都在[0,1]之间,因此y(x) 和 1 - y(x) 相加必然为1。如果我们令y(x) 除以 1 - y(x) 可以得到形似几率(odds)的 y(x) / (1 - y(x)),在此基础上取对数,可以很容易就得到:

不难发现,g(z)的形似几率取对数的本质其实就是我们的线性回归z,我们实际上是在对线性回归模型的预测结果取对数几率来让其的结果无限逼近0和1。因此,其对应的模型被称为”对数几率回归“(logistic Regression),也就是我们的逻辑回归,这个名为“回归”却是用来做分类工作的分类器。

逻辑回归是一种用于解决分类问题的统计模型。它通过将特征与相应的标签之间的关系建模为一个逻辑函数来进行预测。逻辑回归的输出是一个概率值,表示样本属于某个类别的可能性。通常情况下,当输出概率大于某个阈值时,样本被分类为正例,否则分类为负例。逻辑回归可以处理二分类问题和多分类问题

逻辑回归是一个受工业商业热爱,使用广泛的模型,因为它有着不可替代 的优点:

1. 逻辑回归对线性关系的拟合效果好到丧心病狂,特征与标签之间的线性关系极强的数据,比如金融领域中的信用卡欺诈,评分卡制作,电商中的营销预测等等相关的数据,都是逻辑回归的强项。虽然现在有了梯度提升树GDBT,比逻辑回归效果更好,也被许多数据咨询公司启用,但逻辑回归在金融领域,尤其是银行业中的统治地位依然不可动摇(相对的,逻辑回归在非线性数据的效果很多时候比瞎猜还不如,所以如果你已经知道数据之间的联系是非线性的,千万不要迷信逻辑回归)。

2. 逻辑回归计算快:对于线性数据,逻辑回归的拟合和计算都非常快,计算效率优于SVM和随机森林,亲测表示在大型数据上尤其能够看得出区别。

3. 逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字:我们因此可以把逻辑回归返回的结果当成连续型数据来利用。比如在评分卡制作时,我们不仅需要判断客户是否会违约,还需要给出确定的”信用分“,而这个信用分的计算就需要使用类概率计算出的对数几率,而决策树和随机森林这样的分类器,可以产出分类结果,却无法帮助我们计算分数(当然,在sklearn中,决策树也可以产生概率,使用接口 predict_proba调用就好,但一般来说,正常的决策树没有这个功能)。

另外,逻辑回归还有抗噪能力强的优点。福布斯杂志在讨论逻辑回归的优点时,甚至有着“技术上来说,最佳模型的AUC面积低于0.8时,逻辑回归非常明显优于树模型”的说法。并且,逻辑回归在小数据集上表现更好,在大型的数据集上,树模型有着更好的表现。 由此,我们已经了解了逻辑回归的本质,它是一个返回对数几率的,在线性数据上表现优异的分类器,它主要被应用在金融领域。其数学目的是求解能够让模型最优化的参数\Theta的值,并基于参数\Theta和特征矩阵计算出逻辑回归的结果 y(x)。注意:虽然我们熟悉的逻辑回归通常被用于处理二分类问题,但逻辑回归也可以做多分类。

sklearn中的逻辑回归

API Reference — scikit-learn 1.4.0 documentation

linear_model.LogisticRegression

sklearn.linear_model.LogisticRegression — scikit-learn 1.4.0 documentation

二元逻辑回归的损失函数

我们使用”损失函数“这个评估指标,来衡量参数 的优劣,即这一组参数能否使模型在训练集上表现优异。 如果用一组参数建模后,模型在训练集上表现良好,那我们就说模型表现的规律与训练集数据的规律一致,拟合过 程中的损失很小,损失函数的值很小,这一组参数就优秀;相反,如果模型在训练集上表现糟糕,损失函数就会很 大,模型就训练不足,效果较差,这一组参数也就比较差。即是说,我们在求解参数\Theta时,追求损失函数最小,让模型在训练数据上的拟合效果最优,即预测准确率尽量靠近100%。 

逻辑回归的损失函数是由最大似然法来推导出来的,具体结果可以写作:

由于我们追求损失函数的最小值,让模型在训练集上表现最优,可能会引发另一个问题:如果模型在训练集上表示优秀,却在测试集上表现糟糕,模型就会过拟合。虽然逻辑回归和线性回归是天生欠拟合的模型,但我们还是需要控制过拟合的技术来帮助我们调整模型,对逻辑回归中过拟合的控制,通过正则化来实现。

重要参数penalty & C (正则化)

正则化是用来防止模型过拟合的过程,常用的有L1正则化和L2正则化两种选项,分别通过在损失函数后加上参数向 量 的L1范式和L2范式的倍数来实现。这个增加的范式,被称为“正则项”,也被称为"惩罚项"。损失函数改变,基 于损失函数的最优化来求解的参数取值必然改变,我们以此来调节模型拟合的程度。其中L1范数表现为参数向量中的每个参数的绝对值之和,L2范数表现为参数向量中的每个参数的平方和的开方值。

 L1正则化和L2正则化虽然都可以控制过拟合,但它们的效果并不相同。当正则化强度逐渐增大(即C逐渐变小), 参数的取值会逐渐变小,但L1正则化会将参数压缩为0,L2正则化只会让参数尽量小,不会取到0。

在L1正则化在逐渐加强的过程中,携带信息量小的、对模型贡献不大的特征的参数,会比携带大量信息的、对模型 有巨大贡献的特征的参数更快地变成0,所以L1正则化本质是一个特征选择的过程,掌管了参数的“稀疏性”。L1正 则化越强,参数向量中就越多的参数为0,参数就越稀疏,选出来的特征就越少,以此来防止过拟合。因此,如果特征量很大,数据维度很高,我们会倾向于使用L1正则化。由于L1正则化的这个性质,逻辑回归的特征选择可以由 Embedded 嵌入法来完成。

相对的,L2正则化在加强的过程中,会尽量让每个特征对模型都有一些小的贡献,但携带信息少,对模型贡献不大的特征的参数会非常接近于0。通常来说,如果我们的主要目的只是为了防止过拟合,选择L2正则化就足够了。但 是如果选择L2正则化后还是过拟合,模型在未知数据集上的效果表现很差,就可以考虑L1正则化。

from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_breast_cancer
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

data = load_breast_cancer()
X = data.data
y = data.target
print('feature names:', data.feature_names)
print('target names:', data.target_names)
print('X:', X[0:5])
print('y:', y[0:5])
data.data.shape


lrl1 = LR(penalty="l1",solver="liblinear",C=0.5,max_iter=1000)
lrl2 = LR(penalty="l2",solver="liblinear",C=0.5,max_iter=1000)
#逻辑回归的重要属性coef_,查看每个特征所对应的参数
lrl1 = lrl1.fit(X,y)
lrl1.coef_

(lrl1.coef_ != 0).sum(axis=1)

lrl2 = lrl2.fit(X,y)
lrl2.coef_

可以看见,当我们选择L1正则化的时候,许多特征的参数都被设置为了0,这些特征在真正建模的时候,就不会出现在我们的模型当中了,而L2正则化则是对所有的特征都给出了参数

究竟哪个正则化的效果更好呢?还是都差不多? 

l1 = []
l2 = []
l1test = []
l2test = []
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
for i in np.linspace(0.05,1,19):
    lrl1 = LR(penalty="l1",solver="liblinear",C=i,max_iter=1000)
    lrl2 = LR(penalty="l2",solver="liblinear",C=i,max_iter=1000)
    
    lrl1 = lrl1.fit(Xtrain,Ytrain)
    l1.append(accuracy_score(lrl1.predict(Xtrain),Ytrain))
    l1test.append(accuracy_score(lrl1.predict(Xtest),Ytest))
    
    lrl2 = lrl2.fit(Xtrain,Ytrain)
    l2.append(accuracy_score(lrl2.predict(Xtrain),Ytrain))
    l2test.append(accuracy_score(lrl2.predict(Xtest),Ytest))
graph = [l1,l2,l1test,l2test]
color = ["green","black","lightgreen","gray"]
label = ["L1","L2","L1test","L2test"]    
plt.figure(figsize=(6,6))
for i in range(len(graph)):
    plt.plot(np.linspace(0.05,1,19),graph[i],color[i],label=label[i])
plt.legend(loc=4) #图例的位置在哪里?4表示,右下角
plt.show()

可见,至少在我们的乳腺癌数据集下,两种正则化的结果区别不大。但随着C的逐渐变大,正则化的强度越来越小,模型在训练集和测试集上的表现都呈上升趋势,直到C=0.8左右,训练集上的表现依然在走高,但模型在未知数据集上的表现开始下跌,这时候就是出现了过拟合。我们可以认为,C设定为0.9会比较好。在实际使用时,基本就默认使用l2正则化,如果感觉到模型的效果不好,那就换L1试试看。 

重要参数max_iter(solver最大迭代次数)

参数max_iter是逻辑回归模型的最大迭代次数。默认情况下,它的值是100。

逻辑回归模型通过最大化似然函数来估计模型的参数。在迭代的过程中,模型会不断调整参数以最大化似然函数,直到收敛为止。max_iter参数用于指定最大迭代次数,即模型在达到该次数之前会进行迭代调整参数。

如果模型在达到最大迭代次数之前已经收敛,则训练会提前停止。否则,会发出一个警告并返回最后一次迭代的结果。

max_iter的值需要根据具体的数据集和模型复杂度来进行调整。如果模型在默认迭代次数内没有收敛,可以适当增加max_iter的值。与此同时,也要注意控制迭代次数,以避免过度拟合或训练时间过长的问题。

逻辑回归的数学目的是求解能够让模型最优化的参数 \Theta的值,即求解能够让损失函数最小化的\Theta的值, 而这个求解过程,对于二元逻辑回归来说,有多种方法可以选择,最常见的有梯度下降法(Gradient Descent),坐标轴下降法(Coordinate Descent),牛顿法(Newton-Raphson method)等,每种方法都涉及复杂的数学原理,但这些计算在执行的任务其实是类似的。

重要参数solver(使用的优化算法)

sklearn.linear_model.LogisticRegression中的参数solver用于指定逻辑回归模型的优化算法。下面是solver参数的详细说明:

  1. "newton-cg": 使用牛顿共轭梯度法进行优化。适用于较小的数据集,对特征数量敏感。

  2. "lbfgs": 使用拟牛顿法的Limited-memory Broyden-Fletcher-Goldfarb-Shanno算法进行优化。适用于较小的数据集。

  3. "liblinear": 使用坐标下降法进行优化。适用于较大的数据集,支持L1和L2正则化。

  4. "sag": 使用随机平均梯度法进行优化。适用于大规模数据集。

  5. "saga": 与"sag"类似,但支持弹性网络正则化。适用于大规模数据集。

不同的solver对模型的收敛速度和性能可能会有所影响。在选择solver时,可以考虑数据集的规模、特征数量以及是否需要使用正则化等因素来选择合适的优化算法。

重要参数class_weight(样本不平衡)

class_weight用于指定不同类别的权重。默认情况下,所有类别的权重都是相等的。

逻辑回归是一种二分类模型,但也可以用于多分类问题。当数据集中的类别不平衡时,即某些类别的样本数量远大于其他类别时,设置class_weight参数可以帮助模型更好地处理不平衡的情况。

class_weight参数可以接受以下几种输入形式:

  1. 'balanced':自动根据训练集中各类别的样本数量来计算权重。较少样本的类别将会有较高的权重。
  2. 字典:用于指定每个类别的权重。字典的键为类别的索引或标签,值为对应的权重。
  3. 数组:用于指定每个类别的权重。数组的索引对应类别的索引或标签,值为对应的权重。

设置class_weight参数可以提高模型对少数类别的识别能力,从而避免模型过度依赖多数类别。

参考资料

【技术干货】菜菜的机器学习sklearn

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为数通方向HCIP-DataCom H12-821题库(单选题:421-440)

第421题 以下关于IS-IS中路由器分类的描述,错误的是哪一项? A、Level-1路由器无法与Level-2路由器建立邻接关系 B、华为路由器上配置IS-IS时,缺省时,路由器全局Level为Level-1-2 C、Level-2的LSDB只包含Level-2路由器所在区域的路由信息 D、Level-1路由器可以和Level-1-2路…

vite打包原理

vite 工程化开发:打包工具 启动速度很快 核心原理还是webpack 把webpack封装了,把webpack对象封装了 和vue2整体结构几乎一致 webpack两种模式:开发&生产 代码打包编译,本地起一个web服务器实时预览编译后的结果 build 命令模…

Go协程揭秘:轻量、并发与性能的完美结合

目录 1. Go协程简介什么是Go协程?Go协程与线程的比较Go协程的核心优势 2. Go协程的基本使用创建并启动Go协程使用匿名函数创建Go协程Go协程与主函数 3. Go协程的同步机制1. 通道 (Channels)2. sync.WaitGroup3. 互斥锁 (sync.Mutex) 4. Go协程的高级用法1. 选择器 (…

jss/css/html 相关的技术栈有哪些?

js 的技术组件有哪些?比如 jQuery vue 等 常见的JavaScript技术组件: jQuery: jQuery是一个快速、小巧且功能丰富的JavaScript库,用于简化DOM操作、事件处理、动画效果等任务。 React: React是由Facebook开发的用于构…

【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(上)

系列文章目录 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(上) 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(中) 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate…

海量数据处理商用短链接生成器平台 - 2

第二章 短链平台项目创建git代码管理开发分层规范 第1集 短链平台实战-Maven聚合工程创建微服务项目 **简介:Maven聚合工程创建微服务项目实战 ** Maven聚合工程拆分 dcloud-common 公共依赖包 dcloud-app FlinkKafka实时计算 dcloud-account 账号流量包微服务 dc…

程序报错无法打开源文件stdafx.h

在运行代码时,代码中头文件突然报错程序无法打开源文件stdafx.h include “stdafx.h”,编译器就说无法打开源文件,直接上干货解决方法是: 1.打开项目 ->项目属性(最后一个)-> C/C ->常规, 2在附…

【MySQL】——数据定义

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

第二十二回 横海郡柴进留宾 景阳冈武松打虎-大模型ChatGLM2-6B新手速通

柴进说这人叫武松,排名老二。宋江说江湖上听说过武二郎的名字,幸会幸会,就拉着武松的手,一起喝酒吃饭。 武松是家喻户晓的打虎英雄,现在最流行的是大模型! 大模型ChatGLM2-6B新手速通! 人工智能…

成都爱尔林江院长解读儿童青少年为什么一定要进行医学验光配镜

根据国家卫健委数据显示:我国青少年儿童总体近视率为52.7%、高度近视人口超3000万。近视学生中,有10%为高度近视,且占比随年级升高而增长。 近视孩子之多,孩子视力发展备受关注。戴镜进行近视防控十分必要,且眼镜不可随意验配! 成…

超越体量:TinyLlama用1.1B参数实现大模型级性能

引言 随着人工智能技术的快速发展,大型语言模型(LLM)在全球范围内受到瞩目。但与此同时,另一类模型正在逐渐崭露头角:参数规模较小的语言模型。这类模型在计算资源受限的环境下显示出巨大潜力,特别是在智能…

SpringbootV2.6整合Knife4j 3.0.3 问题记录

参考 https://juejin.cn/post/7249173717749940284 近期由于升级到springboot2.6X,所以服务端很多组件都需要重新导入以及解决依赖问题。 下面就是一个很经典的问题了, springboot2.6与knife4j的整合。 版本对应 springboot2.6与knife4j 3.0.3 坑 …

STM32外部中断(红外传感器与旋转编码器计数案例)

文章目录 一、介绍部分简介中断系统中断执行流程STM32中断NVIC基本结构NVIC优先级分组外部中断外部中断简介外部中断基本结构外部中断的流程AFIOEXTI框图 相关外设介绍旋转编码器介绍硬件电路对射式红外传感器 二、代码实现对射式红外传感器计次连接电路封装红外传感器与中断函…

JDK17中的密封类sealed和permits使用指南:什么是Java中的sealed和permits?

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

【工作周志】240129-240204

本周学习了AXI相关的内容 AMBA (Advanced Microcontroller Bus Architecture) AXI (Advanced eXtensible Interface) ARM公司提出,AMBA3.0协议中重要组成部分,是一种面向高性能、高带宽、低延迟的片内总线…

docker入门教程之将应用程序容器化

将应用程序容器化 在本指南的其余部分中,您将使用在 Node.js 上运行的简单待办事项列表管理器。如果您不熟悉 Node.js,请不要担心。本指南不需要任何 JavaScript 经验。 先决条件 您已安装最新版本的 Docker Desktop。您已经安装了 Git 客户端。您可以…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书类别添加模块UI设计实现

锋哥原创的PyQt6图书管理系统视频教程: PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

【React】react组件传参、redux状态管理

【React】react组件传参、redux状态管理 一、props:父组件向子组件传参1、将普通的参数作为props传递2、将jsx作为props传递(组件插槽)(1)基础功能示例(2)进阶示例 二、自定义事件:子…

【前端必备】深入详解Vue2/Vue3 diff算法实现思路

在做diff算法之前有个基本逻辑要明白,Vue的diff算法是同层比较,不会跨层比较,时间复杂度为O(N)。 主要使用首尾比较法(头-头,头-尾,尾-头,尾-尾)。Vue2与Vue3的diff算法主要区别是处…

Mysql运维篇(四) MySQL常用命令

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。如有侵权,请留言,我及时删除! 一、MySQL命令速查表 https://www.cnblogs.com/pyng/p/15560059.html Mysql DBA运维命令大全 - 墨…