目录
常见的机器学习算法:
机器学习算法(一)—决策树
机器学习算法(二)—支持向量机SVM
机器学习算法(三)—K近邻
机器学习算法(四)—集成算法
基于XGBoost的集成学习算法
基于LightGBM的集成学习算法
机器学习算法(五)—聚类
机器学习算法(六)—逻辑回归
机器学习算法(七)—Apriori 关联分析
机器学习算法(八)—朴素贝叶斯
九种降维方法汇总
机器学习中监督学习模型的任务重点在于根据已有经验知识对未知样本的目标/标记进行预测。根据目标预测变量的类型不同,把监督学习任务大体分为分类学习和回归预测两类。分类学习是最为常见的监督学习问题,其中,最基础的是二分类问题,除此之外还有多分类问题。
一、逻辑回归
1.1 模型介绍
逻辑回归是在数据服从伯努利分布的假设下,通过极大似然的方法,运用梯度下降法来求解参数,从而达到将数据二分类的目的。
逻辑回归是一种用于二分类问题的统计方法,引入了一种 S型曲线(Sigmoid函数),它能将输出值压缩到0和1之间,从而解决了线性回归不适用分类问题的问题。
Sigmoid函数:
f
(
z
)
=
1
1
+
e
−
z
f(z) = \frac{1}{1+e^{-z}}
f(z)=1+e−z1
其中,
z
=
w
0
+
w
1
∗
x
1
+
w
2
∗
x
2
+
.
.
.
+
(
w
n
)
x
n
=
w
∗
x
z=w_0+w_1*x_1+w_2*x_2+...+(w_n)x_n=w*x
z=w0+w1∗x1+w2∗x2+...+(wn)xn=w∗x,逻辑回归可以将 z 映射为一个 0 到 1 之间的概率。X表示特征向量,W表示模型的参数。
1.2 工作原理
逻辑回归主要用于估计某个事件发生的概率,核心思想是使用线性回归来计算一个分数(即Z ),然后通过 Sigmoid函数将这个分数转化为概率,再以此概率进行分类。逻辑回归的参数是通过极大似然估计来确定。
1.2.1 对数几率模型
几率不是概率,而是一个事件发生与不发生的概率的比值。假设某事件发生的概率为p,则该事件不发生的概率为1-p,该事件的几率为:
o
d
d
(
p
)
=
p
1
−
p
odd(p)=\frac{p}{1-p}
odd(p)=1−pp
在几率的基础上取(自然底数的)对数,则构成该事件的对数几率(logit):
l
o
g
i
t
(
p
)
=
l
n
p
1
−
p
logit(p) = ln\frac{p}{1-p}
logit(p)=ln1−pp
如果我们将对数几率看成是一个函数,并将其作为联系函数,即
g
(
y
)
=
l
n
y
1
−
y
g(y)=ln\frac{y}{1-y}
g(y)=ln1−yy,则该广义线性模型为:
g
(
y
)
=
l
n
y
1
−
y
=
w
^
T
⋅
x
^
g(y)=ln\frac{y}{1-y}=\hat w^T \cdot \hat x
g(y)=ln1−yy=w^T⋅x^
此时模型就被称为对数几率回归(logistic regression),也被称为逻辑回归。
1.2.2 逻辑回归与Sigmoid函数
我们希望将上述对数几率函数“反解”出来,也就是改写为
y
=
f
(
x
)
y=f(x)
y=f(x)形式:
方程左右两端取自然底数:
y
1
−
y
=
e
w
^
T
⋅
x
^
\frac{y}{1-y}=e^{\hat w^T \cdot \hat x}
1−yy=ew^T⋅x^
方程左右两端+1可得:
y
+
(
1
−
y
)
1
−
y
=
1
1
−
y
=
e
w
^
T
⋅
x
^
+
1
\frac{y+(1-y)}{1-y}=\frac{1}{1-y}=e^{\hat w^T \cdot \hat x}+1
1−yy+(1−y)=1−y1=ew^T⋅x^+1
方程左右两端取倒数可得:
1
−
y
=
1
e
w
^
T
⋅
x
^
+
1
1-y=\frac{1}{e^{\hat w^T \cdot \hat x}+1}
1−y=ew^T⋅x^+11
1-方程左右两端可得:
y
=
1
−
1
e
w
^
T
⋅
x
^
+
1
=
e
w
^
T
⋅
x
^
e
w
^
T
⋅
x
^
+
1
=
1
1
+
e
−
(
w
^
T
⋅
x
^
)
=
g
−
1
(
w
^
T
⋅
x
^
)
\begin{aligned} y &= 1-\frac{1}{e^{\hat w^T \cdot \hat x}+1}\\ &=\frac{e^{\hat w^T \cdot \hat x}}{e^{\hat w^T \cdot \hat x}+1} \\ &=\frac{1}{1+e^{-(\hat w^T \cdot \hat x)}} = g^{-1}(\hat w^T \cdot \hat x) \end{aligned}
y=1−ew^T⋅x^+11=ew^T⋅x^+1ew^T⋅x^=1+e−(w^T⋅x^)1=g−1(w^T⋅x^)
因此,逻辑回归基本模型方程为:
y
=
1
1
+
e
−
(
w
^
T
⋅
x
^
)
y = \frac{1}{1+e^{-(\hat w^T \cdot \hat x)}}
y=1+e−(w^T⋅x^)1
同时我们也能发现,对对数几率函数的反函数为:
f
(
x
)
=
1
1
+
e
−
x
f(x) = \frac{1}{1+e^{-x}}
f(x)=1+e−x1
1.3.3 熵、相对熵与交叉熵
熵(entropy)表示随机变量不确定性的度量,或者说系统混乱程度、信息混乱程度。熵的计算公式如下:
H
(
X
)
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
H(X) = -\sum^n_{i=1}p(x_i)log(p(x_i))
H(X)=−i=1∑np(xi)log(p(xi))
其中,
p
(
x
i
)
p(x_i)
p(xi)表示多分类问题中第
i
i
i个类别出现的概率,
n
n
n表示类别总数,通常来说信息熵的计算都取底数为2,并且规定
l
o
g
0
=
0
log0=0
log0=0。
相对熵也被称为Kullback-Leibler散度(KL散度)或者信息散度(information divergence)。通常用来衡量两个随机变量分布的差异性。假设对同一个随机变量X,有两个单独的概率分布P(x)和Q(x),当X是离散变量时,我们可以通过如下相对熵计算公式来衡量二者差异:
D
K
L
(
P
∣
∣
Q
)
=
∑
i
=
1
n
P
(
x
i
)
l
o
g
(
P
(
x
i
)
Q
(
x
i
)
)
D_{KL}(P||Q)=\sum ^n_{i=1}P(x_i)log(\frac{P(x_i)}{Q(x_i)})
DKL(P∣∣Q)=i=1∑nP(xi)log(Q(xi)P(xi))
和信息熵类似,相对熵越小,代表Q(x)和P(x)越接近。从计算公式不难看出,这其实是一种非对称性度量,也就是
D
K
L
(
P
∣
∣
Q
)
≠
D
K
L
(
Q
∣
∣
P
)
D_{KL}(P||Q)≠D_{KL}(Q||P)
DKL(P∣∣Q)=DKL(Q∣∣P)。从本质上来说,相对熵刻画的是用概率分布Q来刻画概率分布P的困难程度,而在机器学习领域,我们一般令Q为模型输出结果,而P为数据集标签真实结果,以此来判断模型输出结果是否足够接近真实情况。
上述相对熵公式等价于:
D
K
L
(
P
∣
∣
Q
)
=
∑
i
=
1
n
P
(
x
i
)
l
o
g
(
P
(
x
i
)
Q
(
x
i
)
)
=
∑
i
=
1
n
P
(
x
i
)
l
o
g
(
P
(
x
i
)
)
−
∑
i
=
1
n
P
(
x
i
)
l
o
g
(
Q
(
x
i
)
)
=
−
H
(
P
(
x
)
)
+
[
−
∑
i
=
1
n
P
(
x
i
)
l
o
g
(
Q
(
x
i
)
)
]
\begin{aligned} D_{KL}(P||Q)&=\sum ^n_{i=1}P(x_i)log(\frac{P(x_i)}{Q(x_i)}) \\ &=\sum ^n_{i=1}P(x_i)log(P(x_i))-\sum ^n_{i=1}P(x_i)log(Q(x_i)) \\ &=-H(P(x))+[-\sum ^n_{i=1}P(x_i)log(Q(x_i))] \end{aligned}
DKL(P∣∣Q)=i=1∑nP(xi)log(Q(xi)P(xi))=i=1∑nP(xi)log(P(xi))−i=1∑nP(xi)log(Q(xi))=−H(P(x))+[−i=1∑nP(xi)log(Q(xi))]
而对于给定数据集,信息熵
H
(
P
(
X
)
)
H(P(X))
H(P(X))是确定的,因此相对熵的大小完全由
−
∑
i
=
1
n
P
(
x
i
)
l
o
g
(
Q
(
x
i
)
)
-\sum ^n_{i=1}P(x_i)log(Q(x_i))
−∑i=1nP(xi)log(Q(xi))决定。而该式计算结果也被称为交叉熵(cross entropy)计算。
c
r
o
s
s
_
e
n
t
r
o
p
y
(
P
,
Q
)
=
−
∑
i
=
1
n
P
(
x
i
)
l
o
g
(
Q
(
x
i
)
)
cross\_entropy(P,Q) = -\sum ^n_{i=1}P(x_i)log(Q(x_i))
cross_entropy(P,Q)=−i=1∑nP(xi)log(Q(xi))
因此,如果我们希望P、Q二者分布尽可能接近,我们就需要尽可能减少相对熵,但由于相对熵=交叉熵-信息熵,因此我们只能力求减少交叉熵。当然,也正因如此,交叉熵可以作为衡量模型输出分布是否接近真实分布的重要度量方法。
简单总结上述过程要点:
- 我们用相对熵 D K L ( P ∣ ∣ Q ) D_{KL}(P||Q) DKL(P∣∣Q)来表示模型拟合分布Q和数据真实分布P之间的差距,相对熵越小拟合效果越好;
- 根据计算公式, D K L ( P ∣ ∣ Q ) = − H ( P ( x ) ) + [ − ∑ i = 1 n P ( x i ) l o g ( Q ( x i ) ) ] D_{KL}(P||Q)=-H(P(x))+[-\sum ^n_{i=1}P(x_i)log(Q(x_i))] DKL(P∣∣Q)=−H(P(x))+[−∑i=1nP(xi)log(Q(xi))],相对熵=交叉熵-信息熵;
- 对于给定数据集,信息熵是确定的,因此我们只能通过尽可能减小交叉熵来降低相对熵;
1.3 损失函数和优化算法
使用交叉熵损失函数来衡量模型预测的概率与真实类别标签之间的差距。交叉熵损失定义如下:
L
(
y
,
y
^
)
=
−
1
N
∑
i
=
1
N
[
y
i
log
(
y
^
i
)
+
(
1
−
y
i
)
log
(
1
−
y
^
i
)
]
L(y, \hat{y}) = -\frac{1}{N} \sum_{i=1}^N \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right]
L(y,y^)=−N1i=1∑N[yilog(y^i)+(1−yi)log(1−y^i)]
其中,
y
i
y_i
yi是真实类别,
p
i
p_i
pi是模型的预测概率,
N
N
N 是样本数量。
1.3.1 损失函数的理论基础
- 训练数据不同、损失函数和模型参数都不同
带入训练的数据不同,损失函数会有所不同,进而训练出来的模型参数会有所不同,即最终得到不同的模型结果。例如有数据集如下:
Index | x | y |
---|---|---|
1 | 1 | 2 |
2 | 3 | 5 |
3 | 6 | 4 |
4 | 8 | 3 |
采用不带截距项的简单线性回归方程进行拟合:
y
=
w
x
y=wx
y=wx。损失函数计算公式为:
M
S
E
L
o
s
s
(
w
)
=
∑
i
=
1
n
∣
∣
y
i
−
y
^
i
∣
∣
2
2
n
MSELoss(w)=\frac{\sum_{i=1}^n||y_i-\hat y_i||_2^2}{n}
MSELoss(w)=n∑i=1n∣∣yi−y^i∣∣22
当我们带入全部四条数据进行计算时,损失函数为:
L
o
s
s
4
(
w
)
=
(
2
−
w
)
2
+
(
5
−
3
w
)
2
+
(
4
−
6
w
)
2
+
(
3
−
8
w
)
2
4
=
110
w
2
−
100
w
+
54
4
\begin{align} Loss_4(w) &= \frac{(2-w)^2+(5-3w)^2+(4-6w)^2+(3-8w)^2}{4} \\ &=\frac{110w^2-100w+54}{4} \end{align}
Loss4(w)=4(2−w)2+(5−3w)2+(4−6w)2+(3−8w)2=4110w2−100w+54
通过求解该损失函数能够得到最优
w
w
w结果,令损失函数导函数为0即可得
w
=
100
220
=
5
11
w=\frac{100}{220}=\frac{5}{11}
w=220100=115,最终解得模型
y
=
5
11
x
y = \frac{5}{11}x
y=115x
如果我们带入其中一条数据进行计算,例如带入第一条数据进行计算,则损失函数计算公式为:
L
o
s
s
1
(
w
)
=
(
2
−
w
)
2
=
w
2
−
4
w
+
4
Loss_1(w)=(2-w)^2 = w^2-4w+4
Loss1(w)=(2−w)2=w2−4w+4
此时解出最优参数结果为
w
=
2
w=2
w=2,即训练得出模型为
y
=
2
x
y=2x
y=2x。很明显,带入训练数据不同、损失函数不同、训练所得模型也不同。
由于模型其实是数据集规律的体现,而损失函数又是求解模型参数的基本函数,因此我们可以认定损失函数其实是一批数据所表现出规律的一种体现,并且不同数据的损失函数不同,我们就认定这几批数据对应的基本规律有所不同。如上述两个损失函数形态不同,其实也就代表着其背后的数据基本规律各不相同。
- 规律一致、损失函数也一致
有时数据看似不同,但实际上背后规律一致,此时损失函数其实也是一致的。从原理上讲,损失函数是指导求解全域最小值的方程,而如果多条(部分)数据规律一致,则构建出来的损失函数也将基本一致。
Index | x | y |
---|---|---|
1 | 1 | 2 |
2 | 2 | 4 |
围绕这两条数据分别构造损失函数,可得出如下结果:
M
S
E
L
o
s
s
(
w
)
1
=
(
2
−
w
)
2
MSELoss(w)_1 = (2-w)^2
MSELoss(w)1=(2−w)2
M
S
E
L
o
s
s
(
w
)
2
=
(
4
−
2
w
)
2
=
4
(
2
−
w
)
2
MSELoss(w)_2 = (4-2w)^2 = 4(2-w)^2
MSELoss(w)2=(4−2w)2=4(2−w)2
这两个损失函数,尽管看起来系数差距成一定比例,但这种差异其实并不影响实际梯度下降的计算过程,比例差距完全可以通过在迭代过程中设置负比例的学习率来确保最终参数迭代过程完全一致。
- 局部规律与整体规律
训练数据集所表现出来的规律称为训练数据的整体规律,而单独某条或者某几条数据所表现出来的规律称为局部规律,训练数据集中的一部分数据称为训练数据的子数据集。在大多数实际获取到的数据中,由于存在各方面误差,很难出现多条数据规律完全一致的情况,在大多数情况下训练数据集的子数据集往往都存在一定的规律差异,不仅是不同的子数据集之间存在差异,而且子数据集和训练数据集整体之间也存在一定的规律差异。
尽管局部规律和整体规律并不一致,但局部规律和整体规律却是相对统一的。例如,以下数据集为例,并且以前两条数据构造第一个损失函数
L
o
s
s
2
Loss_2
Loss2、后两条数据构造另一个损失函数
L
o
s
s
3
Loss_3
Loss3,则有损失函数计算公式如下:
Index | x | y |
---|---|---|
1 | 1 | 2 |
2 | 3 | 5 |
3 | 6 | 4 |
4 | 8 | 3 |
L o s s 2 = ( 2 − 1 w ) 2 + ( 5 − 3 w ) 2 2 = w 2 − 4 w + 4 + 9 w 2 − 30 w + 25 2 = 10 w 2 − 34 w + 29 2 \begin{align} Loss_2 & = \frac{(2-1w)^2 + (5-3w)^2}{2} \\ & = \frac{w^2-4w+4+9w^2-30w+25}{2} \\ & = \frac{10w^2-34w+29}{2} \end{align} Loss2=2(2−1w)2+(5−3w)2=2w2−4w+4+9w2−30w+25=210w2−34w+29
L
o
s
s
3
=
(
4
−
6
w
)
2
+
(
3
−
8
w
)
2
2
=
36
w
2
−
48
w
+
16
+
64
w
2
−
48
w
+
9
2
=
100
w
2
−
96
w
+
25
2
\begin{align} Loss_3 & = \frac{(4-6w)^2 + (3-8w)^2}{2} \\ & = \frac{36w^2-48w+16+64w^2-48w+9}{2} \\ & = \frac{100w^2-96w+25}{2} \end{align}
Loss3=2(4−6w)2+(3−8w)2=236w2−48w+16+64w2−48w+9=2100w2−96w+25
整体损失函数其实就是上述二者的平均值:
L
o
s
s
4
(
w
)
=
110
w
2
−
100
w
+
54
4
Loss_4(w) =\frac{110w^2-100w+54}{4}
Loss4(w)=4110w2−100w+54
因此可以将其理解为:代表局部规律的损失函数其实也能够部分表示整体损失函数。或者说局部规律的损失函数平均来说是整体损失函数的一个良好的估计。
1.3.2 优化算法
使用梯度下降法来更新权重和偏置项,以最小化损失函数。
梯度下降算法的目标是求最小值,但和最小二乘法这种一步到位、通过解方程组直接求得最小值的方式不同,梯度下降是通过一种“迭代求解”的方式来进行最小值的求解,其整体求解过程可以粗略描述为,先随机选取一组参数初始值,然后沿着某个方向,一步一步移动到最小值点。例如:
1.3.2.1 梯度下降算法局限
当损失函数不是凸函数时,也就是有可能存在局部最小值或者鞍点时,梯度下降并不一定能够准确找到全域最小值。
- 局部最小值点陷阱
所谓局部最小值,指的是该点左右两端取值都大于该点,但是该点不是全域最小值点。例如:
f
(
x
)
=
x
⋅
c
o
s
(
π
x
)
f(x)=x\cdot cos(\pi x)
f(x)=x⋅cos(πx)
由于局部最小值点梯度也是零,因此如果参数点陷入局部最小值,则不可能跨过局部最小值抵达全域最小值点。
- 鞍点陷阱
鞍点是那些不是极值点但梯度为0的点。所谓极值,指的是那些连续函数上导数为0、并且所有两边单调性相反的点,极值包括局部最小值、最小值点、局部最大值和最大值点四类。而鞍点和极值点的区别在于导数为0单左右两边单调性相同。例如:
f
(
x
)
=
x
3
f(x)=x^3
f(x)=x3
1.3.2.2 随机梯度下降与小批量梯度下降
梯度下降能够通过多轮迭代计算最终收敛至一个梯度为0的点。当损失函数为凸函数时,由于全域最小值点是唯一一个梯度为0的点,因此梯度下降能够顺利收敛至全域最小值,但如果损失函数不是凸函数,则梯度下降算法容易陷入局部最小值点陷阱或者鞍点陷阱。
梯度下降算法的改善形式有很多种,其中最为简单有效的方式是调整每次带入训练的样本数量,通过局部规律的不一致性来规避“非全域最小值但梯度为0”的陷阱。根据实际带入数据的多少也衍生出了两种算法——随机梯度下降和小批量梯度下降。
梯度下降过程中每一次参数移动都是基于整体规律(全部数据集对应的损失函数)来进行每一次参数迭代,而无论是随机梯度下降(Stochastic Gradient Descent)还是小批量梯度下降(Mini-batch Gradient Descent),其实都是在利用局部规律(部分数据的损失函数)来进行每一次参数迭代,其中随机梯度下降每次参数迭代都挑选一条数据来构建损失函数,而小批量梯度下降则每次选择一个小批数据(训练数据集的子集)来进行迭代。局部规律不一致性能够让参数在移动过程中保持灵活的移动方向,并因此能够逃离局部最小值点或鞍点陷阱,但方向不一致的代价是最终无法收敛到一个稳定的点。
小批量梯度下降也是借助不同批次数据的规律不一致性帮助参数跳出局部最小值陷阱。
简单总结上述理论基础:
1.数据规律可以用损失函数表示,损失函数形态不同代表其背后构造损失函数的数据规律不同;
2.一般来说,对于一个数据集来说,局部规律之间和局部规律与整体规律之间就存在一定的差异,但也存在一定的统一性;
3.利用局部规律之间的“对立统一”的特性,我们就能够在参数移动过程中改变参数移动方向,从而避免局部最小值或者鞍点陷阱。
随机梯度下降会伴随着收敛过程不稳定、收敛结果持续震荡等问题,面对更加复杂的数据集,随机梯度下降还会面临收敛所需迭代次数过多等问题。解决随机性所造成的“麻烦”,就必须采用一些围绕迭代过程的优化方法,而所有的围绕迭代过程的优化方法中,最基础也是最通用的两种方法,分别是数据归一化方法和 学习率调度。
- 数据归一化方法
数据归一化方法的本质是一种对数据进行线性转换的方法,通过构建一种样本空间之间的线性映射关系来进行数据数值的转化,这种转化并不会影响数据分布,即不会影响数据的内在规律,只是对数据的数值进行调整。数据归一化有很多方法,并且在机器学习领域有诸多用途,不仅是能够作为梯度下降的优化算法,同时还能帮助一些数据集避免量纲不一致等问题。
机器学习领域的数据归一化算法主要有两种,分别是0-1标准化(Max-Min Normalization)和Z-Score标准化。
0-1标准化是最简单同时也是最常用的标准化方法。该方法通过在输入特征中逐列遍历其中里的每一个数据,将Max和Min的记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据的归一化处理。
x
n
o
r
m
a
l
i
z
a
t
i
o
n
=
x
−
M
i
n
M
a
x
−
M
i
n
{x}_{normalization}=\frac{x-Min}{Max-Min}
xnormalization=Max−Minx−Min
和0-1标准化不同,Z-score标准化利用原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。同样是逐列进行操作,每一条数据都减去当前列的均值再除以当前列的标准差,在这种标准化操作下,如果原数据服从正态分布,处理之后的数据服从标准正态分布。和0-1标准化不同,Z-Score标准化并不会将数据放缩在0-1之间,而是均匀地分布在0的两侧。
x
n
o
r
m
a
l
i
z
a
t
i
o
n
=
x
−
μ
σ
{x}_{normalization}=\frac{x-\mu }{\sigma }
xnormalization=σx−μ
数据的真实规律是第一个特征其实对标签的取值起到非常重大的作用,但在实际数据获取记录过程中,如果量纲错配,即给了第一个特征一个非常大的量纲、第二个特征一个非常小的量纲。此时模型为了捕捉第一列相对更加重要的特性,计算所得的第一列特征取值非常大,甚至是第二列特征系数的10的n次方倍左右。尽管模型结果仍然是可以使用的结果,但特征系数差异性的增加会导致两个问题,其一是部分系数太小而导致计算精度问题,其二则是在特征重要性判别上会忽视系数较小的特征。而为了能够消除这种量纲差异所带来的规律挖掘方面的影响,我们就需要采用归一化方法。在经过归一化处理之后模型能够排除量纲差异所导致的学习偏倚问题,最终得到一个准确率较高的结果。
- 学习率调度
梯度下降优化的核心目标是“更快更好”地找到最小值点。归一化通过修改损失函数来实现这一目标,而学习率调度则通过动态调整学习率来达成。值得注意的是,学习率调度的目标不是找到一个固定的最优学习率,而是通过调整学习率来加速收敛。因此,学习率调度是一种在迭代过程中动态调整学习率的策略,而不是寻找最佳学习率的方法。
学习率调度方法有很多种,其中一种通用方法是学习率衰减法。该方法在迭代初期设置较大的学习率,随着迭代进行逐步减小学习率。这种策略可以加快梯度下降的收敛速度并提升效果。
例如在上述例子中,我们设置这样的减速衰减的一个学习调度策略,衰减过程比例由如下函数计算得出:
lr_lambda = lambda epoch: 0.95 ** epoch
lr_lambda(0) #输出1
lr_lambda(2) #输出0.9025
lr_l = []
for i in range(10):
lr_l.append(lr_lambda(i))
lr_l
即假设初始学习率为0.5,则第一次迭代时实际学习率为0.51,第二轮迭代时学习率为0.50.95,以此类推。对比恒定学习率和学习率衰减的两个梯度下降过程,学习率衰减的收敛速度明显更快。
总结:无论是数据归一化、学习率调度还是采用小批量梯度下降,这些方法并不互斥,完全可以组合进行使用。
1.4 算法流程
1、初始化
设定初始参数 W,可以随机选择,也可以设为零。
2、前向传播
对每一个样本计算线性组合,应用逻辑回归函数计算概率
3、计算损失
使用对数似然函数计算损失
4、梯度计算
计算梯度
5、参数更新
更新参数
6、迭代
重复前向传播、损失计算、梯度计算和参数更新,直到收敛或达到预设的迭代次数。
7、分类决策
使用训练好的模型对新数据进行预测,根据计算出的概率 p 和阈值进行分类。
1.5 逻辑回归优缺点
优点:
- 1.形式简单,模型的可解释性好
- 2.训练速度较快
- 3.方便调整输出结果,通过调整阈值的方式
缺点:
- 1.无法自动进行特征筛选
- 2.只能处理二分类问题
- 3.很难处理数据不平衡问题
1.6 案例
案例数据为‘良/恶性乳腺肿瘤预测数据’,该数据共有569条样本,1列表征肿瘤类型的数值,以及30列与肿瘤相关的医学特征(30个特征(10个平均值,10个标准差,10个最值))。
import warnings
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.exceptions import ConvergenceWarning
# 忽略警告
warnings.filterwarnings("ignore", category=ConvergenceWarning)
# 加载数据集
cancer = load_breast_cancer()
x = cancer.data
y = cancer.target
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=33)
# 数据标准化
ss = StandardScaler()
X_train = ss.fit_transform(x_train)
X_test = ss.transform(x_test)
# 自定义学习率衰减函数
initial_lr = 0.5 # 初始学习率
lr_lambda = lambda epoch: initial_lr * (0.95 ** epoch)
# 初始化逻辑回归模型
lr = LogisticRegression(max_iter=1, warm_start=True, solver='saga')
# 保存每次迭代的准确度
train_accuracies = []
test_accuracies = []
# 手动调整学习率并训练模型
epochs = 100 # 训练的 epoch 数
for epoch in range(epochs):
# 设置动态学习率(可扩展使用)
current_lr = lr_lambda(epoch)
# 训练模型
lr.fit(X_train, y_train)
# 预测训练集和测试集
y_train_pred = lr.predict(X_train)
y_test_pred = lr.predict(X_test)
# 计算准确度
train_acc = accuracy_score(y_train, y_train_pred)
test_acc = accuracy_score(y_test, y_test_pred)
# 保存准确度
train_accuracies.append(train_acc)
test_accuracies.append(test_acc)
# 输出当前 epoch 的信息
print(f"Epoch {epoch + 1}/{epochs}, Learning Rate: {current_lr:.6f}, Train Accuracy: {train_acc:.4f}, Test Accuracy: {test_acc:.4f}")
print('Accuracy of LR Classifier:',lr.score(X_test,y_test))
print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))
# 绘制训练集和测试集准确度图(线图)
plt.figure(figsize=(10, 6))
plt.plot(range(1, epochs + 1), train_accuracies, label='Train Accuracy', marker='o', linestyle='-', color='blue', linewidth=2)
plt.plot(range(1, epochs + 1), test_accuracies, label='Test Accuracy', marker='s', linestyle='--', color='orange', linewidth=2)
# 设置图形标题和轴标签
plt.title('Training and Testing Accuracy over Epochs', fontsize=16)
plt.xlabel('Epochs', fontsize=14)
plt.ylabel('Accuracy', fontsize=14)
# 添加图例和网格
plt.legend(fontsize=12)
plt.grid(alpha=0.6, linestyle='--')
# 显示图形
plt.tight_layout()
plt.show()
macro avg 即宏均值,可理解为普通的平均值。对应的概念还有微均值 micro avg
宏平均是先对每一个类统计指标值,然后在对所有类求算术平均值。微平均是对每一个实例不分类别进行统计建立全局混淆矩阵,然后计算相应指标。
如果每个class的样本数量相差不大,那么宏平均和微平均差异也不大,如果每个class的相差较大并且你想:更注重样本量多的class:使用宏平均;更注重样本量少的class:使用微平均。
LogisticRegression比起SGDClassifier在测试集上表现有更高的准确性,一般而言,对于训练数据规模在10万以上的数据,推荐使用随机梯度算法对模型参数进行估计。
1.7 classification_report()参数
classification_report(y_true,y_pred,labels=None,target_names=None,sample_weight=None,digits=2,output_dict=False,zero_division=“warn”)
y_true:真实值
y_pred:预测值
labels:标签索引列表,可选参数,数组形式
target_names:与标签匹配的名称,可选参数,数组形式
sample_weight:样本权重,当“output_dict”为“True”时,这将被忽略,并且返回的值不会四舍五入。
digits:格式化输出浮点值的位数。默认为2,是否输出字典。默认为False,如果为True则输出结果形式为字典。
zero_division:设置存在零除法时返回的值。默认为warn。如果设置为“warn”,这相当于0,但也会引发警告。
二、逻辑回归与线性回归的区别与联系
-
1.分类与回归:
线性回归模型是预测一个连续变量
逻辑回归是预测一个分类变量 -
2.输出:
线性回归 连续型 线性回归容易受异常值影响
逻辑回归 分类型 -
3.参数估计方法
线性回归使用的是最小平方误差损失函数,对偏离真实值越远的数据惩罚越严重
逻辑回归使用似然函数进行参数估计,使用交叉熵作为损失函数