【逻辑回归+实战】

embedded/2024/9/24 21:41:36/

原文: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/embedded/116273.html

相关文章

web基础—dvwa靶场(七)SQL Injection

SQL Injection(SQL注入) SQL Injection(SQL注入),是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的,常常会导致…

【爬虫工具】小红书评论高级采集软件

用python开发的爬虫采集工具【爬小红书搜索评论软件】,支持根据关键词采集评论。 思路:笔记关键词->笔记链接->评论 软件界面: 完整文章、详细了解: https://mp.weixin.qq.com/s/C_TuChFwh8Vw76hTGX679Q 好用的软件一起分…

爬虫到底难在哪里?

如果你是自己做爬虫脚本开发,那确实难,因为你需要掌握Python、HTML、JS、xpath、database等技术,而且还要处理反爬、动态网页、逆向等情况,不然压根不知道怎么去写代码,这些技术和经验储备起码得要个三五年。 比如这几…

卡西欧相机SD卡格式化后数据恢复指南

在数字摄影时代,卡西欧相机以其卓越的性能和便携性成为了众多摄影爱好者的首选。然而,随着拍摄量的增加,SD卡中的数据管理变得尤为重要。不幸的是,有时我们可能会因为操作失误或系统故障而将SD卡格式化,导致珍贵的照片…

基于STM32设计的智能货架(华为云IOT)(225)

文章目录 一、前言1.1 项目介绍【1】项目背景【2】项目支持的功能【3】项目硬件模块组成【4】ESP8266工作模式配置【5】Android手机APP开发思路【6】项目模块划分1.2 项目开发背景【1】选题来源与背景【2】国内外研究现状【3】课题研究的目的和内容【4】参考文献【5】研究内容【…

系统架构设计师 SOA与微服务架构篇

一、引言 📖 在现代软件开发中,SOA 🟡 和 微服务 🟩是两种主要的架构风格。本文将深入探讨这两种架构。 二、SOA与微服务的对比🆚 微服务架构:灵活的去中心化架构 特点 💡 高度模块化&#xf…

re题(27)BUUFCTF-[MRCTF2020]Transform

BUUCTF在线评测 (buuoj.cn) 先到ida,先看一下字符串 找到主函数 int __cdecl main(int argc, const char **argv, const char **envp) {char Str[104]; // [rsp20h] [rbp-70h] BYREFint j; // [rsp88h] [rbp-8h]int i; // [rsp8Ch] [rbp-4h]sub_402230(argc, argv…

mybatisplus介绍以及使用(下)

目录 一、mybatisplus扩展功能 1、代码生成 1.1 安装插件 1.2 使用 2、逻辑删除 二、插件功能 1、分页插件 2、示例 写在前面: 在上篇的mybatisplus中介绍到了其概念,其中包括了什么是mybatisplus以及已经有了mybatis但是我们为什么使用它&#x…