1、分类器性能评估:
如果仅仅使用总体准确率,存在什么问题?
(a)准确率在类别不平衡时没有意义:若数据集中某个类别的样本数量远多于其他类别,分类器会倾向于预测这个多数类,从而导致准确率虚高。
(b)准确率不能反映分类器在不同类别上的具体表现,比如在结果是猫的图片中,真正是猫的比例有多少。
对于两类分类问题,如果某个方法的 ROC 曲线与从原点到(1,1)的对角线重合,则这个方法没有预测能力,等同于随机猜测,为什么?
ROC 曲线是通过绘制不同阈值下的真正率和假正率来评估分类器的性能。如果 ROC 曲线与对角线重合,那么对任何给定的阈值,真正率和假正率均相等,说明分类器不能有效地区分正类和负类,模型预测结果与随机猜测没有区别,没有预测能力。
混淆矩阵和 ROC 曲线总结
混淆矩阵:
| 预测为正类 P | 预测为负类 N | |
|---|---|---|
| 实际正类 T | TP | FN |
| 实际负类 F | FP | TN |
准确率:Accuracy=TP+TNTP+TN+FP+FNAccuracy = \frac{TP + TN}{TP + TN + FP + FN}Accuracy=TP+TN+FP+FNTP+TN
精确率(查准率):Precision=TPTP+FPPrecision = \frac{TP}{TP + FP}Precision=TP+FPTP
召回率(查全率):Recall=TPTP+FNRecall = \frac{TP}{TP + FN}Recall=TP+FNTP
精确率和召回率是一对互相矛盾的指标,使用 F 值平衡二者的重要性:
最常用的是 F1分数,它是两者的调和平均数,公式为:
F1=2⋅Precision⋅RecallPrecision+Recall
F_1 = \frac{2 \cdot \text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}
F1=Precision+Recall2⋅Precision⋅Recall
其中:
- Precision(精确率) = $\frac{TP}{TP + FP}
- Recall(召回率) = TPTP+FN\frac{TP}{TP + FN}TP+FNTP
广义的FβF_\betaFβ为:
Fβ=(1+β2)⋅Precision⋅Recallβ2⋅Precision+Recall
F_\beta = \frac{(1 + \beta^2) \cdot \text{Precision} \cdot \text{Recall}}{\beta^2 \cdot \text{Precision} + \text{Recall}}
Fβ=β2⋅Precision+Recall(1+β2)⋅Precision⋅Recall
- 当 β=1\beta = 1β=1 时,退化为 F1分数;
- 当 β>1\beta > 1β>1 时,召回率更重要(如 β=2\beta=2β=2);
- 当 β<1\beta < 1β<1 时,精确率更重要(如 $beta=0.5$)。
ROC曲线:

