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

机器学习之监督学习(二)逻辑回归(二元分类问题)

机器学习之监督学习(二)逻辑回归(二元分类问题)

  • 1. 分类 classification
  • 2.二元分类逻辑回归 binary-classified logistic regression
    • 模块1: sigmoid 激活函数 sigmoid function
    • 模型公式
    • 模块2: 决策边界 decision boundary
    • 代价函数
    • 梯度下降
    • 欠拟合与过拟合、正则化
    • 模块3:评价指标
      • 数据集的平衡性
      • 平衡数据集评价指标
      • 非平衡数据集评价指标

文章传送:
机器学习之监督学习(一)线性回归、多项式回归、算法优化
(建议:先看上一篇文章再食用更佳)

1. 分类 classification

分类的目标是根据输入数据将样本分配到不同类别中,输出标签是离散的如有限的类别。例如垃圾邮件过滤,手写数字0-9识别。

在这一章节我们先讨论二元分类问题,二元分类指输出值只有两个取值(表示两个类别)。

在上一篇文章中,我们详细介绍了线性回归模型,用于实现对连续输出数值的预测。当输出为有限值或有限类别时,线性回归模型是否还能生效?

看下图,横轴表示肿瘤的尺寸,纵轴表示肿瘤良性(0)或恶性(1),用X和O区分两种类别的数据点。当不考虑最右边的样本点时,可以看到当使用蓝色直线拟合,并选择y=0.5对应的临界x值作为分类的阈值时,的确能区分两个类别。但一旦加入右边的样本点(比较极端),可以看到模型判断肿瘤形状的效果就不太行了。从这个案例中可以看出线性回归模型并不适用于分类问题。广泛应用于解决分类问题的模型是逻辑回归模型。从后文可以看到,逻辑回归算法以线性回归算法为基础,但引入了激活函数,输出数据处于各个类别的概率,最大概率对应的类别即预测类别。

在这里插入图片描述

接下来让我们进入逻辑回归模型的学习,并最终运用它来实现手写数字0和1识别。


2.二元分类逻辑回归 binary-classified logistic regression


模块1: sigmoid 激活函数 sigmoid function

S型生长曲线是一类在自然和社会现象中常出现的曲线形状,它由三个阶段组成:起始阶段、加速阶段和饱和阶段。在起始阶段,增长速度较慢;在加速阶段,增长速度逐渐加快;在饱和阶段,增长速度逐渐减缓。
在这里插入图片描述
在数学上,描述S型曲线的函数称为sigmoid函数,表达式为:
g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+ez1
(为了和模型表达式一致,将函数用g表示,输入变量用z表示)
1、函数图像,单调递增,奇函数
在这里插入图片描述
2、值域:g ∈ \in (0,1),由于输出范围在0到1之间,Sigmoid函数可以将任意实数映射到一个有限的范围内,适合处理概率问题,这使它成为了机器学习模型中常用的激活函数。
3、导数:
①sigmoid函数处处连续可微
②sigmoid函数的导数很容易计算,可以直接由求导处函数值经简单计算得出:
g ′ ( z ) = g ( z ) ( 1 − g ( z ) ) g'(z)=g(z)(1-g(z)) g(z)=g(z)(1g(z))
(导数计算并不复杂,读者可以自行动笔进行计算)

在之后进入神经网络模型学习时,我们会对几种常用激活函数进行总结,除sigmoid激活函数之外,还包括线性激活函数、softmax激活函数、relu激活函数。


模型公式

了解了激活函数后,在这里我们先阐述逻辑回归模型的总体步骤,之后再对其原理进行深入剖析。

参数定义
符号定义
X:输入矩阵
y:输出/目标向量,二元分类问题中,假设取值y=0或1
y ^ \hat{y} y^:预测输出向量,二元分类问题中,假设取值y=0或1
m:训练数据量
n:特征数量

