当前位置: 首页 > article >正文

【逻辑回归+实战】

原文: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.kler.cn/news/317581.html

相关文章:

  • LLM安全风险及应对
  • Android CarrierConfig 配置问题的解决流程
  • QT编译之后的debug包下运行程序双击运行出现无法定位程序输入点__gxx_personlity_seh0于动态链接库
  • Linux:文件描述符详解
  • react 常用hooks封装--useReactive
  • 全栈开发(五):初始化前端项目(nuxt3+vue3+element-plus)+前端代理
  • 【JVM】JVM执行流程和内存区域划分
  • 安卓13删除下拉栏中的设置按钮 android13删除设置按钮
  • 51单片机快速入门之按键应用拓展
  • Python编码系列—Python桥接模式:连接抽象与实现的桥梁
  • 如何进入电脑BIOS
  • 几十块的麦克风能用吗?一文看懂什么领夹麦的音质最好又降噪
  • Knife4j 一款基于Swagger的开源文档管理工具
  • 无人机蜂群的应用会对现有作战体系造成多大影响?
  • 【高阶数据结构】二叉搜索树的插入、删除和查找(精美图解+完整代码)
  • 防火墙配置变更管理
  • 医院预约|基于springBoot的医院预约挂号系统设计与实现(附项目源码+论文+数据库)
  • Web自动化测试
  • C语言中的关键字详细梳理
  • 力扣76 最小覆盖子串 Java版本
  • 面试知识点总结篇三
  • Linux-网络编程
  • MySQL record 06 part
  • Chainlit集成LlamaIndex实现知识库高级检索(BM25全文检索器)
  • 爬虫的流程
  • vulnhub(13):Digitalworld.local JOY(ftp 的未授权文件读写漏洞、文件覆盖提权)
  • 获取商品销量详情API:深入解析返回值,助力电商决策
  • hrm人力资源管理系统,绩效,考勤,薪酬,五险一金,等全面人力管理(源码+配套方案)
  • Java面试篇基础部分-ReentrantLock详解
  • 应用密码学第一次作业(9.23)