真正率(True Positive Rate,TPR):TPR=TPPTPR = \frac{TP}{P}TPR=PTP
假正率(False Positive Rate,FPR):FPR=FPNFPR = \frac{FP}{N}FPR=NFP
线下面积(AUC):ROC 曲线下的面积大小。AUC 值越高,表明模型性能越好。
2、神经网络如何解决分类问题
对于一个分类问题,训练集中包含NNN 个样本,其中标签表示为$ C $ 维的 one-hot 向量形式。构造一个$ L $ 层的前馈神经网络来实现分类,其中最后一层采用 softmax 回归器:
p(y=c|x)=softmax(wc⊤x)=exp(wc⊤x)∑c′=1Cexp(wc′⊤x)
p\left(y=c\middle| x\right)=\mathrm{softmax}\left(w_c^\top x\right)=\frac{\exp{\left(w_c^\top x\right)}}{\sum_{c^\prime=1}^{C}\exp{\left(w_{c^\prime}^\top x\right)}}
p(y=c∣x)=softmax(wc⊤x)=∑c′=1Cexp(wc′⊤x)exp(wc⊤x)
参数表示为矩阵 $ \mathbf{W} $,其中每个元素用来计算样本 $ \mathbf{x} $ 属于第 $ c $ 类的条件概率,则样本的类别概率向量为:
y^(n)=softmax(WLTx(n)) {\hat{\mathcal{y}}}^{\left(n\right)}=\mathrm{softmax}\left({\mathcal{W}_L}^T\mathcal{x}^{\left(n\right)}\right) y^(n)=softmax(WLTx(n))
假设采用交叉熵损失函数。
分类问题的经验风险函数
经验风险函数是基于训练集的平均损失函数,交叉熵损失函数定义为:
l(n)=−∑c=1Cyc(n)logy^c(n)l^{(n)}=-\sum_{c=1}^{C}{y_c^{(n)}log{\hat{y}}_c^{(n)}}l(n)=−c=1∑Cyc(n)logy^c(n)
其中yc(n)y_c^{(n)}yc(n)为标签的 one-hot 编码。y^c(n){\hat{y}}_c^{(n)}y^c(n)为函数输出的类别概率向量:
y^c(n)=softmax(WLTx(n))=exp(wcTx(n))∑c′=1Cexp(wc′Tx(n)){\hat{y}}_c^{(n)}=\mathcal{softmax}\left({\mathcal{W}_L}^T\mathcal{x}^{\left(n\right)}\right)=\frac{\exp{\left(w_c^Tx^{(n)}\right)}}{\sum_{c^\prime=1}^{C}\exp{\left(w_{c^\prime}^Tx^{(n)}\right)}}y^c(n)=softmax(WLTx(n))=∑c′=1Cexp(wc′Tx(n))exp(wcTx(n))
经验风险函数为平均交叉熵损失:
R(WL)=1n∑i=1nl(n)
R\left(\mathcal{W}_L\right)=\frac{1}{n}\sum_{i=1}^{n}l^{(n)}
R(WL)=n1i=1∑nl(n)
将 y^c(n){\hat{y}}_c^{(n)}y^c(n) 带入到交叉熵损失中得到经验风险函数:
R(WL)=1n∑i=1n∑c=1Cyc(n)log(exp(wcTx(n))∑c′=1Cexp(wc′Tx(n))) R\left(\mathcal{W}_L\right)=\frac{1}{n}\sum_{i=1}^{n}\sum_{c=1}^{C}{y_c^{(n)}\log(\frac{\exp{\left(w_c^Tx^{(n)}\right)}}{\sum_{c^\prime=1}^{C}\exp{\left(w_{c^\prime}^Tx^{(n)}\right)}})} R(WL)=n1i=1∑nc=1∑Cyc(n)log(∑c′=1Cexp(wc′Tx(n))exp(wcTx(n)))
分类问题的最后一层误差项
根据误差项的定义:误差项是损失函数相对于最后一层 Softmax 的输入的梯度:
δL(n)=∂l(n)∂zL\delta_L^{\left(n\right)}=\frac{\partial l^{(n)}}{\partial z_L}δL(n)=∂zL∂l(n)
对于误差项应用链式法则得到:
δL(n)=∂l(n)∂zL=∑c=1C∂l(n)∂y^c(n)∂y^c(n)∂zk\delta_L^{\left(n\right)}=\frac{\partial l^{(n)}}{\partial z_L}=\sum_{c=1}^{C}{\frac{\partial l^{(n)}}{\partial{\hat{y}}_c^{(n)}}\frac{\partial{\hat{y}}_c^{(n)}}{\partial z_k}}δL(n)=∂zL∂l(n)=c=1∑C∂y^c(n)∂l(n)∂zk∂y^c(n)
首先计算交叉熵函数对于第c个Softmax函数输出的类别概率向量的梯度∂l(n)∂y^c(n)\frac{\partial l^{(n)}}{\partial{\hat{y}}_c^{(n)}}∂y^c(n)∂l(n)
,由于 L=−∑c=1CyclogpcL = -\sum_{c=1}^{C} y_c \log p_cL=−∑c=1Cyclogpc,所以:
∂l(n)∂y^c(n)=−∑c=1C(yc(n)y^c(n)) \frac{\partial l^{(n)}}{\partial{\hat{y}}_c^{(n)}}=-\sum_{c=1}^{C}{(\frac{y_c^{\left(n\right)}}{{\hat{y}}_c^{\left(n\right)}})} ∂y^c(n)∂l(n)=−c=1∑C(y^c(n)yc(n))
接下来计算Softmax函数对于神经网络最后一层输入的梯度∂y^c(n)∂zk\frac{\partial{\hat{y}}_c^{\left(n\right)}}{\partial z_k}∂zk∂y^c(n),是Softmax第c个输出对第k个输入的偏导数,分两种情况:
- 当 c=kc =kc=k,当前输出对自身输入的导数,此时y^c(n){\hat{y}}_c^{(n)}y^c(n)直接依赖于zkz_kzk:
∂y^c(n)∂zk=exp(zc)∙∑k=1Cexp(zk)−exp(zc)∙exp(zc)(∑k=1Cexp(zk))2 \frac{\partial{\hat{y}}_c^{\left(n\right)}}{\partial z_k}=\frac{\exp{\left(z_c\right)}\bullet\sum_{k=1}^{C}\exp{\left(z_k\right)}-\exp{\left(z_c\right)}\bullet\exp{\left(z_c\right)}}{\left(\sum_{k=1}^{C}\exp{\left(z_k\right)}\right)^2} ∂zk∂y^c(n)=(∑k=1Cexp(zk))2exp(zc)∙∑k=1Cexp(zk)−exp(zc)∙exp(zc)
=exp(zc)∑k=1Cexp(zk)(∑c′=1Cexp(zk)−exp(zc)∑k=1Cexp(zk)) =\frac{\exp{\left(z_c\right)}}{\sum_{k=1}^{C}\exp{\left(z_k\right)}}(\frac{\sum_{c^\prime=1}^{C}\exp{\left(z_k\right)}-\exp{\left(z_c\right)}}{\sum_{k=1}^{C}\exp{\left(z_k\right)}}) =∑k=1Cexp(zk)exp(zc)(∑k=1Cexp(zk)∑c′=1Cexp(zk)−exp(zc))
=y^c(n)(1−y^k(n)) ={\hat{y}}_c^{\left(n\right)}(1-{\hat{y}}_k^{\left(n\right)}) =y^c(n)(1−y^k(n))
- 当 $ c \neq k,当前输出对其他输入的导数,此时,当前输出对其他输入的导数,此时,当前输出对其他输入的导数,此时{\hat{y}}_c^{(n)}仅通过分母的归一化项间接依赖仅通过分母的归一化项间接依赖仅通过分母的归一化项间接依赖z_k$:
∂y^c(n)∂zk=0∙∑k=1Cexp(zk)−exp(zc)∙exp(zk)(∑k=1Cexp(zk))2 \frac{\partial{\hat{y}}_c^{\left(n\right)}}{\partial z_k}=\frac{0\bullet\sum_{k=1}^{C}\exp{\left(z_k\right)}-\exp{\left(z_c\right)}\bullet\exp{\left(z_k\right)}}{\left(\sum_{k=1}^{C}\exp{\left(z_k\right)}\right)^2} ∂zk∂y^c(n)=(∑k=1Cexp(zk))20∙∑k=1Cexp(zk)−exp(zc)∙exp(zk)
=−y^c(n)y^k(n)
=-{\hat{y}}_c^{\left(n\right)}{\hat{y}}_k^{\left(n\right)}
=−y^c(n)y^k(n)
所以误差项为:
∂l(n)∂y^c(n)=−∑c=1C(yc(n)y^c(n))∙y^c(n)(δck−y^k(n))
\frac{\partial l^{\left(n\right)}}{\partial{\hat{y}}_c^{\left(n\right)}}=-\sum_{c=1}^{C}{\left(\frac{y_c^{\left(n\right)}}{{\hat{y}}_c^{\left(n\right)}}\right)\bullet{\hat{y}}_c^{\left(n\right)}\left(\delta_{ck}-{\hat{y}}_k^{\left(n\right)}\right)}
∂y^c(n)∂l(n)=−c=1∑C(y^c(n)yc(n))∙y^c(n)(δck−y^k(n))
=∑c=1Cyc(n)(y^k(n)−δck) =\sum_{c=1}^{C}{y_c^{\left(n\right)}\left({\hat{y}}_k^{\left(n\right)}-\delta_{ck}\right)} =c=1∑Cyc(n)(y^k(n)−δck)
=∑c=1Cyc(n)y^k(n)−∑c=1Cyc(n)δck =\sum_{c=1}^{C}{y_c^{\left(n\right)}{\hat{y}}_k^{\left(n\right)}}-\sum_{c=1}^{C}{y_c^{\left(n\right)}\delta_{ck}} =c=1∑Cyc(n)y^k(n)−c=1∑Cyc(n)δck
其中 δKronecker\delta_{Kronecker}δKronecker 是克罗内克函数,当 $c = k $ 时为 1,否则为 0。利用标签的 one-hot 性质:
∑c=1Cyc(n)=1, ∑c=1Cyc(n)δck=yk(n)\sum_{c=1}^{C}y_c^{\left(n\right)}=1,\ \ \ \ \ \sum_{c=1}^{C}{y_c^{\left(n\right)}\delta_{ck}}=y_k^{\left(n\right)}c=1∑Cyc(n)=1, c=1∑Cyc(n)δck=yk(n)
误差项化简为:
∂l(n)∂y^c(n)=y^k(n)−yk(n)\frac{\partial l^{\left(n\right)}}{\partial{\hat{y}}_c^{\left(n\right)}}={\hat{y}}_k^{\left(n\right)}-y_k^{\left(n\right)}∂y^c(n)∂l(n)=y^k(n)−yk(n)
对所有类别=1,2,...,C=1,2,...,C=1,2,...,C,梯度向量为
δL=y^(n)−y(n)
\delta_L={\hat{\mathbf{y}}}^{\left(n\right)}-\mathbf{y}^{\left(n\right)}
δL=y^(n)−y(n)
拓展到所有样本,δL\delta_LδL满足
δL=Y^−Y\delta_L=\hat{\mathbf{Y}}-\mathbf{Y}δL=Y^−Y
其中Y^\hat{\mathbf{Y}}Y^为预测的概率矩阵,Y\mathbf{Y}Y为标签矩阵。

被折叠的 条评论
为什么被折叠?



