对数几率回归(LogisticRegression)基础知识(包含分类任务的概念及评价指标)
目录
- 一、分类任务
- 1、二分类任务
- 二、对数几率回归模型
- 1、Sigmoid函数
- 2、对数几率
- 3、决策边界
- 三、对数几率回归的损失函数
- 1、分类任务的损失函数
- 1)交叉熵损失
- 2、对数几率回归的目标函数
- 3、对数几率回归中正则的必要性
- 4、Sklearn中的对数几率回归
- 四、对数几率回归的优化求解
- 1、对数几率回归的梯度下降求解
- 1)梯度
- 2)Hessian矩阵
- 3)牛顿法求解目标函数极值
- 4)拟牛顿法
- 2、Logistic回归的牛顿求解:IRLS
- 五、多类分类任务的对数几率回归
- 1、多分类任务
- 1) 1 vs. 其他
- 2)多项分布直接实现多类分类
- 3)Softmax函数与多类分类
- 2、损失函数
- 3、Scikit-Learn中实现Logistic回归的类
- 六、分类任务中的样本不均衡问题
- 1、不平衡数据的出现场景
- 2、解决方法
- 1)抽样
- 2)下采样与集成学习
- 3)上采样与样本合成
- 4)SMOTE算法
- 5)代价敏感学习
- 3、Scikit-Learn中的不均衡样本分类处理
- 1)类别权重 `class_weight`
- 2)样本权重 `sample_weight`
- 3)样本权重的应用
- 七、分类模型的评价指标
- 1. 正确率:Sklearn中分类任务的默认评价指标
- 2. 负log似然损失(交叉熵损失)
- 3. 合页损失(SVM中的损失函数)
- 4、混淆矩阵
- 5、二分类任务的评价指标
- 1)混淆矩阵
- 2)PR/ROC曲线
- 3)Matthews相关性系数(MCC)
- 4) 垃圾邮件分类示例
- 示例1:平衡数据集
- 示例2:不平衡数据集
- 6、Receiver Operating Characteristic (ROC)曲线
- 1)例:ROC曲线
- 示例1
- 示例2
- 示例3
- 2)ROC曲线
- 3)示例:ROC
- 7、Precision and Recall (PR)曲线
- 1)PR曲线:阈值变化时的Precision和Recall
- 2)AP:Average Precision
- 3)mAP:Mean AP
- 8、Scikit-Learn中分类模型性能评价
- 9、多分类与多标签
- 10、Scikit-Learn中metrics的分类模型评价指标
- 1)只能用于两类分类
- 2)亦可用于多类分类
- 3)可用于多标签
- 4)可用于两类和多标签场合(但不能用于多类场合)
- 11、从两类分类到多类分类和多标签
- 12、Scikit-Learn中的Scoring参数
在开始本篇之前,先来规范一下“叫法”。因为我看网上很多人把“LogisticRegression”’称为“逻辑回归”,从实际意思上讲“逻辑”的英文词是Logic,而不是Logistic,logistics是后勤补给的意思,源自法语lodge(住宿),所以这个词跟逻辑一点关系都没有,算法本身也不是强调逻辑,再从音译方面讲,Logistic音译也应该是“逻辑斯蒂”而不是“逻辑”。所以下面引用著名的西瓜书作者周志华的评论,称之为对数几率回归,才更为准确和专业。
一、分类任务
对数几率回归模型主要应用在分类任务上,下面我们对分类任务做一个简单的认识,以及对数几率回归是如何在分类任务上大放光彩的。
在监督学习中,我们给定一个训练数据集 D = { x i , y i } i = 1 N \mathcal{D} = \{x_i, y_i\}_{i=1}^N D={xi,yi}i=1N,其中 N N N 表示训练样本的数量, i i i 是样本的索引, x i x_i xi 代表第 i i i 个样本的输入特征,而 y i y_i yi 是对应的输出或响应。
当输出 y i y_i yi 属于集合 { 1 , 2 , . . . , C } \{1, 2, ..., C\} {1,2,...,C} 时,这意味着我们的监督学习任务是一个分类任务。基于训练样本集 D \mathcal{D} D,我们的目标是学习一个从输入 x x x 到输出 y y y 的映射函数 f f f。
在测试阶段,对于新的测试数据
x
x
x,我们将使用学习到的映射函数
f
f
f 来进行预测:
y
^
=
f
(
x
)
\hat{y} = f(x)
y^=f(x)。
1、二分类任务
考虑一个简单的分类问题,即二分类任务,其中样本的输出 y i ∈ { 0 , 1 } y_i \in \{0, 1\} yi∈{0,1}。
在概率论中,贝努利(Bernoulli)试验是一种特殊的随机试验,其输出为 { 0 , 1 } \{0, 1\} {0,1}。贝努利分布 y ∼ Bernoulli ( μ ) y \sim \text{Bernoulli}(\mu) y∼Bernoulli(μ) 描述了这种试验,其中 μ \mu μ 是分布的期望值,表示 y = 1 y = 1 y=1 的概率。
贝努利分布的概率密度函数可以表示为:
p
(
y
;
μ
)
=
μ
y
(
1
−
μ
)
(
1
−
y
)
p(y; \mu) = \mu^y (1 - \mu)^{(1-y)}
p(y;μ)=μy(1−μ)(1−y)
在分类任务中,给定输入 x x x 的情况下,输出 y y y 可以用贝努利分布来描述: y ∣ x ∼ Bernoulli ( μ ( x ) ) y|x \sim \text{Bernoulli}(\mu(x)) y∣x∼Bernoulli(μ(x)),其中 μ ( x ) \mu(x) μ(x) 表示在给定 x x x 的情况下, y = 1 y = 1 y=1 的概率。
此时,概率密度函数为:
p
(
y
∣
x
;
μ
)
=
μ
(
x
)
y
(
1
−
μ
(
x
)
)
1
−
y
p(y|x; \mu) = \mu(x)^y (1 - \mu(x))^{1-y}
p(y∣x;μ)=μ(x)y(1−μ(x))1−y
即
p
(
y
=
1
∣
x
)
=
μ
(
x
)
,
p
(
y
=
0
∣
x
)
=
1
−
μ
(
x
)
p(y = 1|x) = \mu(x), \quad p(y = 0|x) = 1 - \mu(x)
p(y=1∣x)=μ(x),p(y=0∣x)=1−μ(x)
二、对数几率回归模型
在分类任务中,给定输入
x
x
x 的情况下,概率密度函数为:
p
(
y
∣
x
;
μ
)
=
μ
(
x
)
y
(
1
−
μ
(
x
)
)
1
−
y
p(y|x; \mu) = \mu(x)^y (1 - \mu(x))^{1-y}
p(y∣x;μ)=μ(x)y(1−μ(x))1−y
那么,期望 μ ( x ) \mu(x) μ(x) 如何表示呢?
最简单的模型是线性模型,定义为:
μ
(
x
)
=
w
T
x
\mu(x) = \mathbf{w}^T \mathbf{x}
μ(x)=wTx
然而, μ ( x ) \mu(x) μ(x) 表示在给定 x x x 的情况下, y = 1 y = 1 y=1 的概率,其取值范围应在区间 [ 0 , 1 ] [0, 1] [0,1] 内。
因此,我们需要将 w T x \mathbf{w}^T \mathbf{x} wTx 的输出范围转换到 [ 0 , 1 ] [0, 1] [0,1]。这可以通过使用 sigmoid 函数(S形函数)来实现。
1、Sigmoid函数
Sigmoid函数定义为:
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z) = \frac{1}{1 + e^{-z}}
σ(z)=1+e−z1
其导数为:
d
σ
(
z
)
d
z
=
σ
(
z
)
(
1
−
σ
(
z
)
)
\frac{d\sigma(z)}{dz} = \sigma(z)(1 - \sigma(z))
dzdσ(z)=σ(z)(1−σ(z))
Sigmoid函数也被称为对数几率函数或logit函数。对数几率回归,也称为logit回归,虽然名字中带有“回归”二字,但实际上它是一种分类算法。
2、对数几率
在对数几率回归模型中,我们有:
p
(
y
=
1
∣
x
)
=
μ
(
x
)
=
σ
(
w
T
x
)
,
p(y = 1|x) = \mu(x) = \sigma(\mathbf{w}^T \mathbf{x}),
p(y=1∣x)=μ(x)=σ(wTx),
p
(
y
=
0
∣
x
)
=
1
−
μ
(
x
)
=
1
−
σ
(
w
T
x
)
p(y = 0|x) = 1 - \mu(x) = 1 - \sigma(\mathbf{w}^T \mathbf{x})
p(y=0∣x)=1−μ(x)=1−σ(wTx)
我们定义一个事件的几率(odds)为该事件发生的概率与不发生的概率的比值:
p
(
y
=
1
∣
x
)
p
(
y
=
0
∣
x
)
=
σ
(
w
T
x
)
1
−
σ
(
w
T
x
)
=
1
/
(
1
+
e
−
w
T
x
)
e
−
w
T
x
/
(
1
+
e
−
w
T
x
)
=
e
w
T
x
\frac{p(y = 1|x)}{p(y = 0|x)} = \frac{\sigma(\mathbf{w}^T \mathbf{x})}{1 - \sigma(\mathbf{w}^T \mathbf{x})} = \frac{1 / (1 + e^{-\mathbf{w}^T \mathbf{x}})}{e^{-\mathbf{w}^T \mathbf{x}} / (1 + e^{-\mathbf{w}^T \mathbf{x}})} = e^{\mathbf{w}^T \mathbf{x}}
p(y=0∣x)p(y=1∣x)=1−σ(wTx)σ(wTx)=e−wTx/(1+e−wTx)1/(1+e−wTx)=ewTx
对上述比值两边同时取对数,得到对数几率:
ln
p
(
y
=
1
∣
x
)
p
(
y
=
0
∣
x
)
=
ln
(
e
w
T
x
)
=
w
T
x
\ln \frac{p(y = 1|x)}{p(y = 0|x)} = \ln \left(e^{\mathbf{w}^T \mathbf{x}}\right) = \mathbf{w}^T \mathbf{x}
lnp(y=0∣x)p(y=1∣x)=ln(ewTx)=wTx
3、决策边界
对数几率表示为:
ln
p
(
y
=
1
∣
x
)
p
(
y
=
0
∣
x
)
=
ln
(
e
w
T
x
)
=
w
T
x
\ln \frac{p(y=1|x)}{p(y=0|x)} = \ln \left(e^{\mathbf{w}^T \mathbf{x}}\right) = \mathbf{w}^T \mathbf{x}
lnp(y=0∣x)p(y=1∣x)=ln(ewTx)=wTx
当
p
(
y
=
1
∣
x
)
>
p
(
y
=
0
∣
x
)
p(y=1|x) > p(y=0|x)
p(y=1∣x)>p(y=0∣x) 时,如果我们选择最大后验概率,那么输入
x
x
x 的类别将被归为
y
=
1
y=1
y=1:
p
(
y
=
1
∣
x
)
p
(
y
=
0
∣
x
)
>
1
,
ln
p
(
y
=
1
∣
x
)
p
(
y
=
0
∣
x
)
=
w
T
x
>
0
\frac{p(y=1|x)}{p(y=0|x)} > 1, \quad \ln \frac{p(y=1|x)}{p(y=0|x)} = \mathbf{w}^T \mathbf{x} > 0
p(y=0∣x)p(y=1∣x)>1,lnp(y=0∣x)p(y=1∣x)=wTx>0
具体来说:
- 当 w T x > 0 \mathbf{w}^T \mathbf{x} > 0 wTx>0 时, x x x 的类别取 y = 1 y=1 y=1;
- 当 w T x < 0 \mathbf{w}^T \mathbf{x} < 0 wTx<0 时, x x x 的类别取 y = 0 y=0 y=0;
- 当 w T x = 0 \mathbf{w}^T \mathbf{x} = 0 wTx=0 时, y = 1 y=1 y=1 的概率和 y = 0 y=0 y=0 的概率相等,此时 x x x 位于决策面上。在这种情况下,我们可以将 x x x 分类到任意一类,或者选择不作出判断。
决策函数 f ( x ) = w T x f(x) = \mathbf{w}^T \mathbf{x} f(x)=wTx 根据 w T x \mathbf{w}^T \mathbf{x} wTx 的符号将输入空间 x \mathbf{x} x 分成两个区域。
w
T
x
\mathbf{w}^T \mathbf{x}
wTx 为输入
x
\mathbf{x}
x 的线性函数,因此对数几率回归模型是一个线性分类模型。
图中展示了决策边界 w T x = 0 \mathbf{w}^T \mathbf{x} = 0 wTx=0,这条边界将数据分为两类:
- 当 w T x > 0 \mathbf{w}^T \mathbf{x} > 0 wTx>0 时, x \mathbf{x} x 的类别取 y = 1 y = 1 y=1;
- 当 w T x < 0 \mathbf{w}^T \mathbf{x} < 0 wTx<0 时, x \mathbf{x} x 的类别取 y = 0 y = 0 y=0。
三、对数几率回归的损失函数
1、分类任务的损失函数
在分类任务中,0/1 损失定义为:当预测类别正确时损失为 0,否则为 1,记为:
L
(
y
^
,
y
)
=
{
0
y
^
=
y
1
y
^
≠
y
L(\hat{y}, y) = \begin{cases} 0 & \hat{y} = y \\ 1 & \hat{y} \neq y \end{cases}
L(y^,y)={01y^=yy^=y
然而,0/1 损失函数是不连续的,这使得优化计算变得不方便。
因此,我们寻找其他替代损失函数(Surrogate Loss Function),这些函数通常是凸函数,计算方便且与 0/1 损失是一致的。
1)交叉熵损失
对数几率回归模型中,给定输入
x
x
x,输出
y
y
y 服从伯努利分布
Bernoulli
(
μ
(
x
)
)
\text{Bernoulli}(\mu(x))
Bernoulli(μ(x)):
p
(
y
∣
x
;
μ
(
x
)
)
=
μ
(
x
)
y
(
1
−
μ
(
x
)
)
(
1
−
y
)
p(y|x; \mu(x)) = \mu(x)^y (1 - \mu(x))^{(1-y)}
p(y∣x;μ(x))=μ(x)y(1−μ(x))(1−y)
其中,
μ
(
x
)
=
σ
(
w
T
x
)
\mu(x) = \sigma(\mathbf{w}^T \mathbf{x})
μ(x)=σ(wTx) 表示给定
x
x
x 时
y
=
1
y=1
y=1 的概率。
log似然函数定义为:
ℓ
(
μ
)
=
ln
p
(
D
)
=
∑
i
=
1
N
ln
p
(
y
i
∣
x
i
)
\ell(\mu) = \ln p(\mathcal{D}) = \sum_{i=1}^N \ln p(y_i|x_i)
ℓ(μ)=lnp(D)=i=1∑Nlnp(yi∣xi)
进一步展开为:
=
∑
i
=
1
N
ln
(
μ
(
x
i
)
y
i
(
1
−
μ
(
x
i
)
)
(
1
−
y
i
)
)
= \sum_{i=1}^N \ln \left(\mu(x_i)^{y_i} (1 - \mu(x_i))^{(1-y_i)}\right)
=i=1∑Nln(μ(xi)yi(1−μ(xi))(1−yi))
定义负对数似然损失为:
L
(
μ
(
x
)
,
y
)
=
−
y
ln
(
μ
(
x
)
)
−
(
1
−
y
)
ln
(
1
−
μ
(
x
)
)
L(\mu(x), y) = -y \ln(\mu(x)) - (1 - y) \ln(1 - \mu(x))
L(μ(x),y)=−yln(μ(x))−(1−y)ln(1−μ(x))
则极大似然估计等价于最小化训练集上的负对数似然损失:
J
(
μ
)
=
∑
i
=
1
N
L
(
μ
(
x
i
)
,
y
i
)
=
∑
i
=
1
N
−
y
i
ln
(
μ
(
x
i
)
)
−
(
1
−
y
i
)
ln
(
1
−
μ
(
x
i
)
)
J(\mu) = \sum_{i=1}^N L(\mu(x_i), y_i) = \sum_{i=1}^N -y_i \ln(\mu(x_i)) - (1 - y_i) \ln(1 - \mu(x_i))
J(μ)=i=1∑NL(μ(xi),yi)=i=1∑N−yiln(μ(xi))−(1−yi)ln(1−μ(xi))
=
−
ℓ
(
μ
)
= -\ell(\mu)
=−ℓ(μ)
这里, J ( μ ) J(\mu) J(μ) 表示模型参数 μ \mu μ 在训练集上的负对数似然损失,通过最小化这个损失,我们可以找到最优的模型参数。
负对数似然损失定义为:
L
(
μ
(
x
)
,
y
)
=
−
y
ln
(
μ
(
x
)
)
−
(
1
−
y
)
ln
(
1
−
μ
(
x
)
)
L(\mu(x), y) = -y \ln(\mu(x)) - (1 - y) \ln(1 - \mu(x))
L(μ(x),y)=−yln(μ(x))−(1−y)ln(1−μ(x))
这也被称为交叉熵损失(Cross Entropy Loss)。
交叉熵衡量的是两个概率分布之间的差异,在已知真实分布的情况下,它衡量预测分布与真实分布之间的差异:
- 假设已知真实值 y = 1 y = 1 y=1,即 y ∣ x ∼ Bernoulli ( 1 ) y|x \sim \text{Bernoulli}(1) y∣x∼Bernoulli(1),
- 假设 y ^ = 1 \hat{y} = 1 y^=1 的概率为 μ ( x ) \mu(x) μ(x), y ^ ∣ x ∼ Bernoulli ( μ ( x ) ) \hat{y}|x \sim \text{Bernoulli}(\mu(x)) y^∣x∼Bernoulli(μ(x)),
- 则这两个分布之间的交叉熵为:
C E ( y , μ ( x ) ) = − ∑ y p ( y ∣ x ) ln p ( y ^ ∣ x ) = − p ( y = 1 ∣ x ) ln p ( y ^ = 1 ∣ x ) − p ( y = 0 ∣ x ) ln p ( y ^ = 0 ∣ x ) CE(y, \mu(x)) = -\sum_y p(y|x) \ln p(\hat{y}|x) = -p(y = 1|x) \ln p(\hat{y} = 1|x) - p(y = 0|x) \ln p(\hat{y} = 0|x) CE(y,μ(x))=−y∑p(y∣x)lnp(y^∣x)=−p(y=1∣x)lnp(y^=1∣x)−p(y=0∣x)lnp(y^=0∣x)
= − ln μ ( x ) = -\ln \mu(x) =−lnμ(x)
综合考虑:
C
E
(
y
,
μ
(
x
)
)
=
{
−
ln
μ
(
x
)
if
y
=
1
−
ln
(
1
−
μ
(
x
)
)
otherwise
CE(y, \mu(x)) = \begin{cases} -\ln \mu(x) & \text{if } y = 1 \\ -\ln(1 - \mu(x)) & \text{otherwise} \end{cases}
CE(y,μ(x))={−lnμ(x)−ln(1−μ(x))if y=1otherwise
定义真实类别的概率为:
p
t
=
{
μ
(
x
)
if
y
=
1
1
−
μ
(
x
)
otherwise
p_t = \begin{cases} \mu(x) & \text{if } y = 1 \\ 1 - \mu(x) & \text{otherwise} \end{cases}
pt={μ(x)1−μ(x)if y=1otherwise
则
C
E
(
y
,
μ
(
x
)
)
=
−
ln
(
p
t
)
CE(y, \mu(x)) = -\ln(p_t)
CE(y,μ(x))=−ln(pt)
从图中可以看出,预测输出与真实值
y
y
y 差得越多,损失的值越大。
2、对数几率回归的目标函数
对数几率回归的损失函数采用交叉熵损失:
L
(
μ
(
x
)
,
y
)
=
−
y
ln
(
μ
(
x
)
)
−
(
1
−
y
)
ln
(
1
−
μ
(
x
)
)
L(\mu(x), y) = -y \ln(\mu(x)) - (1 - y) \ln(1 - \mu(x))
L(μ(x),y)=−yln(μ(x))−(1−y)ln(1−μ(x))
其中
y
y
y 为真实值,
μ
(
x
)
=
σ
(
w
T
x
)
\mu(x) = \sigma(\mathbf{w}^T \mathbf{x})
μ(x)=σ(wTx) 为预测值为 1 的概率。
同其他机器学习模型一样,对数几率回归的目标函数也包括两项:训练集上的损失和正则项:
J
(
w
;
λ
)
=
∑
i
=
1
N
L
(
μ
(
x
i
;
w
)
,
y
i
)
+
λ
R
(
w
)
J(\mathbf{w}; \lambda) = \sum_{i=1}^N L(\mu(\mathbf{x}_i; \mathbf{w}), y_i) + \lambda R(\mathbf{w})
J(w;λ)=i=1∑NL(μ(xi;w),yi)+λR(w)
类似回归任务,正则项 R ( w ) R(\mathbf{w}) R(w) 可为 L1 正则、L2 正则、L1 正则 + L2 正则。
3、对数几率回归中正则的必要性
在线性回归中,目标函数可以不加正则项(即普通最小二乘法 OLS)。然而,在对数几率回归中,必须加入正则项。
原因如下:
- 当训练数据完全可分时,为了使交叉熵损失和最小(即达到 0),每个 L ( μ ( x i ) , y i ) = 0 L(\mu(x_i), y_i) = 0 L(μ(xi),yi)=0,这意味着 μ ( x i ) = 1 \mu(x_i) = 1 μ(xi)=1 或 0 0 0。
- 而 μ ( x i ) = σ ( w T x i ) = 1 \mu(x_i) = \sigma(\mathbf{w}^T \mathbf{x}_i) = 1 μ(xi)=σ(wTxi)=1 或 0 0 0 要求 w T x i = ∞ \mathbf{w}^T \mathbf{x}_i = \infty wTxi=∞ 或 − ∞ -\infty −∞,从而 ∣ w j ∣ = ∞ |w_j| = \infty ∣wj∣=∞。
- 因此,必须加入正则项,以找到与训练数据拟合良好且最简单的模型。
图中展示了 Sigmoid 函数及其导数的行为,可以看到在输入值的极端情况下(即 w T x i \mathbf{w}^T \mathbf{x}_i wTxi 非常大或非常小),Sigmoid 函数的梯度趋近于 0,这会导致模型对参数的更新变得非常缓慢,从而需要正则化来防止过拟合并加速收敛。
4、Sklearn中的对数几率回归
在 sklearn.linear_model
中,对数几率回归模型通过以下方式定义:
Class sklearn.linear_model.LogisticRegression(penalty='l2', dual=False,
tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1,
class_weight=None, random_state=None, solver='liblinear', max_iter=100,
multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)
- 实现的目标函数为:
J ( w ; C ) = C ∑ i = 1 N L ( y i , μ ( x i ; w ) ) + R ( w ) J(\mathbf{w}; C) = C \sum_{i=1}^N L(y_i, \mu(\mathbf{x}_i; \mathbf{w})) + R(\mathbf{w}) J(w;C)=Ci=1∑NL(yi,μ(xi;w))+R(w)
其中,超参数 C C C 起到正则化的作用:
- C C C 越大,正则化的影响越小,模型对训练数据的拟合程度越高。
- C C C 越小,正则化的影响越大,有助于防止过拟合,但可能会导致欠拟合。
通过调整 C C C 的值,我们可以在模型复杂度和泛化能力之间找到一个平衡点。
四、对数几率回归的优化求解
1、对数几率回归的梯度下降求解
对数几率回归模型没有解析解,需要通过迭代方法来求解。常用的迭代方法包括:
- 一阶方法:梯度下降、随机梯度下降(SGD)、随机平均梯度法(SAG)、随机平均梯度法改进版(SAGA)、共轭梯度、坐标轴下降
- 二阶方法:牛顿法及拟牛顿法(BFGS、L-BFGS)
目标函数定义为:
J
(
w
,
λ
)
=
C
∑
i
=
1
N
L
(
μ
(
x
i
;
w
)
,
y
i
)
+
R
(
w
)
J(w, \lambda) = C \sum_{i=1}^{N} L(\mu(x_i; w), y_i) + R(w)
J(w,λ)=Ci=1∑NL(μ(xi;w),yi)+R(w)
正则项的处理与线性回归类似:
- 对于L2正则项,由于其函数是连续的,可以采用梯度下降法或牛顿法等优化方法。
- 由于L1正则项函数不连续,因此梯度下降法和牛顿法不适用。对于类似Lasso的求解,可以采用坐标轴下降法。
1)梯度
我们先来看训练集上的损失函数和部分:
J 1 ( w ) = ∑ i = 1 N ( − y i ln ( μ ( x i , w ) ) − ( 1 − y i ) ln ( 1 − μ ( x i , w ) ) ) J_1(w) = \sum_{i=1}^{N} \left( -y_i \ln(\mu(x_i, w)) - (1 - y_i) \ln(1 - \mu(x_i, w)) \right) J1(w)=i=1∑N(−yiln(μ(xi,w))−(1−yi)ln(1−μ(xi,w)))
则梯度为:
g 1 ( w ) = ∂ J 1 ( w ) ∂ w = − ∑ i = 1 N ( y i 1 μ ( x i , w ) + ( 1 − y i ) 1 1 − μ ( x i , w ) ) ∂ μ ( x i , w ) ∂ w g_1(w) = \frac{\partial J_1(w)}{\partial w} = -\sum_{i=1}^{N} \left( y_i \frac{1}{\mu(x_i, w)} + (1 - y_i) \frac{1}{1 - \mu(x_i, w)} \right) \frac{\partial \mu(x_i, w)}{\partial w} g1(w)=∂w∂J1(w)=−i=1∑N(yiμ(xi,w)1+(1−yi)1−μ(xi,w)1)∂w∂μ(xi,w)
进一步化简为:
= − ∑ i = 1 N ( y i 1 μ ( x i , w ) − ( 1 − y i ) 1 1 − μ ( x i , w ) ) μ ( x i , w ) ( 1 − μ ( x i , w ) ) ∂ ( w T x i ) ∂ w = -\sum_{i=1}^{N} \left( y_i \frac{1}{\mu(x_i, w)} - (1 - y_i) \frac{1}{1 - \mu(x_i, w)} \right) \mu(x_i, w)(1 - \mu(x_i, w)) \frac{\partial (w^T x_i)}{\partial w} =−i=1∑N(yiμ(xi,w)1−(1−yi)1−μ(xi,w)1)μ(xi,w)(1−μ(xi,w))∂w∂(wTxi)
最终得到:
= − ∑ i = 1 N ( y i ( 1 − μ ( x i , w ) ) − ( 1 − y i ) μ ( x i , w ) ) x i = -\sum_{i=1}^{N} \left( y_i (1 - \mu(x_i, w)) - (1 - y_i) \mu(x_i, w) \right) x_i =−i=1∑N(yi(1−μ(xi,w))−(1−yi)μ(xi,w))xi
= X T ( μ − y ) = X^T (\mu - y) =XT(μ−y)
其中, μ ( x , w ) = σ ( w T x ) \mu(x, w) = \sigma(w^T x) μ(x,w)=σ(wTx), σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1, d σ ( z ) d z = σ ( z ) ( 1 − σ ( z ) ) \frac{d\sigma(z)}{dz} = \sigma(z)(1 - \sigma(z)) dzdσ(z)=σ(z)(1−σ(z)), ∂ ( w T x ) ∂ w = x \frac{\partial (w^T x)}{\partial w} = x ∂w∂(wTx)=x。
这种形式与线性回归模型相似。
2)Hessian矩阵
损失函数和的梯度为: g ( w ) = X T ( μ − y ) g(w) = X^T(\mu - y) g(w)=XT(μ−y)
则Hessian矩阵为:
H ( w ) = ∂ g ( w ) ∂ w T = ∂ ( ∑ i = 1 N ( μ ( x i , w ) − y i ) x i ) ∂ w T H(w) = \frac{\partial g(w)}{\partial w^T} = \frac{\partial \left( \sum_{i=1}^{N} (\mu(x_i, w) - y_i) x_i \right)}{\partial w^T} H(w)=∂wT∂g(w)=∂wT∂(∑i=1N(μ(xi,w)−yi)xi)
进一步化简为:
= ∑ i = 1 N μ i ( 1 − μ i ) x i x i T = \sum_{i=1}^{N} \mu_i (1 - \mu_i) x_i x_i^T =i=1∑Nμi(1−μi)xixiT
= X T S X = X^T S X =XTSX
其中, S ≜ diag ( μ i ( 1 − μ i ) ) S \triangleq \text{diag}(\mu_i(1 - \mu_i)) S≜diag(μi(1−μi))
H ( w ) H(w) H(w)为正定矩阵,梯度下降能找到全局最小值。
3)牛顿法求解目标函数极值
对于多元函数 f ( x 1 , . . . , x D ) f(x_1, ..., x_D) f(x1,...,xD),一阶导数转换成梯度: g = ∇ f ( x 1 , . . . , x D ) g = \nabla f(x_1, ..., x_D) g=∇f(x1,...,xD),二阶导数转换成海森(Hessian)矩阵 H H H。
海森矩阵 H ( x ) H(\mathbf{x}) H(x)定义为:
H ( x ) = [ ∂ 2 f ∂ 2 x 1 ∂ 2 f ∂ x 1 ∂ x 2 ⋯ ∂ 2 f ∂ x 1 ∂ x D ∂ 2 f ∂ x 1 ∂ x 2 ∂ 2 f ∂ 2 x 2 ⋯ ∂ 2 f ∂ x 2 ∂ x D ⋮ ⋮ ⋱ ⋮ ∂ 2 f ∂ x 1 ∂ x D ∂ 2 f ∂ x D ∂ x 2 ⋯ ∂ 2 f ∂ 2 x D 2 ] H(\mathbf{x}) = \begin{bmatrix} \frac{\partial^2 f}{\partial^2 x_1} & \frac{\partial^2 f}{\partial x_1 \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_1 \partial x_D} \\ \frac{\partial^2 f}{\partial x_1 \partial x_2} & \frac{\partial^2 f}{\partial^2 x_2} & \cdots & \frac{\partial^2 f}{\partial x_2 \partial x_D} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2 f}{\partial x_1 \partial x_D} & \frac{\partial^2 f}{\partial x_D \partial x_2} & \cdots & \frac{\partial^2 f}{\partial^2 x_D^2} \end{bmatrix} H(x)= ∂2x1∂2f∂x1∂x2∂2f⋮∂x1∂xD∂2f∂x1∂x2∂2f∂2x2∂2f⋮∂xD∂x2∂2f⋯⋯⋱⋯∂x1∂xD∂2f∂x2∂xD∂2f⋮∂2xD2∂2f
则牛顿法迭代公式为:
x ( t + 1 ) = x ( t ) − ( H ( x ( t ) ) ) − 1 g ( x ( t ) ) \mathbf{x}^{(t+1)} = \mathbf{x}^{(t)} - \left( H(\mathbf{x}^{(t)}) \right)^{-1} g(\mathbf{x}^{(t)}) x(t+1)=x(t)−(H(x(t)))−1g(x(t))
牛顿法利用函数的一阶和二阶导数信息,通过迭代更新参数,寻找函数的极值点。这种方法在理论上可以更快地收敛到极值点,特别是当初始点接近极值点时。
补充:牛顿法
牛顿法是一种利用函数的一阶和二阶导数信息来寻找函数极值点的优化方法。假设函数 J ( w ) J(w) J(w)在 w ( t ) w^{(t)} w(t)处可导,对任意小的 Δ w \Delta w Δw,函数 J ( w ) J(w) J(w)的二阶泰勒展开可以表示为: J ( w ( t ) + Δ w ) ≈ J ( w ( t ) ) + ( Δ w ) T g ( w ( t ) ) + 1 2 ( Δ w ) T H ( w ( t ) ) ( Δ w ) J(w^{(t)} + \Delta w) \approx J(w^{(t)}) + (\Delta w)^T g(w^{(t)})+ \frac{1}{2} (\Delta w)^T H(w^{(t)}) (\Delta w) J(w(t)+Δw)≈J(w(t))+(Δw)Tg(w(t))+21(Δw)TH(w(t))(Δw)
其中, g ( w ( t ) ) g(w^{(t)}) g(w(t))是函数 J ( w ) J(w) J(w)在 w ( t ) w^{(t)} w(t)处的梯度, H ( w ( t ) ) H(w^{(t)}) H(w(t))是函数 J ( w ) J(w) J(w)在 w ( t ) w^{(t)} w(t)处的Hessian矩阵。
为了找到使 J ( w ( t ) + Δ w ) J(w^{(t)} + \Delta w) J(w(t)+Δw)最小的 Δ w \Delta w Δw,我们对 Δ w \Delta w Δw求导并令导数为零,得到:
∂ J ( w ( t ) + Δ w ) ∂ Δ w = g ( w ( t ) ) + H ( w ( t ) ) ( Δ w ) = 0 \frac{\partial J(w^{(t)} + \Delta w)}{\partial \Delta w} = g(w^{(t)}) + H(w^{(t)}) (\Delta w) = 0 ∂Δw∂J(w(t)+Δw)=g(w(t))+H(w(t))(Δw)=0
解这个方程,我们可以得到最佳的 Δ w \Delta w Δw:
Δ w = − ( H ( w ( t ) ) ) − 1 g ( w ( t ) ) \Delta w = -\left( H(w^{(t)}) \right)^{-1} g(w^{(t)}) Δw=−(H(w(t)))−1g(w(t))
这个结果告诉我们,通过计算Hessian矩阵的逆和梯度的乘积,我们可以找到函数在当前点的最优更新方向和步长。牛顿法的这一特性使其在寻找函数极值点时具有较高的效率和准确性。
牛顿法是一种强大的优化算法,用于寻找目标函数的极值。以下是牛顿法求解目标函数极值的步骤:
- 从 t = 0 t = 0 t=0开始,初始化 x ( 0 ) x^{(0)} x(0)为随机值;
- 计算目标函数 f ( x ) f(x) f(x)在点 x ( t ) x^{(t)} x(t)的梯度 g ( t ) = ∇ f ( x ( t ) ) g^{(t)} = \nabla f(x^{(t)}) g(t)=∇f(x(t))和海森矩阵 H ( t ) = H ( x ( t ) ) H^{(t)} = H(x^{(t)}) H(t)=H(x(t));
- 计算移动方向: d ( t ) = ( H ( t ) ) − 1 g ( t ) d^{(t)} = (H^{(t)})^{-1} g^{(t)} d(t)=(H(t))−1g(t)(一般用线性方程组计算 d ( t ) d^{(t)} d(t): H ( t ) d ( t ) = g ( t ) H^{(t)} d^{(t)} = g^{(t)} H(t)d(t)=g(t)。线性方程组求解可用共轭梯度等方法求解);
- 根据迭代公式,更新 x x x的值: x ( t + 1 ) = x ( t ) − d ( t ) x^{(t+1)} = x^{(t)} - d^{(t)} x(t+1)=x(t)−d(t);
- 判断是否满足迭代终止条件。如果满足,循环结束,返回最佳参数 x ( t + 1 ) x^{(t+1)} x(t+1)和目标函数极小值 f ( x ( t + 1 ) ) f(x^{(t+1)}) f(x(t+1));否则转到第2步。
牛顿法的两种形式:
- 一阶梯度法: d ( t ) = − η g ( t ) d^{(t)} = -\eta g^{(t)} d(t)=−ηg(t)
- 二阶牛顿法: d ( t ) = − ( H ( t ) ) − 1 g ( t ) d^{(t)} = -(H^{(t)})^{-1} g^{(t)} d(t)=−(H(t))−1g(t)
牛顿法通过利用目标函数的二阶导数(即海森矩阵)来调整搜索方向,从而在理论上能够更快地收敛到极值点。然而,计算海森矩阵及其逆可能在高维问题中非常耗时,因此在实际应用中可能需要采用近似方法或其他优化策略。
4)拟牛顿法
拟牛顿法是一种优化算法,旨在解决牛顿法在高维情况下的局限性。牛顿法虽然比一般的梯度下降法收敛速度快,但在高维情况下,计算目标函数的二阶偏导数的复杂度高,而且有时候目标函数的海森矩阵无法保持正定,不存在逆矩阵,此时牛顿法将不再能使用。
因此,人们提出了拟牛顿法:不用二阶偏导数构造出可以近似Hessian矩阵(或Hessian矩阵的逆矩阵)的正定对称矩阵,进而再逐步优化目标函数。不同的Hessian矩阵构造方法产生了不同的拟牛顿法,如BFGS和L-BFGS。
拟牛顿法通过近似计算Hessian矩阵或其逆矩阵,避免了直接计算二阶导数的复杂性,同时保持了牛顿法的收敛速度优势。这种方法在实际应用中非常有效,特别是在处理大规模优化问题时。
推荐阅读:
- 谈谈常见的迭代优化方法
- Mathematical optimization: finding minima of functions
2、Logistic回归的牛顿求解:IRLS
在Logistic回归中,我们可以使用牛顿法(Iteratively Reweighted Least Squares, IRLS)来求解参数。以下是牛顿法在Logistic回归中的应用步骤:
- 损失函数和的梯度为: g ( w ) = X T ( μ − y ) g(w) = X^T(\mu - y) g(w)=XT(μ−y)
- Hessian矩阵为: H ( w ) = X T S X H(w) = X^T S X H(w)=XTSX
- 迭代公式为: w ( t + 1 ) = w ( t ) − ( H ( w ( t ) ) ) − 1 g ( w ) w^{(t+1)} = w^{(t)} - \left(H(w^{(t)})\right)^{-1} g(w) w(t+1)=w(t)−(H(w(t)))−1g(w)
具体计算过程如下:
w ( t + 1 ) = w ( t ) − ( H ( w ( t ) ) ) − 1 g ( w ) = w ( t ) − ( X T S ( t ) X ) − 1 X T ( μ − y ) = ( X T S ( t ) X ) − 1 [ X T S ( t ) X w ( t ) − X T ( μ − y ) ] = ( X T S ( t ) X ) − 1 X T S ( t ) [ X w ( t ) − ( S ( t ) ) − 1 ( μ − y ) ] = ( X T S ( t ) X ) − 1 X T S ( t ) z ( t ) \begin{align*} w^{(t+1)} &= w^{(t)} - \left(H(w^{(t)})\right)^{-1} g(w) \\ &= w^{(t)} - \left(X^T S^{(t)} X\right)^{-1} X^T(\mu - y) \\ &= \left(X^T S^{(t)} X\right)^{-1} \left[X^T S^{(t)} X w^{(t)} - X^T(\mu - y)\right] \\ &= \left(X^T S^{(t)} X\right)^{-1} X^T S^{(t)} \left[X w^{(t)} - (S^{(t)})^{-1}(\mu - y)\right] \\ &= \left(X^T S^{(t)} X\right)^{-1} X^T S^{(t)} z^{(t)} \end{align*} w(t+1)=w(t)−(H(w(t)))−1g(w)=w(t)−(XTS(t)X)−1XT(μ−y)=(XTS(t)X)−1[XTS(t)Xw(t)−XT(μ−y)]=(XTS(t)X)−1XTS(t)[Xw(t)−(S(t))−1(μ−y)]=(XTS(t)X)−1XTS(t)z(t)
其中, z ( t ) ≜ X w ( t ) − ( S ( t ) ) − 1 ( μ − y ) z^{(t)} \triangleq X w^{(t)} - (S^{(t)})^{-1}(\mu - y) z(t)≜Xw(t)−(S(t))−1(μ−y),表示在第 t t t次迭代中,加权后的预测值与实际值之间的差异。
在最小二乘问题中,我们有:
- 最小二乘: w ^ O L S = ( X T X ) − 1 X T y \widehat{w}_{OLS} = (X^T X)^{-1} X^T y w OLS=(XTX)−1XTy
- 加权最小二乘(每个样本的权重为 s i − 1 / 2 s_i^{-1/2} si−1/2): w ^ O L S _ w e i g h t = ( X T S X ) − 1 S X T y \widehat{w}_{OLS\_weight} = (X^T S X)^{-1} S X^T y w OLS_weight=(XTSX)−1SXTy
IRLS方法通过在每次迭代中更新权重矩阵 S S S,逐步优化Logistic回归模型的参数。这种方法在处理分类问题时非常有效,特别是在数据不平衡的情况下。
以下是IRLS方法的主要步骤:
- 初始值: w ( 0 ) w^{(0)} w(0)
- IRLS代入迭代公式为: w ( t + 1 ) = ( X T S ( t ) X ) − 1 X T S ( t ) z ( t ) w^{(t+1)} = \left( X^T S^{(t)} X \right)^{-1} X^T S^{(t)} z^{(t)} w(t+1)=(XTS(t)X)−1XTS(t)z(t)
- 加权最小二乘又通过共轭梯度法求解,因此Scikit-Learn中的采用牛顿法求解的算法取名为“Newton-CG”。
在IRLS方法中,每次迭代都会更新权重矩阵 S ( t ) S^{(t)} S(t),然后通过加权最小二乘法来求解参数。由于直接求解加权最小二乘问题可能计算量大,因此常常采用共轭梯度法(Conjugate Gradient, CG)来求解,这种方法在求解大规模问题时更为高效。
Scikit-Learn库中的LogisticRegression类在求解参数时,默认使用的就是Newton-CG方法。这种方法结合了牛顿法和共轭梯度法的优点,既能保证收敛速度,又能减少计算量,非常适合处理Logistic回归这类问题。
五、多类分类任务的对数几率回归
1、多分类任务
例:Iris花分类中,一共有3种鸢尾花
在机器学习领域,Iris花数据集是一个著名的多变量数据集,通常用于测试分类算法。该数据集包含三种鸢尾花的测量数据:setosa、versicolor和virginica。每种花都有四个特征:花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)和花瓣宽度(petal width)。
下图展示了Iris花数据集中花瓣长度和萼片长度的关系,不同颜色和形状的点代表不同的鸢尾花种类:
- 红色圆点( ∙ \bullet ∙)代表setosa
- 蓝色叉号( × \times ×)代表versicolor
- 绿色加号( + + +)代表virginica
横坐标表示花瓣长度(petal length),纵坐标表示萼片长度(sepal length)。从图中可以看出,不同种类的鸢尾花在这两个特征上的分布有明显的区别,这为使用机器学习算法进行分类提供了基础。
1) 1 vs. 其他
在多分类问题中,一种常用的策略是“一对其他”(One-vs-Rest,OvR)。这种方法将多分类问题转化为多个二分类问题。对于每个类别
c
c
c,我们训练一个模型来区分该类别与其他所有类别。
图中展示了OvR策略的直观表示。左图中,我们有三个类别:三角形、叉号和方形。右图展示了如何将这三个类别转化为三个二分类问题:
- 第一个二分类问题区分三角形(绿色)和其他类别(红色叉号和方形)。
- 第二个二分类问题区分方形(蓝色)和其他类别(绿色三角形和红色叉号)。
- 第三个二分类问题区分叉号(红色)和其他类别(绿色三角形和蓝色方形)。
对于每个二分类问题,我们定义一个模型 f w c ( x ) = p ( y = c ∣ x , W ) f_w^c(x) = p(y = c | x, W) fwc(x)=p(y=c∣x,W),其中 c = 1 , 2 , 3 c = 1, 2, 3 c=1,2,3分别代表三个类别。每个类别的模型都有自己的正则参数和权重参数 W W W。
这种方法的优点是简单且易于实现,因为它直接利用了现有的二分类算法。然而,它的缺点是每个类别的模型是独立训练的,可能无法充分利用类别之间的相关性。
具体步骤如下:
- 对每个类别 c c c,训练一个对数几率回归分类器 f w c ( x ) f_w^c(x) fwc(x),用于预测输入 x x x属于类别 c c c的概率,即预测 y = c y = c y=c的概率。
- 对新的输入 x x x,我们选择使得 f w c ( x ) f_w^c(x) fwc(x)最大的类别作为预测结果。这实际上是在执行最大后验估计(Maximum A Posteriori, MAP)。
数学上,这个选择过程可以表示为:
y ^ = arg max c f w c ( x ) \hat{y} = \arg\max_c f_w^c(x) y^=argcmaxfwc(x)
这里, y ^ \hat{y} y^是我们对输入 x x x的预测类别,而 arg max c \arg\max_c argmaxc表示我们寻找使得 f w c ( x ) f_w^c(x) fwc(x)达到最大值的类别 c c c。
这种方法的优点在于它的简单性和易于实现,因为它允许我们重用为二分类问题设计的算法来解决多分类问题。然而,它的缺点是每个分类器都是独立训练的,可能不会考虑到类别之间的相关性。
2)多项分布直接实现多类分类
在多类分类问题中,我们可以使用多项分布(Multinomial distribution)来描述概率分布。以下是关于多项分布的一些基本概念和应用:
- 贝努利(Bernoulli)分布的输出只有两种取值。
- 多项分布,或称为范畴分布(categorical distribution),输出有 K K K种取值。
类似于用贝努利分布描述两类分类的概率分布,我们可以使用多项分布来描述多类分类的概率分布。多项分布的参数为向量 θ = ( θ 1 , . . . , θ C ) \boldsymbol{\theta} = (\theta_1, ..., \theta_C) θ=(θ1,...,θC),其中 ∑ c = 1 C θ c = 1 \sum_{c=1}^{C} \theta_c = 1 ∑c=1Cθc=1,其中每一个分量 θ c \theta_c θc表示第 c c c个状态的概率。我们用符号 C a t ( y ; θ ) Cat(y; \boldsymbol{\theta}) Cat(y;θ)表示。
注意:
- 多项分布(Multinoulli)是个人造词,经典概率书并没有将其作为一种概率分布单独表示,而是用多项(Multinomial)分布统称(Scikit-Learn采用的是Multinoulli)。有些参考书种称其为广义贝努利分布,或离散分布。
- 多重贝努利试验成功次数输出用二项(Binomial)分布表示。
- 多重多项分布(如掷骰子)的输出用多项(Multinomial)分布表示:Multinoulli是多项Multi+oulli(Bernoulli的后几个字母)。
在实际应用中,多项分布为多类分类问题提供了一种自然的概率模型,使得我们可以直接计算每个类别的概率,并选择概率最大的类别作为预测结果。
在多类分类问题中,我们经常使用独热编码(One-Hot Encoding)来表示类别标签。独热编码是一种将类别变量转换为二进制向量的方法,其中每个类别对应向量中的一个位置,如果类别与位置匹配,则该位置为1,其余位置为0。
- 将类别 y y y用独热编码(编码为 C C C维向量,当 y = c y = c y=c时,第 c c c维为1,其他元素均为0),记为向量 y \mathbf{y} y。
- 则Multinoulli分布的概率函数为:
C
a
t
(
y
;
θ
)
=
∏
c
=
1
C
θ
c
y
c
Cat(\mathbf{y}; \boldsymbol{\theta}) = \prod_{c=1}^{C} \theta_c^{y_c}
Cat(y;θ)=∏c=1Cθcyc,
- 其中 y c y_c yc表示向量 y \mathbf{y} y的第 c c c个元素。
或者用标量形式记为: C a t ( y ; θ ) = ∏ c = 1 C θ c I ( y = c ) Cat(y; \boldsymbol{\theta}) = \prod_{c=1}^{C} \theta_c^{\mathbb{I}(y=c)} Cat(y;θ)=∏c=1CθcI(y=c),
- 其中 I ( ⋅ ) \mathbb{I}(\cdot) I(⋅)为示性函数,当括号中条件满足时函数值为1,否则为0。
这种方法的优点在于它将多类分类问题转化为多个二分类问题,每个问题对应一个类别是否被选中的概率。通过计算每个类别的概率,我们可以选择概率最大的类别作为预测结果。
3)Softmax函数与多类分类
在多类分类问题中,我们经常使用Softmax函数来计算每个类别的概率。Softmax函数是sigmoid函数的推广,可以将一个 C C C维向量的每个元素转换为 [ 0 , 1 ] [0,1] [0,1]之间的数,并且这些数的总和为1。这使得Softmax函数非常适合用于多类分类问题中,计算属于每个类别的概率。
假设输出 y = c y = c y=c的概率可以由输入 x x x的线性组合再经过Softmax函数变换得到:
p ( y = c ∣ x , W ) = exp ( w c T x ) ∑ c ′ = 1 C exp ( w c ′ T x ) p(y = c | x, W) = \frac{\exp(\mathbf{w}_c^T \mathbf{x})}{\sum_{c'=1}^{C} \exp(\mathbf{w}_{c'}^T \mathbf{x})} p(y=c∣x,W)=∑c′=1Cexp(wc′Tx)exp(wcTx)
其中, w c \mathbf{w}_c wc是类别 c c c的权重向量, x \mathbf{x} x是输入特征向量。
Softmax函数定义为:
σ ( z c ) = exp ( z c ) ∑ c ′ = 1 C exp ( z c ′ ) \sigma(\mathbf{z}_c) = \frac{\exp(\mathbf{z}_c)}{\sum_{c'=1}^{C} \exp(\mathbf{z}_{c'})} σ(zc)=∑c′=1Cexp(zc′)exp(zc)
因此,得到的分类器被称为Softmax分类器。Softmax分类器通过计算输入属于每个类别的概率,然后选择概率最大的类别作为预测结果。
这种方法的优点在于它提供了一种自然的方式来处理多类分类问题,并且可以很容易地集成到神经网络中。然而,它的计算复杂度较高,特别是在类别数较多的情况下。
以下是Softmax分类模型的Log似然函数的推导过程:
- 将类别 y y y用独热编码为向量 y \mathbf{y} y: y c = I ( y = c ) y_c = \mathbb{I}(y = c) yc=I(y=c)
- 向量
μ
\boldsymbol{\mu}
μ表示Multinoulli分布的参数:
μ c = p ( y = c ∣ x , W ) = exp ( w c T x ) ∑ c ′ = 1 C exp ( w c ′ T x ) \mu_c = p(y = c | \mathbf{x}, \mathbf{W}) = \frac{\exp(\mathbf{w}_c^T \mathbf{x})}{\sum_{c'=1}^{C} \exp(\mathbf{w}_{c'}^T \mathbf{x})} μc=p(y=c∣x,W)=∑c′=1Cexp(wc′Tx)exp(wcTx)
令 μ i , c = exp ( w c T x i ) ∑ c ′ = 1 C exp ( w c ′ T x i ) \mu_{i,c} = \frac{\exp(\mathbf{w}_c^T \mathbf{x}_i)}{\sum_{c'=1}^{C} \exp(\mathbf{w}_{c'}^T \mathbf{x}_i)} μi,c=∑c′=1Cexp(wc′Txi)exp(wcTxi), y i , c y_{i,c} yi,c为第 i i i个样本的类别,则Softmax分类模型的log似然函数为:
ℓ ( W ) = ∑ i = 1 N ∑ c = 1 C y i , c ln ( μ i , c ) \ell(\mathbf{W}) = \sum_{i=1}^{N} \sum_{c=1}^{C} y_{i,c} \ln(\mu_{i,c}) ℓ(W)=i=1∑Nc=1∑Cyi,cln(μi,c)
或者,使用乘积形式表示为:
ℓ ( W ) = ∑ i = 1 N ln ( ∏ c = 1 C μ i , c y i , c ) \ell(\mathbf{W}) = \sum_{i=1}^{N} \ln \left( \prod_{c=1}^{C} \mu_{i,c}^{y_{i,c}} \right) ℓ(W)=i=1∑Nln(c=1∏Cμi,cyi,c)
其中, I ( ⋅ ) \mathbb{I}(\cdot) I(⋅)为示性函数,当括号中条件满足时函数值为1,否则为0。 μ i , c \mu_{i,c} μi,c表示第 i i i个样本属于类别 c c c的概率。
这个Log似然函数衡量了模型参数 W \mathbf{W} W对训练数据的拟合程度。通过最大化这个函数,我们可以找到最优的模型参数,从而提高模型的分类性能。
2、损失函数
在多类分类问题中,Softmax损失函数是一个常用的损失函数,它基于负对数似然(Negative Log Likelihood, NLL)。以下是Softmax损失函数的定义和应用:
-
定义Softmax损失为负log似然:
L ( μ , y ) = − ∑ c = 1 C y c ln ( μ c ) L(\boldsymbol{\mu}, \mathbf{y}) = -\sum_{c=1}^{C} y_c \ln(\mu_c) L(μ,y)=−c=1∑Cycln(μc) -
则极大似然估计等价于最小化训练集上的Softmax损失/负log似然损失:
J ( W ) = − ∑ i = 1 N ∑ c = 1 C y i , c ln ( μ i , c ) J(\mathbf{W}) = -\sum_{i=1}^{N} \sum_{c=1}^{C} y_{i,c} \ln(\mu_{i,c}) J(W)=−i=1∑Nc=1∑Cyi,cln(μi,c)
其中, μ i , c = p ( y = c ∣ x i , W ) = exp ( w c T x i ) ∑ c ′ = 1 C exp ( w c ′ T x i ) \mu_{i,c} = p(y = c | \mathbf{x}_i, \mathbf{W}) = \frac{\exp(\mathbf{w}_c^T \mathbf{x}_i)}{\sum_{c'=1}^{C} \exp(\mathbf{w}_{c'}^T \mathbf{x}_i)} μi,c=p(y=c∣xi,W)=∑c′=1Cexp(wc′Txi)exp(wcTxi) -
进一步展开:
J ( W ) = − ∑ i = 1 N ( ∑ c = 1 C y i , c w c T x i ( − ln ( ∑ c ′ = 1 C exp ( w c ′ T x i ) ) ) ) J(\mathbf{W}) = -\sum_{i=1}^{N} \left( \sum_{c=1}^{C} y_{i,c} \mathbf{w}_c^T \mathbf{x}_i \left( -\ln \left( \sum_{c'=1}^{C} \exp(\mathbf{w}_{c'}^T \mathbf{x}_i) \right) \right) \right) J(W)=−i=1∑N(c=1∑Cyi,cwcTxi(−ln(c′=1∑Cexp(wc′Txi))))
在训练过程中,我们的目标是找到一组权重 W \mathbf{W} W,使得Softmax损失函数 J ( W ) J(\mathbf{W}) J(W)最小化。这通常通过梯度下降或其他优化算法来实现。
Softmax损失函数的优点在于它直接衡量了模型预测的概率分布与真实标签之间的差异,并且可以很容易地集成到神经网络中。然而,它的计算复杂度较高,特别是在类别数较多的情况下。
3、Scikit-Learn中实现Logistic回归的类
在Scikit-Learn库中,LogisticRegression
类用于实现Logistic回归模型。以下是该类的构造函数及其参数的简要说明:
class sklearn.linear_model.LogisticRegression(
penalty='l2', dual=False, tol=0.0001, C=1.0,
fit_intercept=True, intercept_scaling=1, class_weight=None,
random_state=None, solver='liblinear', max_iter=100,
multi_class='ovr', verbose=0, warm_start=False, n_jobs=1
)
- 参数
multi_class
决定了多类分类的实现方式,可选:- a)
'ovr'
:即1对其他(one-vs-rest,OvR),将多类分类转化为多个二类分类任务。为了完成第 c c c类的分类决策,将所有第 c c c类的样本作为正例,除了第 c c c类样本以外的所有样本都作为负例,每个类别的二分类器单独训练。 - b)
'multinomial'
:Softmax回归分类,对多项分布概率整体进行训练。
- a)
注意:multi_class
选择会影响优化算法solver
参数的选择:
- OvR:可用所有的
solver
- Multinomial:只能选择
newton-cg
,lbfgs
和sag
/saga
(liblinear
不支持)
通过选择合适的multi_class
和solver
参数,可以有效地解决多类分类问题。在实际应用中,根据数据集的特点和需求选择合适的参数是非常重要的。
六、分类任务中的样本不均衡问题
1、不平衡数据的出现场景
不平衡数据是指在数据集中,各类别的样本数量存在显著差异的情况。这种数据不平衡的现象在许多实际应用场景中都会出现,以下是一些典型的不平衡数据出现场景:
1. 搜索引擎的点击预测:在搜索引擎中,用户点击的网页往往只占所有展示网页的一小部分。这意味着点击和未点击的网页数量之间存在显著的不平衡。
2. 电子商务领域的商品推荐:在电商平台上,推荐给用户的商品中,只有很小一部分会被购买。因此,购买和未购买的商品数量之间存在显著的不平衡。
3. 信用卡欺诈检测:信用卡欺诈行为相对较少,而正常的交易行为则非常普遍。因此,欺诈和非欺诈的交易记录之间存在显著的不平衡。
4. 网络攻击识别:网络攻击事件相对较少,而正常的网络活动则非常频繁。因此,攻击和非攻击的网络活动记录之间存在显著的不平衡。
5. 医疗中得病的案例少:在医疗领域,某些疾病的患病率可能非常低,而健康人群的数量则非常庞大。因此,患病和未患病的病例数量之间存在显著的不平衡。
处理不平衡数据是机器学习中的一个重要问题,因为不平衡的数据可能会导致模型偏向于多数类,从而影响模型对少数类的预测性能。因此,需要采取一些技术手段来处理不平衡数据,如重采样、生成合成样本、调整分类阈值等。
2、解决方法
为了解决不平衡数据问题,我们可以从两个主要角度出发:数据层面和算法层面。
从数据的角度:
- 抽样:通过抽样技术,可以使不同类别的数据达到相对均衡的状态。这包括:
- 过采样(Oversampling):增加少数类样本的数量,使其与多数类样本数量相匹配。
- 欠采样(Undersampling):减少多数类样本的数量,使其与少数类样本数量相匹配。
- 合成样本生成:如SMOTE(Synthetic Minority Over-sampling Technique)技术,通过插值方法生成新的少数类样本。
预处理:在数据预处理阶段,可以采取一些措施来平衡数据,例如:
- 清洗数据,去除噪声和异常值。
- 特征选择,选择对分类有帮助的特征。
- 特征缩放,使不同特征在相同的尺度上。
从算法的角度:
- 考虑不同误分类情况代价的差异性:在算法设计和优化过程中,需要考虑不同类别误分类的代价。例如,在医疗诊断中,将疾病误诊为健康的代价远高于将健康误诊为疾病。因此,可以对算法进行优化,使其更加关注那些误分类代价较高的类别。
- 调整分类阈值:通过调整分类器的决策阈值,可以改变分类器对不同类别的偏好。
- 代价敏感学习:在训练过程中,为不同类别的误分类赋予不同的权重,使得算法在优化过程中更加关注那些误分类代价较高的类别。
通过上述方法,我们可以有效地解决不平衡数据问题,提高模型在少数类上的预测性能。
1)抽样
在处理不平衡数据时,抽样是一种常用的技术,它可以帮助我们调整数据集中各类别样本的数量,使其更加均衡。抽样技术主要分为两种:随机下抽样和随机上抽样。
随机下抽样:
- 从多数类中随机选择少量样本,再合并原有少数类样本,形成新的训练数据集。
- 有放回抽样:在抽样过程中,允许同一个样本被多次选中。
- 无放回抽样:在抽样过程中,一旦样本被选中,就不再放回样本池中。
- 这种方法可能会造成一些信息的缺失,因为选取的样本可能存在偏差。
随机上抽样:
- 随机复制少数类样本,以扩大数据集。
- 这种方法可以增加少数类样本的数量,使得数据集更加均衡。
- 但是,它也可能增加模型训练的复杂度,并可能导致模型过拟合,因为模型可能会过度依赖这些复制的样本。
在实际应用中,选择合适的抽样方法需要根据具体的数据集和问题来决定。有时,结合使用不同的抽样技术,或者与其他数据平衡方法(如合成样本生成)结合使用,可能会取得更好的效果。
2)下采样与集成学习
在处理不平衡数据时,下采样与集成学习是两种有效的技术。它们可以帮助我们构建更加健壮和准确的模型。以下是两种常用的算法:
EasyEnsemble算法:
- 对于多数类样本,通过 n n n次有放回抽样生成 n n n份子集。
- 少数类样本分别和这 n n n份样本合并训练一个模型,共得到 n n n个模型。
- 最终模型是这 n n n个模型预测结果的平均值。
BalanceCascade(级联)算法:
- 从多数类中有效地选择一些样本与少数类样本合并为新的数据集进行训练。
- 训练好的模型对每个多数类样本进行预测。如果预测正确,则不考虑将其作为下一轮的训练样本。
- 依次迭代直到满足某一停止条件,最终的模型是多次迭代模型的组合。
这两种算法通过不同的方式处理多数类和少数类样本,以提高模型在少数类上的预测性能。EasyEnsemble算法通过集成多个模型的预测结果来提高准确性,而BalanceCascade算法则通过迭代地选择多数类样本来逐步提高模型的性能。
3)上采样与样本合成
在处理不平衡数据时,上采样是一种常用的方法,它通过增加少数类样本的数量来平衡数据集。SMOTE(Synthetic Minority Over-sampling Technique)是一种流行的上采样技术,它通过“插值”为少数类合成新的样本。
对于少数类的一个样本 i i i,其特征向量为 x i \mathbf{x}_i xi:
1. 从少数类的全部
N
N
N个样本中找到样本
x
i
\mathbf{x}_i
xi的
K
K
K个近邻(如欧氏距离),记为
x
i
(
n
e
a
r
)
\mathbf{x}_{i(near)}
xi(near),
n
e
a
r
∈
{
1
,
.
.
.
,
K
}
near \in \{1, ..., K\}
near∈{1,...,K}
2. 从这
K
K
K个近邻中随机选择一个样本
x
i
(
n
n
)
\mathbf{x}_{i(nn)}
xi(nn),再生成
0
0
0到
1
1
1之间的随机数
ζ
\zeta
ζ,从而合成一个新样本:
x
i
1
=
(
1
−
ζ
)
x
i
+
ζ
x
i
(
n
e
a
r
)
\mathbf{x}_{i1} = (1 - \zeta)\mathbf{x}_i + \zeta\mathbf{x}_{i(near)}
xi1=(1−ζ)xi+ζxi(near)
这种方法通过在少数类样本之间进行插值来生成新的样本,从而增加了少数类样本的数量,有助于改善模型在少数类上的预测性能。
更多关于SMOTE的信息可以参考以下资源:
- SMOTE Explained
- Nitesh V. Chawla, Kevin W. Bowyer, Lawrence O. Hall, W. Philip Kegelmeyer. SMOTE: Synthetic Minority Over-sampling Technique. Journal of Artificial Intelligence Research 16 (2002), 321 – 357 链接
4)SMOTE算法
SMOTE(Synthetic Minority Over-sampling Technique)算法是一种用于处理不平衡数据集的过采样技术。它通过合成新的少数类样本来增加少数类的数量,从而平衡数据集。SMOTE算法摒弃了随机过采样复制样本的做法,可以防止随机过采样易过拟合的问题。实践证明,此方法可以提高分类器的性能。
然而,SMOTE算法对高维数据不是很有效。在合成实例时,SMOTE可能会把来自其他类的相邻实例考虑进来,这导致了类重叠的增加,并会引入额外的噪音。
此外,如果少数类中的样本是较远的并出现在多数类中,合成新数据可能会造成类别错误。
改进:为了解决这些问题,提出了一些改进的SMOTE算法,如Borderline-SMOTE算法等。这些改进的算法试图通过更智能地选择合成样本的位置和数量来减少类重叠和噪音。
更多关于改进的SMOTE算法的信息可以参考以下资源:
- GitHub - scikit-learn-contrib/imbalanced-learn
下图展示了在少数类样本较远并出现在多数类中的情况下,合成新数据可能会造成类别错误的情况:
5)代价敏感学习
在算法层面上解决不平衡数据学习的方法主要是基于代价敏感学习算法(Cost-Sensitive Learning)。这种方法通过为不同类型的误分类情况分配不同的代价,来优化模型的性能。
代价敏感学习方法的核心要素是代价矩阵:不同类型的误分类情况导致的代价不一样。通过调整这些代价,可以使得模型在训练过程中更加关注那些误分类代价较高的情况。
代价矩阵通常表示为:
y ^ \hat{y} y^ \ y y y | 0 | 1 |
---|---|---|
0 | L 00 L_{00} L00 | L 01 L_{01} L01 |
1 | L 10 L_{10} L10 | L 11 L_{11} L11 |
其中, y ^ \hat{y} y^ 表示模型的预测结果, y y y 表示真实的标签。 L i j L_{ij} Lij 表示将真实类别 j j j 错误分类为类别 i i i 的代价。例如, L 01 L_{01} L01 表示将类别 1 错误分类为类别 0 的代价, L 10 L_{10} L10 表示将类别 0 错误分类为类别 1 的代价。
通过合理设置这些代价值,可以引导模型在面对不平衡数据时做出更加合理的决策,从而提高模型在少数类上的预测性能。
基于代价矩阵分析,代价敏感学习方法主要有以下三种实现方式
- 从贝叶斯风险理论出发,把代价敏感学习看成是分类结果的一种后处理,按照传
统方法学习到一个模型,以实现损失最小为目标对结果进行调整
不依赖所用具体的分类器
缺点:要求分类器输出值为概率 - 从学习模型出发,对具体学习方法的改造,使之能适应不平衡数据下的学习
如:代价敏感的支持向量机,决策树,神经网络 - 从预处理的角度出发,将代价用于权重的调整,使得分类器满足代价敏感的特性
如不同类别的样本的权值不同
3、Scikit-Learn中的不均衡样本分类处理
在Scikit-Learn中,处理不均衡样本分类问题主要通过两种权重参数:类别权重(class_weight
)和样本权重(sample_weight
)。
1)类别权重 class_weight
class_weight
参数用于标示分类模型中各类别样本的权重。- 不考虑权重:即所有类别的权重相同。
- balanced:自动计算类别权重。某类别的样本量越多,其权重越低;样本量越少,则权重越高。类权重计算方法为: n s a m p l e s / ( n c l a s s e s ∗ n p . b i n c o u n t ( y ) ) n_{samples} / (n_{classes} * np.bincount(y)) nsamples/(nclasses∗np.bincount(y)): n s a m p l e s n_{samples} nsamples为样本数, n c l a s s e s n_{classes} nclasses为类别数量, n p . b i n c o u n t ( y ) np.bincount(y) np.bincount(y)输出每个类的样本数。
- 手动指定各个类别的权重:如对于0,1二类分类问题,可以定义
class_weight={0:0.9, 1:0.1}
,即类别0的权重为90%,而类别1的权重为10%。
2)样本权重 sample_weight
- 模型训练:
fit(X, y, sample_weight=None)
,其中参数sample_weight
为样本权重参数。 - 如果既用了
class_weight
,又用了sample_weight
,那么样本的真正权重是:class_weight * sample_weight
。
3)样本权重的应用
- 判断一个分类器对所用样本的分类能力或者在不同的应用场合时,需要有不同的指标。
- 在Scikit-Learn中,评价指标计算可对每个样本施加权重,权重通过参数
sample_weight
指定。
通过合理设置这些权重参数,可以使得模型在训练过程中更加关注那些重要或代表性不足的样本,从而提高模型的整体性能和泛化能力。
七、分类模型的评价指标
在机器学习中,评估分类模型的性能是非常重要的。以下是两种常用的分类模型评价指标:
1. 正确率:Sklearn中分类任务的默认评价指标
正确率是衡量分类模型性能的一种简单而直观的方法。它的计算公式如下:
Accuracy ( y ^ , y ) = 1 N ∑ i = 0 N I ( y ^ i = y i ) \text{Accuracy}(\hat{y}, y) = \frac{1}{N} \sum_{i=0}^{N} I(\hat{y}_i = y_i) Accuracy(y^,y)=N1i=0∑NI(y^i=yi)
- 其中, I ( ⋅ ) I(\cdot) I(⋅) 为示性函数,当括号中的条件满足时函数值为1,否则为0。这意味着如果模型的预测值 y ^ i \hat{y}_i y^i 与真实值 y i y_i yi 相等,则该项为1,否则为0。正确率是所有预测正确的样本数占总样本数的比例。
2. 负log似然损失(交叉熵损失)
交叉熵损失是另一种常用的分类模型评价指标,特别是在多分类问题中。它的计算公式如下:
logloss ( Y ^ , Y ) = − 1 N ∑ i = 1 N ∑ c = 1 C y i , c ln ( y ^ i , c ) \text{logloss}(\hat{Y}, Y) = -\frac{1}{N} \sum_{i=1}^{N} \sum_{c=1}^{C} y_{i,c} \ln(\hat{y}_{i,c}) logloss(Y^,Y)=−N1i=1∑Nc=1∑Cyi,cln(y^i,c)
- 这里的 y i , c y_{i,c} yi,c 是真实标签的指示函数,如果样本 i i i 属于类别 c c c,则 y i , c = 1 y_{i,c} = 1 yi,c=1,否则为0。 y ^ i , c \hat{y}_{i,c} y^i,c 是模型预测样本 i i i 属于类别 c c c 的概率。交叉熵损失衡量的是模型预测概率分布与真实分布之间的差异,值越小表示模型性能越好。
3. 合页损失(SVM中的损失函数)
合页损失是支持向量机(SVM)中常用的损失函数,用于衡量分类错误的情况。它的计算公式如下:
HingeLoss ( y ^ , y ) = 1 N ∑ i = 0 N max ( 1 , y ^ i y i ) \text{HingeLoss}(\hat{y}, y) = \frac{1}{N} \sum_{i=0}^{N} \max(1, \hat{y}_i y_i) HingeLoss(y^,y)=N1i=0∑Nmax(1,y^iyi)
- 合页损失函数计算的是每个样本的预测值 y ^ i \hat{y}_i y^i 与真实值 y i y_i yi 的乘积与1的最大值。如果预测值与真实值同号,则该项为0;如果预测值与真实值异号,则该项为1。合页损失是所有这些项的平均值,值越小表示模型性能越好。
4、混淆矩阵
混淆矩阵是评估分类模型性能的一种重要工具,尤其适用于多类分类问题。混淆矩阵是一个大小为
C
×
C
C \times C
C×C 的矩阵,其中
C
C
C 是类别的数量。
对于一个
C
C
C 类分类问题,混淆矩阵是一个
C
×
C
C \times C
C×C 的矩阵。以手写数字识别为例,混淆矩阵如下所示:
[ 87 0 0 1 0 0 0 0 0 0 88 1 0 0 0 1 1 0 0 0 85 1 0 0 0 0 0 0 0 0 79 0 3 0 4 5 0 0 0 0 88 0 0 0 4 0 0 0 0 0 88 1 0 2 0 1 0 0 0 0 90 0 0 0 0 0 0 1 0 0 88 0 0 0 0 0 0 0 0 0 88 0 0 0 1 0 0 0 0 90 ] \begin{bmatrix} 87 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 88 & 1 & 0 & 0 & 0 & 1 & 1 & 0 \\ 0 & 0 & 85 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 79 & 0 & 3 & 0 & 4 & 5 \\ 0 & 0 & 0 & 0 & 88 & 0 & 0 & 0 & 4 \\ 0 & 0 & 0 & 0 & 0 & 88 & 1 & 0 & 2 \\ 0 & 1 & 0 & 0 & 0 & 0 & 90 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 88 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 88 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 90 \\ \end{bmatrix} 8700000000008800001000018500000001017900000100008800100000308800000100019000001040008800000542008890
- 矩阵的第 i i i 行第 j j j 列的元素值表示将真实类别标签为 i i i 类的样本预测为第 j j j 类的样本数目。对角线上的元素表示正确分类的样本数,因此对角线元素越大越好。
通过混淆矩阵,我们可以直观地看到模型在各个类别上的表现,从而评估模型的分类性能。
5、二分类任务的评价指标
1)混淆矩阵
在二分类问题中,我们通常也是使用混淆矩阵来评估模型的性能。混淆矩阵是一个 2 × 2 2 \times 2 2×2的矩阵,它帮助我们理解模型在正负样本上的预测准确性。
混淆矩阵定义如下:
真值\预测值 | y ^ = 1 \hat{y} = 1 y^=1 | y ^ = 0 \hat{y} = 0 y^=0 | Σ \Sigma Σ |
---|---|---|---|
y = 1 y = 1 y=1 | T P TP TP | F N FN FN | N + N_+ N+ |
y = 0 y = 0 y=0 | F P FP FP | T N TN TN | N − N_- N− |
其中:
- T P TP TP(True Positive):真正例,模型正确预测为正的样本数。
- F N FN FN(False Negative):假负例,模型错误预测为负的正样本数。
- F P FP FP(False Positive):假正例,模型错误预测为正的负样本数。
- T N TN TN(True Negative):真负例,模型正确预测为负的样本数。
- N + N_+ N+:所有正样本的总数。
- N − N_- N−:所有负样本的总数。
基于混淆矩阵,我们可以计算以下评价指标:
-
Precision(精确率/查准率):在所有被预测为正的样本中实际为正的样本的比例,公式为 P r e c i s i o n = T P N ^ + Precision = \frac{TP}{\hat{N}_+} Precision=N^+TP。它衡量了正样本结果中的预测准确程度。
-
Recall(召回率/查全率):在实际为正的样本中被预测为正样本的比例,公式为 R e c a l l = T P N + Recall = \frac{TP}{N_+} Recall=N+TP,也称为TPR(True Positive Rate)。
-
FPR(假阳率):在实际为负的样本中被预测为正样本的比例,公式为 F P R = F P N − FPR = \frac{FP}{N_-} FPR=N−FP,也称为FPR(False Positive Rate)。
注意:精确率和召回率是互相影响的。一般情况下,精确率高时,召回率可能较低;反之,召回率低时,精确率可能较高。因此,在实际应用中,我们需要根据具体需求平衡这两个指标。
- F1分数:Precision和Recall的调和平均值,公式为
F
1
=
2
(
P
r
e
c
i
s
i
o
n
×
R
e
c
a
l
l
)
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
F1 = \frac{2(Precision \times Recall)}{Precision + Recall}
F1=Precision+Recall2(Precision×Recall)。它综合考虑了精确率和召回率,是一个平衡的评估指标。(或者说F1是Precision 和Recall调和平均值)
这些指标帮助我们全面了解模型在二分类任务中的表现,从而进行相应的优化和调整。
这部分内容主要介绍了用于评估二分类模型性能的两个重要曲线:PR曲线和ROC曲线,以及相关的评价指标。
2)PR/ROC曲线
**PR曲线(Precision-Recall Curve)**主要关注模型在正类样本上的表现,它通过以下两个指标来评估:
-
Precision(精确率):预测结果为真的样本中真正为真的比例。公式为 P r e c i s i o n = T P N ^ + Precision = \frac{TP}{\hat{N}_+} Precision=N^+TP,其中 T P TP TP是真正例的数量, N ^ + \hat{N}_+ N^+是所有被预测为正的样本数。精确率越高,表示模型预测为正的样本中真正为正的比例越高。
-
Recall(召回率)/ TPR(真阳率):预测结果召回了多少真正的正样本;有多少真正的正样本被预测为真。公式为 T P R = R e c a l l = T P N + TPR = Recall = \frac{TP}{N_+} TPR=Recall=N+TP,其中 T P TP TP是真正例的数量, N + N_+ N+是所有实际为正的样本数。召回率越高,表示模型能够识别出更多的真正正样本。
**ROC曲线(Receiver Operating Characteristic Curve)**则提供了模型整体性能的视图,它通过以下两个指标来评估:
-
TPR(真阳率):与Recall相同,表示模型正确识别正样本的能力。
-
FPR(假阳率):预测结果将多少假的样本预测预测成了真的比例。公式为 F P R = F P N − FPR = \frac{FP}{N_-} FPR=N−FP,其中 F P FP FP是假正例的数量, N − N_- N−是所有实际为负的样本数。假阳率越低,表示模型误将负样本预测为正样本的比例越低。
ROC曲线通过展示不同阈值下TPR和FPR的变化,帮助我们理解模型在不同决策阈值下的性能表现。理想情况下,我们希望模型的ROC曲线尽可能靠近左上角,这意味着高TPR和低FPR。
总的来说,PR曲线和ROC曲线是评估二分类模型性能的重要工具,它们帮助我们从不同角度理解模型的预测能力。
3)Matthews相关性系数(MCC)
**Matthews相关性系数(MCC)**是一个综合混淆矩阵的指标,用于度量真实值和预测值之间的相关性。其定义如下:
M C C = T P × T N − F P × F N ( T P + F P ) ( T P + F N ) ( T N + F P ) ( T N + F N ) MCC = \frac{TP \times TN - FP \times FN}{\sqrt{(TP + FP)(TP + FN)(TN + FP)(TN + FN)}} MCC=(TP+FP)(TP+FN)(TN+FP)(TN+FN)TP×TN−FP×FN
其中, T P TP TP是真正例的数量, T N TN TN是真负例的数量, F P FP FP是假正例的数量, F N FN FN是假负例的数量。分母中任意一对括号相加之和如果为0,那么整个MCC的值就为0。
MCC值的范围在[-1,1]之间:
- 1:完美分类器,表示模型的预测完全正确。
- 0:随机分类器,表示模型的预测与随机猜测无异。
- -1:分类器是最差,所有预测结果和实际相反。
混淆矩阵如下所示:
真值\预测值 | y ^ = 1 \hat{y} = 1 y^=1 | y ^ = 0 \hat{y} = 0 y^=0 | Σ \Sigma Σ |
---|---|---|---|
y = 1 y = 1 y=1 | T P TP TP | F N FN FN | N + N_+ N+ |
y = 0 y = 0 y=0 | F P FP FP | T N TN TN | N − N_- N− |
MCC是一个平衡的指标,它同时考虑了真正例、真负例、假正例和假负例,因此对于类别不平衡的数据集特别有用。
4) 垃圾邮件分类示例
示例1:平衡数据集
假设我们有100封测试邮件,其中50封为垃圾邮件,50封为非垃圾邮件。我们的目标是正确识别垃圾邮件,因此以垃圾邮件类为正样本类。
某分类器的预测结果如下:
- T P = 40 TP = 40 TP=40(真正例)
- T N = 40 TN = 40 TN=40(真负例)
- F P = 10 FP = 10 FP=10(假正例)
- F N = 10 FN = 10 FN=10(假负例)
计算得到的评价指标为:
- 准确率(Accuracy): A c c u r a c y = T P + T N T P + F P + T N + F N = 0.8 Accuracy = \frac{TP + TN}{TP + FP + TN + FN} = 0.8 Accuracy=TP+FP+TN+FNTP+TN=0.8
- 精确率(Precision): P r e c i s i o n = T P T P + F P = 0.8 Precision = \frac{TP}{TP + FP} = 0.8 Precision=TP+FPTP=0.8
- 召回率(Recall): R e c a l l = T P T P + F N = 0.8 Recall = \frac{TP}{TP + FN} = 0.8 Recall=TP+FNTP=0.8
- F1分数(F1 Score): F 1 = 2 ( P r e c i s i o n × R e c a l l ) P r e c i s i o n + R e c a l l = 0.8 F1 = \frac{2(Precision \times Recall)}{Precision + Recall} = 0.8 F1=Precision+Recall2(Precision×Recall)=0.8
- Matthews相关性系数(MCC): M C C = T P × T N − F P × F N ( T P + F P ) ( T P + F N ) ( T N + F P ) ( T N + F N ) = 0.6 MCC = \frac{TP \times TN - FP \times FN}{\sqrt{(TP + FP)(TP + FN)(TN + FP)(TN + FN)}} = 0.6 MCC=(TP+FP)(TP+FN)(TN+FP)(TN+FN)TP×TN−FP×FN=0.6
混淆矩阵如下所示:
真值\预测值 | y ^ = 1 \hat{y} = 1 y^=1 | y ^ = 0 \hat{y} = 0 y^=0 |
---|---|---|
y = 1 y = 1 y=1 | 40 | 10 |
y = 0 y = 0 y=0 | 10 | 40 |
示例2:不平衡数据集
假设我们有100封测试邮件,其中98封邮件为正常邮件,垃圾邮件为2封(分布不均衡)。
假设有一个简单的分类器,永远只做出正常邮件判断,那么:
- T P = 98 TP = 98 TP=98(真正例)
- T N = 0 TN = 0 TN=0(真负例)
- F N = 0 FN = 0 FN=0(假负例)
- F P = 2 FP = 2 FP=2(假正例)
计算得到的评价指标为:
- 准确率(Accuracy): A c c u r a c y = T P + T N T P + F P + T N + F N = 0.98 Accuracy = \frac{TP + TN}{TP + FP + TN + FN} = 0.98 Accuracy=TP+FP+TN+FNTP+TN=0.98
- 精确率(Precision): P r e c i s i o n = T P T P + F P = 0.98 Precision = \frac{TP}{TP + FP} = 0.98 Precision=TP+FPTP=0.98
- 召回率(Recall): R e c a l l = T P T P + F N = 1 Recall = \frac{TP}{TP + FN} = 1 Recall=TP+FNTP=1
- F1分数(F1 Score): F 1 = 2 ( P r e c i s i o n × R e c a l l ) P r e c i s i o n + R e c a l l = 0.989 F1 = \frac{2(Precision \times Recall)}{Precision + Recall} = 0.989 F1=Precision+Recall2(Precision×Recall)=0.989
- Matthews相关性系数(MCC): M C C = T P × T N − F P × F N ( T P + F P ) ( T P + F N ) ( T N + F P ) ( T N + F N ) = 0 MCC = \frac{TP \times TN - FP \times FN}{\sqrt{(TP + FP)(TP + FN)(TN + FP)(TN + FN)}} = 0 MCC=(TP+FP)(TP+FN)(TN+FP)(TN+FN)TP×TN−FP×FN=0
混淆矩阵如下所示:
真值\预测值 | y ^ = 1 \hat{y} = 1 y^=1 | y ^ = 0 \hat{y} = 0 y^=0 |
---|---|---|
y = 1 y = 1 y=1 | 98 | 0 |
y = 0 y = 0 y=0 | 2 | 0 |
从这两个示例中可以看出,即使准确率很高,也不一定能反映模型的实际性能,特别是在类别不平衡的情况下。因此,我们需要综合考虑多个评价指标来全面评估模型的性能。
6、Receiver Operating Characteristic (ROC)曲线
ROC曲线是一种用于评估分类模型性能的工具,特别是在二分类问题中。它通过展示不同阈值下模型的真阳率(TPR)和假阳率(FPR)之间的关系,帮助我们理解模型的整体性能。
在之前的讨论中,我们考虑了给定阈值 τ \tau τ的TPR(真阳率)和FPR(假阳率)。如果我们不是只考虑一个阈值,而是在一系列阈值上运行分类器,并画出TPR和FPR作为阈值 τ \tau τ的隐式函数,我们就可以得到ROC曲线。
ROC曲线的关键要素包括:
- TPR(真阳率): T P R = T P N + TPR = \frac{TP}{N_+} TPR=N+TP,表示在所有实际为正的样本中,被正确预测为正的比例。
- FPR(假阳率): F P R = F P N − FPR = \frac{FP}{N_-} FPR=N−FP,表示在所有实际为负的样本中,被错误预测为正的比例。
ROC曲线的绘制如下:
- 当每个样本都被判断为正时,FPR达到1,TPR也达到1。
- 当每个样本都被判断为负时,FPR为0,TPR也为0。
在ROC曲线下,有一个重要的指标是AUC(Area Under Curve),它表示ROC曲线下的面积。AUC的值范围从0到1,值越大表示模型的性能越好。
图中还标示了Equal Error Rate,这是TPR和FPR相等时的点,是模型性能的一个参考指标。
总的来说,ROC曲线和AUC为我们提供了一个直观的方式来评估和比较不同分类模型的性能,特别是在处理不平衡数据集时。
1)例:ROC曲线
示例1
假设我们要根据文章特征 x x x(例如文章长度、作者数目、作者之前投递给该杂志的文章数据等),判断某篇文章是否会被杂志接收。
测试样本总数为500篇,其中250篇被接收(红色表示),250篇被拒绝(蓝色表示)。现有一个分类器1,它根据文章特征输出文章被接收的概率。
下图展示了分类器1输出的被接收概率与对应的正样本数目和负样本数目的关系。
- 假设取阈值为概率阈值0.5:那么140篇文章被判断为拒绝,360篇文章被接收。其中,235个红色样本(真正例)被正确接收,125个蓝色样本(假正例)被错误接收。因此, T P R = 235 250 = 0.94 TPR = \frac{235}{250} = 0.94 TPR=250235=0.94, F P R = 125 250 = 0.5 FPR = \frac{125}{250} = 0.5 FPR=250125=0.5,对应ROC曲线上的点为 ( x , y ) = ( 0.5 , 0.94 ) (x, y) = (0.5, 0.94) (x,y)=(0.5,0.94)。
示例2
继续使用相同的测试样本,但这次使用分类器2。
假设取阈值为概率阈值0.8:那么50篇文章被判断为接收,450篇被拒绝。其中,50个红色样本被正确接收,没有蓝色样本被错误接收。因此, T P R = 50 250 = 0.2 TPR = \frac{50}{250} = 0.2 TPR=25050=0.2, F P R = 0 FPR = 0 FPR=0,对应ROC曲线上的点为 ( x , y ) = ( 0 , 0.2 ) (x, y) = (0, 0.2) (x,y)=(0,0.2)。
示例3
还是使用分类器2,但这次假设取阈值为概率阈值0.6:那么200篇文章被判断为接收,300篇被拒绝。其中,200个红色样本被正确接收,没有蓝色样本被错误接收。因此, T P R = 200 250 = 0.8 TPR = \frac{200}{250} = 0.8 TPR=250200=0.8, F P R = 0 FPR = 0 FPR=0,对应ROC曲线上的点为 ( x , y ) = ( 0 , 0.8 ) (x, y) = (0, 0.8) (x,y)=(0,0.8)。
通过这些示例,我们可以看到不同的阈值选择如何影响分类器的性能指标,以及这些指标如何在ROC曲线上表示出来。ROC曲线为我们提供了一个直观的方式来评估和比较不同分类模型的性能。
示例来源
2)ROC曲线
ROC曲线是一种用于评估二分类模型性能的工具,它通过展示不同阈值下模型的真阳率(TPR)和假阳率(FPR)之间的关系,帮助我们理解模型的整体性能。
ROC曲线越偏左上角表示分类器性能越好。AUC(Area Under Curve)是ROC曲线下的面积,取值在[0.5, 1.0]之间,0.5表示随机猜测分类器,1表示完美分类。
TPR和FPR是针对单一类别的预测结果而言的。例如,假设总样本中,90%是正样本,10%是负样本。TPR只关注90%正样本中有多少被预测正确,与10%负样本无关;FPR只关注10%负样本中有多少被预测错误,与90%正样本无关。
ROC曲线对整体样本是否均衡并不敏感。
3)示例:ROC
我们有两个分类器,分类器1和分类器2,它们对不同类别的预测概率如下:
绘制ROC曲线(阈值分别取0、0.2、0.4、0.6、0.8和1,后验概率大于等于阈值的被认为是正样本)。
正样本数 N + = 2 N_+ = 2 N+=2,负样本数 N − = 4 N_- = 4 N−=4。
计算TPR和FPR:
T P R = T P N + , F P R = F P N − TPR = \frac{TP}{N_+}, \quad FPR = \frac{FP}{N_-} TPR=N+TP,FPR=N−FP
TPR/FPR表和ROC曲线如下:
ROC曲线图展示了分类器1(C1)和分类器2(C2)的性能比较。
7、Precision and Recall (PR)曲线
PR(Precision and Recall)曲线:用于稀有事件检测,如目标检测、信息检索、推荐系统。
负样本非常多( N 负 N_{负} N负 很大),因此 F P R = F P N 负 FPR = \frac{FP}{N_{负}} FPR=N负FP 很小,比较TPR和FPR没有太大意义(ROC曲线中只有左边很小一部分有意义)→ 只讨论正样本。
-
Precision(精准率,查准率):预测结果为真的样本中真正为真的比例。
-
Recall(召回率,查全率):预测结果召回了多少真正的真样本。
1)PR曲线:阈值变化时的Precision和Recall
Precision = T P N ^ + = \frac{TP}{\hat{N}_+} =N^+TP:检测结果真正为正的比例
Recall = T P N + = \frac{TP}{N_+} =N+TP:被正确检测到的正样本的比例
注意:精准率和召回率是互相影响的。一般情况下精准率高,召回率就低;召回率低,精准率高。
下图展示了PR曲线,其中曲线A和曲线B分别表示不同模型或不同阈值设置下的Precision和Recall的变化情况。通常情况下,我们希望找到一条曲线,它在保持较高Recall的同时,Precision也尽可能高。
2)AP:Average Precision
Precision只考虑了返回结果中相关文档的数目,没有考虑文档之间的顺序。
对一个搜索引擎或推荐系统而言,返回的结果是有序的,且越相关的文档越靠前越好,于是有了AP(Average Precision)的概念。
AP:对不同召回率点上的精准率进行平均
A P = ∫ 0 1 P ( R ) d R = ∑ k = 0 n P ( k ) Δ R ( k ) AP = \int_{0}^{1} P(R) dR = \sum_{k=0}^{n} P(k) \Delta R(k) AP=∫01P(R)dR=k=0∑nP(k)ΔR(k)
即PR曲线下的面积(Recall:AUC为ROC下的面积)。
3)mAP:Mean AP
平均AP(Mean Average Precision, mAP):多个AP的平均。
例如,在物体检测中,我们经常使用mAP来评价模型性能,这涉及到计算多个物体类别的AP的平均值。
8、Scikit-Learn中分类模型性能评价
类似回归模型的性能评价,Scikit-Learn中对分类模型性能评价提供3种不同的API:
- estimator的score方法:每个学习器都有score方法,提供一个缺省的评估方法(分类为正确率)。
- Scoring参数:使用交叉验证评估模型的工具有Scoring参数。
- Metric:metrics模块实现了一些函数,用来评估预测误差。
9、多分类与多标签
多类(Multiclass)分类:相对于两类(binary)分类而言,标签 y y y的取值有多种,例如对水果进行分类,水果可能是橙子、苹果或梨。多类分类的假设是,每个样本被分配到一个和唯一一个标签:一个水果可以是苹果或梨,但不是同时两个。
多标签(Multilabel)分类:给每个样本分配一套目标标签,这些标签不相互排斥(类似物体属性,可以有多种属性)。例如与文档相关的主题,文本可能同时是关于宗教、政治、金融或教育的,或者不属于这些主题。
10、Scikit-Learn中metrics的分类模型评价指标
1)只能用于两类分类
函数 | 说明 |
---|---|
precision_recall_curve(y_true, probas_pred) | 计算不同概率阈值对应的precision-recall对 |
roc_curve(y_true, y_score[, pos_label, ...]) | 计算接收器操作特性(ROC)曲线 |
2)亦可用于多类分类
函数 | 说明 |
---|---|
cohen_kappa_score(y1, y2[, labels, weights, ...]) | Kappa分数(Cohen’s kappa):衡量两种标注结果的吻合程度 |
confusion_matrix(y_true, y_pred[, labels, ...]) | 计算混淆矩阵 |
hinge_loss(y_true, pred_decision[, labels, ...]) | 平均合页损失(非正则的) |
matthews_corrcoef(y_true, y_pred[, ...]) | 计算Matthews相关系数 (MCC) |
3)可用于多标签
函数 | 说明 |
---|---|
accuracy_score(y_true, y_pred[, normalize, ...]) | 正确率 |
classification_report(y_true, y_pred[, ...]) | 创建一个包含主要分类评价指标的文本报告 |
f1_score(y_true, y_pred[, labels, ...]) | F1分数 |
fbeta_score(y_true, y_pred, beta[, labels, ...]) | F-beta 分数 F β = ( 1 + β 2 ) precision × recall β 2 precision + recall . F_{\beta} = (1 + \beta^2) \frac{\text{precision} \times \text{recall}}{\beta^2 \text{precision} + \text{recall}}. Fβ=(1+β2)β2precision+recallprecision×recall. |
hamming_loss(y_true, y_pred[, labels, ...]) | 平均Hamming损失 |
jaccard_similarity_score(y_true, y_pred[, ...]) | Jaccard相似度分数 |
log_loss(y_true, y_pred[, eps, normalize, ...]) | Logloss, logistic损失或交叉熵损失 |
precision_recall_fscore_support(y_true, y_pred) | 计算每个类的precision, recall, F-measure and support |
precision_score(y_true, y_pred[, labels, ...]) | precision |
recall_score(y_true, y_pred[, labels, ...]) | recall |
zero_one_loss(y_true, y_pred[, normalize, ...]) | 0/1分类损失 |
4)可用于两类和多标签场合(但不能用于多类场合)
函数 | 说明 |
---|---|
average_precision_score(y_true, y_score[, ...]) | 计算平均精度 (AP) |
roc_auc_score(y_true, y_score[, average, ...]) | 计算ROC曲线下的面积 (AUC) |
更多信息请参见Scikit-Learn文档:
- Scikit-Learn Classification Metrics
11、从两类分类到多类分类和多标签
好些评价指标(如 f 1 _ s c o r e f1\_score f1_score, r o c _ a u c _ s c o r e roc\_auc\_score roc_auc_score)都是用于二分类任务。
将两类分类指标扩展到多类或多标签问题:在多类或多标签问题中,可将其视为多个两类分类问题的集合,每个类别一个。
采用不同的平均方式(通过average参数指定),可将多个两类分类指标合并得到多类或多标签问题相应的评价指标:
-
宏观 “macro”:对每个类别(二分类)评价指标,再求平均,每个类别的权重相同,会放大少数类(样本数目较少的类的影响)。
-
微观 “micro”:对每个样本(不分类别)计算全局的评价指标,每个样本的权重相同。多标签任务中首选,也可用于多类分类。
-
加权 “weighted”:计算每个类别的指标,每类的权重与该类样本数目有关,可处理不同类别样本数目不均衡问题。
12、Scikit-Learn中的Scoring参数
以下是Scikit-Learn中用于模型评估的Scoring参数及其对应的函数和说明:
Scoring Classification | Function | Comment |
---|---|---|
accuracy | metrics.accuracy_score | 准确率 |
average_precision | metrics.average_precision_score | 平均精度 |
f1 | metrics.f1_score | 适用于二分类目标 |
f1_micro | metrics.f1_score | 微观平均 |
f1_macro | metrics.f1_score | 宏观平均 |
f1_weighted | metrics.f1_score | 加权平均 |
f1_samples | metrics.f1_score | 按多标签样本计算 |
neg_log_loss | metrics.log_loss | 需要predict_proba支持 |
precision 等 | metrics.precision_score | 后缀与f1 相同适用 |
recall 等 | metrics.recall_score | 后缀与f1 相同适用 |
roc_auc | metrics.roc_auc_score | 接收者操作特性曲线下面积 |
注意:scoring值越大的模型性能越好,所以如果采用损失/误差,需要加
neg
,如neg_log_loss
。