首先逻辑回归模型和线性回归模型一样,我们要设置 w w w b b b参数并使用最终使用梯度下降进行参数训练。在线性回归模型中,我们采用线性表达式预测目标值:
y ^ = f w ⃗ , b ( x ⃗ ) = w ⃗ ⋅ x ⃗ + b \hat{y}=f_{\vec{w},b}(\vec{x})=\vec{w}\cdot\vec{x}+b y^=fw ,b(x )=w x +b
在逻辑回归模型中,我们令
z = w ⃗ ⋅ x ⃗ + b z=\vec{w}\cdot\vec{x}+b z=w x +b
然后激活函数派上用场,将z输入,得到取值范围(0,1)的输出值,在二元分类问题中,sigmoid函数输出值用来预测某类别(y=1)的概率
f w ⃗ , b ( x ⃗ ) = g ( z ) = g ( w ⃗ ⋅ x ⃗ + b ) = P ( y = 1 ∣ x ⃗ , w ⃗ , b ) f_{\vec{w},b}(\vec{x})=g(z)=g(\vec{w}\cdot\vec{x}+b)=P(y=1|\vec{x},\vec{w},b) fw ,b(x )=g(z)=g(w x +b)=P(y=1∣x ,w ,b)
最后确定阈值 σ \sigma σ(一般0.5),如果g(z)< σ \sigma σ,则对应类别1,否则对应类别2。
i f f w ⃗ , b ( x ⃗ ) > σ , y ^ = 1 e l s e   y ^ = 0 if f_{\vec{w},b}(\vec{x})>\sigma,\hat{y}=1\\else ~\hat{y}=0 iffw ,b(x )>σ,y^=1else y^=0

为什么这样的模型能实现分类任务呢?我们得先了解决策边界(decision boundary )的概念。


模块2: 决策边界 decision boundary

看下图,共有两个特征 x 1 和 x 2 x_1和x_2 x1x2,紫色直线将两种类别的数据点进行了划分,从图中可以看出直线方程为:
x 1 + x 2 − 3 = 0 x_1+x_2-3=0 x1+x23=0
x 1 + x 2 − 3 x_1+x_2-3 x1+x23正是对两个特征的线性运算,如果参照 z = w ⃗ ⋅ x ⃗ + b z=\vec{w}\cdot\vec{x}+b z=w x +b,这里的权重向量是[1,1],偏置值是-3,我们记 x 1 + x 2 − 3 = z x_1+x_2-3=z x1+x23=z,则这条直线表示z=0。学过一点线性规划知识的我们知道,在紫色直线右边,z>0,对应y=1,在紫色直线左边,z<0,对应y=0,因此我们将z=0对应的这条直线称为这个问题中的一个决策边界
在这里插入图片描述
决策边界只能是直线吗?当然不是,参照我们将线性回归拓展到多项式回归的思想,我们可以将决策边界拓展到一般曲线,如下图:在这里插入图片描述

理解了决策边界后,再回过头来看上面逻辑回归的思路,就不觉得很无厘头了。
在sigmoid函数中,当z>0时,g(z)>0.5,对应类别y=1;当z<0时,g(z)<0.5,对应类别y=0。而上面所说的决策边界即表示z=0,边界的两侧区域(z>0,z<0)分别表示两个类别,这样就可以比较清晰的解释逻辑回归算法的底层原理。

代价函数

和线性回归一样,确定了模型后接下来便是确定成本函数,并使用梯度下降算法训练参数,优化模型。可是问题来了,这里的成本函数该如何选取,还是前面所说的平均平方损失函数吗?

结论是不宜采用平均平方损失函数
J ( w ⃗ , b ) = 1 m ∑ i = 1 m 1 2 ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) 2 = 1 m ∑ i = 1 m 1 2 ( g ( w ⃗ ⋅ x ⃗ + b ) − y ( i ) ) 2 J(\vec{w},b)=\frac{1}{m}\sum_{i=1}^{m}\frac{1}{2}(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})^2=\frac{1}{m}\sum_{i=1}^{m}\frac{1}{2}(g(\vec{w}\cdot\vec{x}+b)-y^{(i)})^2 J(w ,b)=m1i=1m21(fw ,b(x (i))y(i))2=m1i=1m21(g(w x +b)y(i))2
因为对于逻辑回归来说,平方误差成本函数不是简单的凸函数,容易陷入多个局部最小值中,因此不是最佳选择。
在这里插入图片描述

在介绍新的成本函数之前,我们先定义一下损失函数(loss)的概念,它描述了单个数据的预测误差,在平均平方损失函数中:
l o s s = L ( y ^ , y ) = 1 2 ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) 2 loss=L(\hat{y},y)=\frac{1}{2}(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})^2 loss=L(y^,y)=21(fw ,b(x (i))y(i))2

