混淆矩阵
1 混淆矩阵
混淆矩阵是一种用于评估分类模型性能的重要工具。它通过矩阵形式清晰地展示了模型对样本进行分类的结果,帮助我们理解模型在不同类别上的表现。
———— | 预测为正类 | 预测为负类 |
---|---|---|
实际为正类 | True Positive (TP) | False Negative (FN) |
实际为负类 | False Positive (FP) | True Negative (TN) |
- True Positive (TP): 模型将实际为正类别的样本正确预测为正类别。
- False Negative (FN): 模型将实际为正类别的样本错误预测为负类别。
- False Positive (FP): 模型将实际为负类别的样本错误预测为正类别。
- True Negative (TN): 模型将实际为负类别的样本正确预测为负类别。
通过上述指标,可以计算出一系列性能指标,例如准确率、精确率、召回率和F1分数。这些指标帮助我们量化模型的分类准确性、可靠性和全面性。
- 注意:混淆矩阵的目的是帮助理解分类模型在不同类别上的表现,即只要是分类模型,可以考虑利用混淆矩阵,例如医学领域中,判断病人是否有某种疾病
2 混淆矩阵指标
2.1 准确率
准确率表示模型正确分类的样本占总样本数的比例,计算方式为:
准确率(
A
c
c
u
r
a
c
y
)
=
T
P
+
T
N
T
P
+
T
N
+
F
P
+
F
N
准确率(Accuracy)=\frac{TP+TN}{TP+TN+FP+FN}
准确率(Accuracy)=TP+TN+FP+FNTP+TN
如下图所示:
准确率可以判断总的正确率,但有如下缺点:
- 在样本不平衡的情况下,并不能作为很好的指标来衡量结果。例如在一个样本中,正样本占99%,负样本占1%,样本是严重不平衡的,无论什么算法,只需要将全部样本预测为正样本即可有99%的准确率,这体现不出算法的性能
2.2 精确率
精确率又叫查准率。精确率表示所有被预测为正的样本中实际为正的样本的概率,它是针对预测结果而言的,计算方式为:
精确率(
P
r
e
c
i
s
i
o
n
)
=
T
P
T
P
+
F
P
精确率(Precision)=\frac{TP}{TP+FP}
精确率(Precision)=TP+FPTP
如下图所示:
准确率和精确率的区别如下:
- 精准率代表对预测的正样本结果中的预测准确程度
- 准确率则代表整体的预测准确程度
2.3 召回率
召回率,也称为 True Positive Rate (TPR) 或灵敏度或查全率,它表示在实际为正的样本中被正确预测为正样本的概率,它是针对原样本而言的,计算公式如下:
召回率(
T
P
R
)
=
T
P
T
P
+
F
N
召回率(TPR)=\frac{TP}{TP+FN}
召回率(TPR)=TP+FNTP
如下图所示:
召回率的应用场景:例如银行贷款等,将无信用的用户设定为正样本,这就需要保证召回率要足够高。如果召回率过低,就会把无信用用户预测为有信用用户,这样会造成严重损失。
2.4 特异度
特异度,也称为 True Negative Rate (TNR),它表示在实际为负的样本中被正确预测为负样本的概率,它是针对原样本而言的,计算公式如下:
特异度(
T
N
R
)
=
T
N
T
N
+
F
P
特异度(TNR)=\frac{TN}{TN+FP}
特异度(TNR)=TN+FPTN
如下图所示:
特异度的应用场景:例如银行贷款等,将无信用的用户设定为负样本,这就需要保证召回率要足够高。如果召回率过低,就会把无信用用户预测为有信用用户,这样会造成严重损失。
2.4 假正率
假正率,也称为False Positive Rate (FPR) ,它表示在实际为负的样本中被错误预测为正样本的概率,它是针对原样本而言的,计算公式如下:
假正率(
F
P
R
)
=
F
P
F
P
+
T
N
假正率(FPR)=\frac{FP}{FP+TN}
假正率(FPR)=FP+TNFP
如下图所示:
2.5 假负率
假负率,也称为False Negative Rate (FNR) ,它表示在实际为正的样本中被错误预测为负样本的概率,它是针对原样本而言的,计算公式如下:
假负率(
F
N
R
)
=
F
N
T
P
+
F
N
假负率(FNR)=\frac{FN}{TP+FN}
假负率(FNR)=TP+FNFN
如下图所示:
2.6 F1 分数
F1 分数是精确率和召回率的调和平均数,它综合了两者的性能,计算方式为:
F
1
=
2
×
精确率
×
召回率
精确率
+
召回率
F1=\frac{2×精确率×召回率}{精确率+召回率}
F1=精确率+召回率2×精确率×召回率
F1的特点如下:
- F1 分数的取值范围是 [0, 1],越接近 1 表示模型的性能越好,同时考虑到了模型在精确率和召回率之间的平衡。
- F1 分数非常适合二分类问题
- F1 分数越高则越意味着模型在查准率和查全率之间取得了良好的平衡
2.7 ROC曲线
2.7.1 roc曲线基本概念
ROC(Receiver Operating Characteristic)曲线,又称接受者操作特征曲线。人们将其用于评价模型的预测能力,ROC曲线是基于混淆矩阵得出的。
- ROC曲线横坐标是假正率(False Positive Rate),纵坐标是真正率(即召回率,True Positive Rate)
ROC的特点的特点如下:
1.一个阈值水平对应ROC曲线的一个点(非常重要,与如何画ROC曲线有关)
2. ROC曲线不光滑
3. 当分类预测模型的输出概率p∈(0,1)时,ROC曲线过点(0,0)和(1,1)
4. ROC曲线单调不减
2.7.2 roc曲线绘制过程
1 详细过程
基于一个阈值水平对应ROC曲线的一个点,先给出绘制过程
假设有如下的样本,记录了其实际类别以及分类器预测为正的概率:
样本 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
实际类别 | 正 | 负 | 正 | 正 | 负 |
预测概率 | 0.9 | 0.5 | 0.8 | 0.6 | 0.4 |
根据上述信息,对概率进行去重和排序,可得列表:
[
0.9
,
0.8
,
0.6
,
0.5
,
0.4
]
[0.9,0.8,0.6,0.5,0.4]
[0.9,0.8,0.6,0.5,0.4]
在上述的列表首位和末位分别加1和0,可得阈值顺序:
[
1
,
0.9
,
0.8
,
0.6
,
0.5
,
0.4
,
0
]
[1,0.9,0.8,0.6,0.5,0.4,0]
[1,0.9,0.8,0.6,0.5,0.4,0]
- 该阈值的含义为:当低于该阈值时,一致认为为负类
当阈值为1时的情况
其样本预测为:
样本 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
实际类别 | 正 | 负 | 正 | 正 | 负 |
预测概率 | 0.9 | 0.5 | 0.8 | 0.6 | 0.4 |
预测 | 负 | 负 | 负 | 负 | 负 |
此时混淆矩阵为:
———— | 预测为正类 | 预测为负类 |
---|---|---|
实际为正类 | 0 | 3 |
实际为负类 | 0 | 2 |
横坐标假正率为:
假正率(
F
P
R
)
=
F
P
F
P
+
T
N
=
0
0
+
2
=
0
假正率(FPR)=\frac{FP}{FP+TN}=\frac{0}{0+2}=0
假正率(FPR)=FP+TNFP=0+20=0
纵坐标真正率为:
真正率(
T
P
R
)
=
T
P
T
P
+
F
N
=
0
0
+
3
=
0
真正率(TPR)=\frac{TP}{TP+FN}=\frac{0}{0+3}=0
真正率(TPR)=TP+FNTP=0+30=0
重新上述过程,直到分析完列表中所有的阈值,最终可得:
阈值 | 假正率(FPR) | 真正率(TPR) |
---|---|---|
1 | 0 | 0 |
0.9 | 0 | 1 3 \frac{1}{3} 31 |
0.8 | 0 | 2 3 \frac{2}{3} 32 |
0.6 | 0 | 1 |
0.5 | 0.5 | 1 |
0.4 | 1 | 1 |
0 | 1 | 1 |
最终可以画出ROC曲线图,如下:
)
代码实现如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import metrics
# 样本数据
y_true = np.array([1, 0, 1, 1, 0]) # 实际类别
y_score = np.array([0.9, 0.5, 0.8, 0.6, 0.4]) # 预测概率
# 计算假正率(FPR)和真正率(TPR)
fpr, tpr, thresholds = metrics.roc_curve(y_true, y_score, pos_label=1)
# 计算AUC
roc_auc = metrics.auc(fpr, tpr)
# 画ROC曲线
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange', lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--', label=f'Chance (area = 0.50)', alpha=0.5) # 添加标签和alpha参数
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()
2 为什么ROC曲线单调不减
先看混淆矩阵
———— | 预测为正类 | 预测为负类 |
---|---|---|
实际为正类 | True Positive (TP) | False Negative (FN) |
实际为负类 | False Positive (FP) | True Negative (TN) |
根据假正率和真正率的公式:
假正率(
F
P
R
)
=
F
P
F
P
+
T
N
,真正率(
T
P
R
)
=
T
P
T
P
+
F
N
假正率(FPR)=\frac{FP}{FP+TN},真正率(TPR)=\frac{TP}{TP+FN}
假正率(FPR)=FP+TNFP,真正率(TPR)=TP+FNTP
判断分母
由混淆矩阵可知:FP+TN和TP+FN是不变的
判断分子
根据上述例子所得到的数据,如下:
阈值 | 假正率(FPR) | 真正率(TPR) |
---|---|---|
1 | 0 | 0 |
0.9 | 0 | 1 3 \frac{1}{3} 31 |
0.8 | 0 | 2 3 \frac{2}{3} 32 |
0.6 | 0 | 1 |
0.5 | 0.5 | 1 |
0.4 | 1 | 1 |
0 | 1 | 1 |
当阈值不断下降时,预测为正的样本数必然不断上升(结合上述数据理解),即TP+FP递增,因此可推断出
T
P
递增或者
F
P
递增,即
T
P
i
+
1
≥
T
P
i
,
F
P
i
+
1
≥
F
P
i
TP递增或者FP递增,即TP_{i+1}≥TP_{i},FP_{i+1}≥FP_{i}
TP递增或者FP递增,即TPi+1≥TPi,FPi+1≥FPi
- 注意:TP和FP是不可能减少的,当阈值减少时,之前预测为正类的样品,仍然将被预测为正类
根据分子分母结论分析
综上所述,可得:
F
P
R
i
=
F
P
i
F
P
i
+
T
N
i
≥
F
P
R
i
+
1
=
F
P
i
+
1
F
P
i
+
1
+
T
N
i
+
1
FPR_{i}=\frac{FP_{i}}{FP_{i}+TN_{i}}≥FPR_{i+1}=\frac{FP_{i+1}}{FP_{i+1}+TN_{i+1}}
FPRi=FPi+TNiFPi≥FPRi+1=FPi+1+TNi+1FPi+1
T
P
R
i
=
T
P
i
T
P
i
+
F
N
i
≥
T
P
R
i
+
1
=
T
P
i
+
1
T
P
i
+
1
+
F
N
i
+
1
TPR_{i}=\frac{TP_{i}}{TP_{i}+FN_{i}}≥TPR_{i+1}=\frac{TP_{i+1}}{TP_{i+1}+FN_{i+1}}
TPRi=TPi+FNiTPi≥TPRi+1=TPi+1+FNi+1TPi+1
2.7.3 AUC的意义
(1)统计意义
其统计意义为:从样本中任取一个(正,负)样本对,分类器对前者的输出概率大于后者的可能性
考虑有如下样本
样本 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
实际类别 | 正 | 负 | 正 | 正 | 负 |
预测概率 | 0.9 | 0.5 | 0.8 | 0.5 | 0.4 |
正样本有3个,负样本有2个,所以可能的正负样本对总共有3×2六种可能情况
使用下述计数规则:
I
(
p
正样本
,
p
负样本
)
=
{
1
p
正样本
>
p
负样本
0.5
p
正样本
=
p
负样本
0
p
正样本
<
p
负样本
I(p_{正样本},p_{负样本})=\left\{\begin{matrix} 1 & p_{正样本}>p_{负样本}\\ 0.5& p_{正样本}=p_{负样本} \\ 0& p_{正样本}<p_{负样本} \end{matrix}\right.
I(p正样本,p负样本)=⎩
⎨
⎧10.50p正样本>p负样本p正样本=p负样本p正样本<p负样本
则对六种情况进行计数,可得:
正样本 | 负样本 | 计数 |
---|---|---|
0 | 1 | 1 |
2 | 1 | 1 |
3 | 1 | 0.5 |
0 | 4 | 1 |
2 | 4 | 1 |
3 | 4 | 1 |
所以有
A
U
C
=
1
+
1
+
0.5
+
1
+
1
+
1
6
=
0.917
AUC=\frac{1+1+0.5+1+1+1}{6}=0.917
AUC=61+1+0.5+1+1+1=0.917
(2)几何意义
几何意义:ROC曲线下的面积(以后再补充证明)
刚刚代码实现的图,如下图所示,ROC橙色曲线下的面积就是正方形,面积为1,所以AUC=1
(3)AUC评判标准
其对分类器优劣的标准如下:
- AUC = 1,是完美分类器。
- AUC = [0.85, 0.95], 效果很好
- AUC = [0.7, 0.85], 效果一般
- AUC = [0.5, 0.7],效果较低,但用于预测股票已经很不错了
- AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
- AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
例子1:AUC=1
根据AUC定义,当AUC=1,对于任意一个正负样本对,分类器倾向于将正样本分类为正样本,即完全分对
例子2:AUC<0.5
根据AUC定义,当AUC<0.5,对于任意一个正负样本对,分类器倾向于将正样本分类为负样本(例如预测概率p正=0.3,p负=0.9),即反预测
3 总结
混淆矩阵的主要性能指标,作如下总结:
- 准确率:模型正确分类的样本占总样本数的比例,准确率衡量了模型在所有样本上的整体表现
- 精确率:模型预测为正类别的样本中实际是正类别的概率,精确率衡量了模型在预测为正类别的样本上的准确性
- 召回率:实际为正类别的样本中,正确预测为正样本的概率,召回度衡量了在实际为正样本中正确预测为正样本的预测概率
- F1分数:精确率和召回率的调和平均数,F1分数衡量了精确率和召回率之间的平衡
混淆矩阵和上述性能指标共同提供了对分类模型性能全面的理解,并帮助评估模型的优缺点,进而进一步优化模型
参考如下: