【逻辑回归+实战】

ops/2024/9/24 18:11:17/

原文:https://blog.csdn.net/didiaopao/article/details/126483343

回归和分类区别

回归:
举个例子,输入一个人每日的运动时间、睡眠时间、工作时间、饮食等一些特征来预测一个人的体重,一个人的体重的值可以有无限个值。所以预测的结果是无限的、不确定的连续数值。这样的机器学习任务就是回归任务,如线性回归我们用平方差损失函数。
分类:
如果利用一个人每日的运动时间、睡眠时间、工作时间、饮食等一些特征来判断这个人的身体状况是否健康,那么最终的判断的结果就只有两种健康和不健康。这样的输出结果为离散值,预测的结果也是一个有限的数值来代表种类,如逻辑回归分类我们用交叉熵损失函数。

逻辑回归

虽然有回归,但他是来做二分类的任务,逻辑回归模型通过一个线性组合
y = x 0 w 0 + x 1 w 1 + x 2 w 2 + ⋅ ⋅ ⋅ + x n w n + b y=x_0w_0+x_1w_1+x_2w_2+···+x_nw_n+b y=x0w0+x1w1+x2w2+⋅⋅⋅+xnwn+b
y = W T X + b y=W^TX+b y=WTX+b
其中x为样本某一特征取值, wT及b为输入参数。
上式输出的值是可以小于0或者大于1的。但我们希望逻辑回归输出一个0到1的数。可以借助Sigmoid函数来将输出映射到0到1:
先来学习下sigmoid函数
g ( y ) = 1 1 + e − y g(y)=\frac{1}{1+e^{-y}} g(y)=1+ey1

即当z趋近于负无穷时值 g ( z ) g(z) g(z)无限趋近于0,当z趋近于正无穷时值 g ( z ) g(z) g(z)无限趋近于1,也就是说它可以将自变量约束到0和1间

模型公式推导

因此,逻辑回归模型可以用如下的公式来表达:
g ( y ) = 1 1 + e − W T X + b g(y)=\frac{1}{1+e^{-W^TX+b}} g(y)=1+eWTX+b1

因此对于一个二分类的的问题,此时正例和反例的函数表达式就如下式所示:
预测结果为正例的表达式:
p ( y = 1 ∣ X ) = 1 1 + e − W T X + b p(y = 1|X) =\frac{1}{1+e^{-W^TX+b}} p(y=1∣X)=1+eWTX+b1
可以理解为模型预测结果 y为1的概率,例如我们通过这个模型预测完的y=0.95,也就是说预测结果 y为1的概率为95%,那么预测为0的概率呢,当然是100%-95%,即如下
预测结果为反例的表达式:
p ( y = 0 ∣ X ) = e − W T X + b 1 + e − W T X + b = 1 − p ( y = 1 ∣ X ) p(y = 0|X) =\frac{e^{-W^TX+b}}{1+e^{-W^TX+b}}=1-p(y = 1|X) p(y=0∣X)=1+eWTX+beWTX+b=1p(y=1∣X)

在函数的计算推导过程中,如果分别考虑正反两例情况,计算起来就特别麻烦,
因此可以将上述两个例子合并起来得到如下公式:
故模型公式为
p ( y ∣ X ) = p ( y ∣ X ) y [ 1 − p ( y ∣ X ) ] 1 − y p(y|X)=p(y|X)^y[1-p(y |X)] ^{1-y} p(yX)=p(yX)y[1p(yX)]1y
也就是当y为0时是后项,为1时为前项

损失函数

小写希腊字母: α , β , γ , δ , ϵ , ζ , η , θ , ι , κ , λ , μ , ν , ξ , π , ρ , σ , τ , υ , ϕ , χ , ψ , ω \alpha, \beta, \gamma, \delta, \epsilon, \zeta, \eta, \theta, \iota, \kappa, \lambda, \mu, \nu, \xi, \pi, \rho, \sigma, \tau, \upsilon, \phi, \chi, \psi, \omega α,β,γ,δ,ϵ,ζ,η,θ,ι,κ,λ,μ,ν,ξ,π,ρ,σ,τ,υ,ϕ,χ,ψ,ω
大写希腊字母: Γ , Δ , Θ , Λ , Ξ , Π , Σ , Υ , Φ , Ψ , Ω \Gamma, \Delta, \Theta, \Lambda, \Xi, \Pi, \Sigma, \Upsilon, \Phi, \Psi, \Omega Γ,Δ,Θ,Λ,Ξ,Π,Σ,Υ,Φ,Ψ,Ω
上面引入的sigmoid函数仅仅起分类0到1的作用,z函数是预测的模型函数,那么损失函数是什么呢

前面的逻辑回归模型也有了,利用该模型可以对输入的数据特征进行分类判断。但是模型的
判断能力的好坏取决于模型中的参数𝑤和𝑏,因此我们需要从提供的数据样本中不断学习,从
而更新参数𝑤和𝑏使得预测出的结果全部正确的概率最大,简单来讲就是所有的样本的预测正
确的概率相乘得到数值是最大的
,按这样的要求得到数据表达式如下所示,该式就是逻辑回归
的损失函数。

L ( w , b ) = ∏ i = 1 m p ( 1 ∣ X ) y i ( 1 − p ( 1 ∣ X ) ) 1 − y i L(w, b) =\prod_{i=1}^{m} p(1|X)^{y_i}(1-p(1 |X))^{1-{y_i}} L(w,b)=i=1mp(1∣X)yi(1p(1∣X))1yi
这里我的理解是当在数据集中某个样本 X 1 X_1 X1的y为1,通过模型预测出来的结果为0.8(即为1的概率为80%),某个样本 X 2 X_2 X2的y为1,通过模型预测出来的结果为0.85(即为1的概率为85%),某个样本 X 3 X_3 X3的y为0,通过模型预测出来的结果为0.9(即为0的概率为90%),我们把每个预测出来的结果求积,要让积最大,也就是为正确的概率最大

L ( w , b ) = ∏ i = 1 m ( σ ( W T x i + b ) ) y i ( 1 − σ ( W T x i + b ) ) 1 − y i L(w, b) =\prod_{i=1}^{m} (\sigma(W^Tx_i+b))^{y_i}(1-\sigma(W^Tx_i+b))^{1-{y_i}} L(w,b)=i=1m(σ(WTxi+b))yi(1σ(WTxi+b))1yi
相对连乘运算,连加运算计算起来要比连乘要简单许多,因此可以利用两边同时取log的形式让连乘变成连加。此时就变成如下式所示:
l ( w , b ) = log ⁡ L ( w , b ) l(w, b)=\log L(w,b) l(w,b)=logL(w,b)
l ( w , b ) = ∑ i = 1 m [ y i log ⁡ σ ( W T x i + b ) + ( 1 − y i ) log ⁡ ( 1 − σ ( W T x i + b ) ) ] l(w, b) =\sum_{i=1}^{m} \left[ y_i \log \sigma(W^Tx_i+b)+ (1 - y_i) \log (1 - \sigma(W^Tx_i+b)) \right] l(w,b)=i=1m[yilogσ(WTxi+b)+(1yi)log(1σ(WTxi+b))]
此时我们只需要找到一组参数𝑤和𝑏使得𝑙 𝑤, 𝑏 最大即可,但是在机器学习中通常希望把上升问题转化为下降问题,因此将该函数取相反数即可。得到下式:
J ( w , b ) = − 1 m l ( w , b ) J(w,b)=-\frac{1}{m}l(w, b) J(w,b)=m1l(w,b)
除以m是取平均,J (w,b)这个函数就是逻辑回归最终的损失函数
两个知识点:
①sigmoid的导数如: g ′ ( z ) = g ( z ) ( 1 − g ( z ) ) g'(z)=g(z)(1-g(z)) g(z)=g(z)(1g(z))

②: l o g ′ x = 1 x log'x=\frac{1}{x} logx=x1

梯度下降

此时,只要利用梯度下降法进行参数更新就能通过数据样本不断学习更新参数了,梯度下降法的步骤如下:
  步骤1,利用损失函数求解对应参数的偏导数:
  w参数的偏导数的计算步骤如下所示:

①:参数w的更新
∂ J ( w , b ) ∂ w = 1 m ∑ i = 1 m ( σ ( w T x i + b ) − y i ) x i \frac{\partial J(w,b)}{\partial w}=\frac{1}{m}\sum_{i=1}^{m} (\sigma(w^Tx_i+b)-y_i)x_i wJ(w,b)=m1i=1m(σ(wTxi+b)yi)xi
②:参数b的更新
∂ J ( w , b ) ∂ b = 1 m ∑ i = 1 m σ ( w T x i + b ) − y i \frac{\partial J(w,b)}{\partial b}=\frac{1}{m}\sum_{i=1}^{m} \sigma(w^Tx_i+b)-y_i bJ(w,b)=m1i=1mσ(wTxi+b)yi

所以
w = w − ∂ J ( w , b ) ∂ w w=w-\frac{\partial J(w,b)}{\partial w} w=wwJ(w,b)
b = b − ∂ J ( w , b ) ∂ b b=b-\frac{\partial J(w,b)}{\partial b} b=bbJ(w,b)

代码