在逻辑回归中,我们使用对数损失函数(也叫二元交叉熵损失函数(Cross-Entropy Loss)(log表示ln)

在这里插入图片描述

为了理解这个对数损失函数,我们需要画出两个函数图像:

在这里插入图片描述
y=1时,对应绿色曲线,当预测值=1时零损失,当预测值越接近0时,损失越大,趋近于无穷;
y=0时,对应蓝色曲线,当预测值=0时零损失,当预测值越接近1时,损失越小,趋近于无穷。
由于分段函数不方便研究,因此将其改写成(记 y ^ = f w ⃗ , b ( x ⃗ ( i ) ) \hat{y}=f_{\vec{w},b}(\vec{x}^{(i)}) y^=fw ,b(x (i))):
L ( y ^ , y ) = − y l o g ( y ^ ) − ( 1 − y ) l o g ( 1 − y ^ ) L(\hat{y},y)=-ylog(\hat{y})-(1-y)log(1-\hat{y}) L(y^,y)=ylog(y^)(1y)log(1y^)
那么代价函数为:
J ( w ⃗ , b ) = 1 m ∑ i = 1 m L ( f w ⃗ , b ( x ⃗ ( i ) ) , y ) J(\vec{w},b)=\frac{1}{m}\sum_{i=1}^{m}L(f_{\vec{w},b}(\vec{x}^{(i)}),y) J(w ,b)=m1i=1mL(fw ,b(x (i)),y)
可以证明这个代价函数为凸函数。

梯度下降

引入了二元交叉熵损失后,我们得到了逻辑回归问题中的代价函数,下一步进入优化环节,还是采用梯度下降。

计算偏导
对于对数损失函数,偏导计算比较繁琐,这里不展开详细计算,只给出最终结果:
∂ ∂ w j J ( w ⃗ , b ) = 1 m ∑ i = 1 m x j ( i ) ( s i g m o i d ( w ⃗ ⋅ x ⃗ ( i ) + b ) − y ( i ) ) ∂ ∂ b J ( w ⃗ , b ) = 1 m ∑ i = 1 m ( s i g m o i d ( w ⃗ ⋅ x ⃗ ( i ) + b ) − y ( i ) ) \frac{\partial}{\partial{w_j}}J(\vec{w},b)=\frac{1}{m}\sum_{i=1}^{m}x_j^{(i)}(sigmoid(\vec{w}\cdot\vec{x}^{(i)}+b)-y^{(i)})\\\frac{\partial}{\partial{b}}J(\vec{w},b)=\frac{1}{m}\sum_{i=1}^{m}(sigmoid(\vec{w}\cdot\vec{x}^{(i)}+b)-y^{(i)}) wjJ(w ,b)=m1i=1mxj(i)(sigmoid(w x (i)+b)y(i))bJ(w ,b)=m1i=1m(sigmoid(w x (i)+b)y(i))
对比之前多元线性回归偏导表达式,我们惊奇的发现,两者高度类似,只是逻辑回归中经过激活函数再输出目标值。
在这里插入图片描述
计算出偏导后,便可以开始迭代若干次,更新参数,不断减小J,优化模型,实现代码参考:
二元分类逻辑回归python代码实现
当然,在模型中不要忘了数据预处理环节,包括特征编码、特征缩放。

使用scikit-learn实现逻辑回归

#从linear_model模块引入逻辑回归模块
from sklearn.linear_model import LogisticRegression
#创建逻辑回归器
lr_model = LogisticRegression()
#匹配数据集进行训练
lr_model.fit(X, y)
#模型预测(输出1/0)
y_pred = lr_model.predict(X)
#查看分类准确率
print("Accuracy on training set:", lr_model.score(X, y))

欠拟合与过拟合、正则化

在线性回归中,我们使用多项式函数的复杂程度来说明欠拟合、过拟合;在逻辑回归中,我们用决策边界的复杂程度来直观说明。
图一中,决策边界是一条直线,分类效果一般,属于欠拟合,问题是高偏差;
图二中,决策边界是一条二次平面曲线,在分界线两侧,虽然有两个离群数据点分类错误,但具备优秀的泛化能力,属于正拟合;
图三中,决策边界是更加复杂的曲线,为了迎合两个离群数据点,它完美的隔离了两类数据点,但明显这属于过拟合,问题是高方差。
在这里插入图片描述
为了防止过拟合,我们仍然采用正则化:
J ( w ⃗ , b ) = 1 2 m ∑ i = 1 m ( s i g m o i d ( w ⃗ ⋅ x ⃗ ( i ) + b ) − y ( i ) ) 2 + λ 2 m ∑ j = 1 n w j 2 J(\vec{w},b)=\frac{1}{2m}\sum_{i=1}^{m}(sigmoid(\vec{w}\cdot{\vec{x}^{(i)}}+b)-y^{(i)})^2+\frac{\lambda}{2m}\sum_{j=1}^{n}w_j^2 J(w ,b)=2m1i=1m(sigmoid(w x (i)+b)y(i))2+2mλj=1nwj2

引入正则化后,梯度计算变成:
∂ ∂ w j J ( w ⃗ , b ) = 1 m ∑ i = 1 m x j ( i ) ( s i g m o i d ( w ⃗ ⋅ x ⃗ ( i ) + b ) − y ( i ) ) + λ m w j ∂ ∂ b J ( w ⃗ , b ) = 1 m ∑ i = 1 m ( s i g m o i d ( w ⃗ ⋅ x ⃗ ( i ) + b ) − y ( i ) ) \frac{\partial}{\partial{w_j}}J(\vec{w},b)=\frac{1}{m}\sum_{i=1}^{m}x_j^{(i)}(sigmoid(\vec{w}\cdot\vec{x}^{(i)}+b)-y^{(i)})+\frac{\lambda}{m}w_j\\\frac{\partial}{\partial{b}}J(\vec{w},b)=\frac{1}{m}\sum_{i=1}^{m}(sigmoid(\vec{w}\cdot\vec{x}^{(i)}+b)-y^{(i)}) wjJ(w ,b)=m1i=1mxj(i)(sigmoid(w x (i)+b)y(i))+mλwjbJ(w ,b)=m1i=1m(sigmoid(w x (i)+b)y(i))

模块3:评价指标

在机器学习和数据挖掘领域,数据集的平衡性是指各类别样本数量的分布情况。以下是对平衡数据集和不平衡数据集的描述及示例:

数据集的平衡性


平衡数据集

定义:在平衡数据集中,各类别的样本数量大致相等,或至少没有明显的数量差异

示例
假设我们有一个数据集用于预测邮件是否为垃圾邮件(Spam或Not Spam)。如果这个数据集中有1000封邮件,其中500封是垃圾邮件,500封不是垃圾邮件,那么这是一个平衡数据集。


不平衡(倾斜)数据集

定义:在不平衡数据集中,各类别的样本数量存在显著差异,通常某些类别的样本数量远远少于其他类别。

示例
在一个医疗诊断数据集中,用于检测某种罕见疾病。如果这个数据集中有10000个样本,其中只有100个样本患有这种疾病,剩下的9900个样本没有患病,那么这是一个不平衡数据集。

在不平衡


无论是平衡还是非平衡数据集,都可以以对数损失(Log Loss)作为评价指标,因为它更关注模型预测的概率分布,与数据集是否平衡无关。
Log Loss = − 1 m ∑ i = 1 m [ y i ln ⁡ ( p i ) + ( 1 − y i ) ln ⁡ ( 1 − p i ) ] \text{Log Loss} = -\frac{1}{m} \sum_{i=1}^{m} \left[ y_i \ln(p_i) + (1 - y_i) \ln(1 - p_i) \right] Log Loss=m1i=1m[yiln(pi)+(1yi)ln(1pi)]

平衡数据集评价指标

对于类别分布大致均匀的平衡数据集,除了对数损失外,另一个常用且有效的指标是准确率。

准确率(Accuracy):表示分类正确率,即分类正确的数据数占总数据数比重。适用于类别分布均匀的情况,但在类别不平衡时可能会误导,因为多数类别的正确预测会掩盖少数类别的错误预测。
为了说明这点,我们举例如下:

在一个医疗数据集中,我们希望预测某种罕见病与健康的情况。如果数据集中有10000个样本,其中9900个是健康的,100个是罕见病的,即类别不平衡。

假设分类器对健康样本的准确率非常高,但对罕见病的检测效果较差。具体表现如下:

健康样本中,9850个被正确分类为健康,50个被错误分类为罕见病。
罕见病样本中,70个被正确分类为罕见病,30个被错误分类为健康。
根据公式,我们可以计算准确率=(9850+70)/10000=0.992,尽管这个准确率看起来很高,但它掩盖了对于罕见病的糟糕预测性能。

非平衡数据集评价指标

阳性事件(Positive Event)
定义:指在数据集中被标记为阳性的事件,通常表示某个特定的目标或现象的发生。例如,在医学研究中,阳性事件可能是患者确诊某种疾病;在金融诈骗检测中,阳性事件可能是检测到的诈骗行为。

特点:阳性事件通常是研究和分析的主要关注点,可能较少出现,导致数据集不平衡。

阴性事件(Negative Event)
定义:指在数据集中被标记为阴性的事件,表示特定的目标或现象未发生。继续以上述例子为例,阴性事件可能是患者未确诊为该疾病,或用户未发生诈骗行为。

特点:阴性事件通常发生频率较高,因此在非平衡数据集中,阴性样本往往占据更大比例。


在罕见病诊断案例中,我们定义y=1表示患罕见病,y=0表示不患病。定义患罕见病为阳性(positive)事件,不患病为阴性(negative)事件,则预测结果有四种情况,如下图表格所示,真阳性:患病->预测患病(True Positive,TP);假阳性:不患病->预测患病(False Positive,FP);真阴性:不患病->预测不患病(True Negative,TN);假阴性:不患病->预测患病(False Negative,FN)。

在这里插入图片描述
下面定义评价倾斜数据集预测效果的两个重要指标:

精确率 Precision
定义:精确率表示预测为阳性的对象中,为真阳性的对象所占的比重,公式表示为:
Precision = T P T P + N P \text{Precision}=\frac{TP}{TP+NP} Precision=TP+NPTP

召回率 Recall
定义:召回率表示实际为阳性的对象中,被预测为阳性的对象所占的比重,公式表达为:
Recall = T P T P + F N \text{Recall}=\frac{TP}{TP+FN} Recall=TP+FNTP

如何理解并区分这两个指标?下面形象的解释有利于理解两个指标的侧重点:
Precision 解释:宁可放走几个坏人,也不愿错杀无辜 (降低比例FP/(TP+FP))
Recall 解释:宁可错杀无辜,绝不放过一个坏人 (提升比例TP/(TP+FN))
从这个解释可以看出,Precision和Recall之间存在一定的对立关系。我们需要探讨如何在精确率和召回率之间做出权衡,使模型综合效果最优。

在前面中我们通常设定阈值 σ \sigma σ=0.5,根据我们的不同期望,可以对阈值进行修改(调高或调低),对应精确率或召回率的侧重。

1、希望在更有把握的情况下再诊断罕见病,即调高阈值 σ \sigma σ,那么在预测为阳性的对象里面,真阳性的比例会增大,即提高了精确率Precision,而另一方面在数据量不变的情况下,真阳性对象数减少(TP↓),而真实患病人数(TP+FN)不变,因此召回率Recall下降。

2、希望不错过任何可能得罕见病的对象,即调低阈值 σ \sigma σ,那么真阳性对象数减少(TP↑),召回率Recall上升,而精确率Precision下降。

在这里插入图片描述

如果两个指标中任一指标很差,那我们的分类模型很不理想,因此我们希望两个指标都足够好,这时引入一个综合指标F1 score:F1 Score 是精确率和召回率的调和平均数(避免一个指标过高而另一个指标过低的情况)
F 1   s c o r e = 2 P R P + R ( P : P r e c i s o n , R : R e c a l l ) F1~score=\frac{2PR}{P+R}(P:Precison,R:Recall) F1 score=P+R2PRP:Precison,R:Recall


http://www.kler.cn/a/287949.html

相关文章:

  • 数仓建设之Oracle常见语法学习
  • Python练习27
  • 谷歌AI进军教育,这将改变未来?
  • Nginx: 实现Websocket代理
  • Spring Cloud Eureka 服务注册与发现
  • c#————委托Action使用例子
  • 【ESP32】mqtt 发送和接收
  • 半导体是什么?
  • Spark MLlib模型训练—回归算法 Random forest regression
  • 【uniapp重大bug】uni-data-select的localdata改变,也会触发@change方法
  • Unity(2022.3.41LTS) - UI简介,了解
  • 鸿蒙(API 12 Beta3版)【媒体资源使用指导】Media Library Kit媒体文件管理服务
  • PHP高效进销存管理系统智能管理库存销售与采购系统小程序源码
  • Java 实现二叉树展平为链表
  • python打包 exe 提示no module named flask
  • 关于zotero无法识别拖入的pdf和caj的题录信息
  • 安全随机数生成指南
  • 38次8.28(docker03:容器网络,主从镜像)
  • 23种设计模式之代理模式
  • 如何写接口自动化测试断言?
  • SpringBoot 数据访问-jpa
  • 【CSS】如何写渐变色文字并且有打光效果
  • 嵌入式系统基础知识介绍
  • DAY65
  • 基于STM32和OpenCV的车载智能导航系统:实现实时交通标志与信号识别与预警(代码示例)
  • 将string类中能够实现的操作都封装在MyString类中