机器学习之监督学习(二)逻辑回归(二元分类问题)
机器学习之监督学习(二)逻辑回归(二元分类问题)
- 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+e−z1
(为了和模型表达式一致,将函数用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)(1−g(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
x1和x2,紫色直线将两种类别的数据点进行了划分,从图中可以看出直线方程为:
x
1
+
x
2
−
3
=
0
x_1+x_2-3=0
x1+x2−3=0
x
1
+
x
2
−
3
x_1+x_2-3
x1+x2−3正是对两个特征的线性运算,如果参照
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+x2−3=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=1∑m21(fw,b(x(i))−y(i))2=m1i=1∑m21(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^)−(1−y)log(1−y^)
那么代价函数为:
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=1∑mL(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)})
∂wj∂J(w,b)=m1i=1∑mxj(i)(sigmoid(w⋅x(i)+b)−y(i))∂b∂J(w,b)=m1i=1∑m(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=1∑m(sigmoid(w⋅x(i)+b)−y(i))2+2mλj=1∑nwj2
引入正则化后,梯度计算变成:
∂
∂
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)})
∂wj∂J(w,b)=m1i=1∑mxj(i)(sigmoid(w⋅x(i)+b)−y(i))+mλwj∂b∂J(w,b)=m1i=1∑m(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=1∑m[yiln(pi)+(1−yi)ln(1−pi)]
平衡数据集评价指标
对于类别分布大致均匀的平衡数据集,除了对数损失外,另一个常用且有效的指标是准确率。
准确率(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+R2PR(P:Precison,R:Recall)