import numpy as np
import pandas as pd# 不像上一章需要我们手打算法,这里直接用sklearn定义好的算法# 导入数据集划分的,就是划分训练集,测试集和验证集
from sklearn.model_selection import train_test_split# 导入数据集预处理的MinMaxScaler,它主要用于将特征缩放到给定的最小值和最大值之间,通常是 0 和 1,
# 但也可以是其他范围。这种缩放方法对于许多机器学习算法来说是非常有用的,
# 特别是那些基于距离的算法(如 K-近邻、K-均值聚类等)和需要梯度下降优化的算法(如神经网络)。
# 说白了就是归一化,因为不管是机器学习模型还是深度学习模型总是认为数值量级越大越重要
# 同时归一化后主要由每个特征的w决定权重,并且训练速度也大大加快了
from sklearn.preprocessing import MinMaxScaler# 导入逻辑回归模型
from sklearn.linear_model import LogisticRegression# 导入模型评估的函数,如精确率,F1,召回率等等
from sklearn.metrics import classification_report
##############################数据预处理###################################
# 读取数据
dataset = pd.read_csv("breast_cancer_data.csv")
# ctrl+?快速注释
# print(dataset)# 提取特征x
X = dataset.iloc[:, :-1]  # 选择除了最后一列之外的所有列
# print(X)# 提取标签y
Y = dataset["target"]  # 选择除了最后一列之外的所有列
# print(Y)# 划分训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(X,Y,test_size=0.2)# 进行数据的归一化
sc = MinMaxScaler(feature_range=(0,1))
x_train = sc.fit_transform(x_train)
x_test = sc.fit_transform(x_test)##############################################逻辑回归模型搭建####################################################
lr = LogisticRegression()
lr.fit(x_train,y_train)# 打印模型的参数
# print("w=", lr.coef_)
# print("b=", lr.intercept_)# 利用训练好的模型进行推理
pre_reslut = lr.predict(x_test)
# print(pre_reslut)# 打印预测结果的概率
pre_reslut_proba = lr.predict_proba(x_test)
# print(pre_reslut_proba)# 获取恶性肿瘤的概率
pre_list = pre_reslut_proba[:,1]
# print(pre_list)# 设置阈值,大于 30%的认为是恶心肿瘤
thresholds = 0.3# 设置保存结果的列表
reslut = []
reslut_name = []for i in range(len(pre_list)):if pre_list[i] > thresholds:reslut.append(1)reslut_name.append("恶性肿瘤")else:reslut.append(0)reslut_name.append("良性肿瘤")# print(reslut)
# print(reslut_name)##############################################模型预测结果评估####################################################
# 输出结果的精确率,召回率,F1
report = classification_report(y_test,reslut,labels = [0,1],target_names=["良性肿瘤","恶性肿瘤"])
print(report)

http://www.ppmy.cn/ops/115389.html

相关文章

Rust 运算符快速了解

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 4.1 运 算 符 前面已经学习了变量和常量,本节开始对它们进行操作&am…

pandas外文文档快速入门

pandas资源可以在github中进行查询 特点: 1、基于numpy库进行开发 2、主要处理一维、二维的数据 3、可以处理sql,execl,时间表等复杂数据结构 导言 创建一维、二维表 创建的表格其实会和二维表很像 假设我们存储一些数据 其中&#xf…

在idea里运行swing程序正常,但是在外部运行jar包却报错,可能是jdk版本问题

在idea里运行swing程序异常,报Caused by: java.awt.HeadlessException错误 System.setProperty("java.awt.headless","false");加上这句话

【sql】MySQL中去重处理的方法

在MySQL中,去重通常指的是从查询结果中删除重复的行。这可以通过多种方式实现,具体取决于你的需求。以下是一些常见的去重方法: 1. DISTINCT 关键字: 使用 DISTINCT 关键字可以返回唯一不同的值。 SELECT DISTINCT column_name…

VSCode集成Python环境搭建配置详细步骤

1. 安装VSCode 在开始我们的Python编程之旅前,首先需要准备好我们的开发工具——Visual Studio Code,简称VSCode。VSCode是一款由微软开发的轻量级但功能强大的源代码编辑器,支持多种编程语言,并且拥有丰富的扩展生态系统。接下来,我们将一步步教你如何下载、安装以及汉化…

《JKTECH柔性振动盘:原理与多行业应用》东莞市江坤自动化科技有限公司

一、柔性振动盘的原理 柔性振动盘是一种新型的自动化上料设备,它采用先进的音圈电机技术和柔性振动技术,实现了对各种不规则形状、微小尺寸、易损伤零部件的高效上料和分拣。 其工作原理主要包括以下几个方面: 1. 音圈电机驱动 柔性振动盘内部…

Vue3:自定义customRef

目录 一.性质 1.自定义性 2.工厂函数参数 3.track 和 trigger 函数 二.作用 1.防抖/节流 2.异步更新 3.条件性更新 4.精细控制依赖追踪 5.优化性能 三.使用 1.ts组件 2.vue.组件 四.代码 1.ts代码 2.vue代码 五.效果 在 Vue 3 中,customRef 是一个…

Scrapy爬虫框架 Pipeline 数据传输管道

在网络数据采集领域,Scrapy 是一个非常强大的框架,而 Pipeline 是其中不可或缺的一部分。它允许我们在数据处理的最后阶段对抓取的数据进行进一步的处理,如清洗、存储等操作。 本教程将详细介绍如何在 Scrapy 中使用 Pipeline,帮…