我们模型应该从对角线上看
我们举一个例子,帮助理解混淆矩阵,在真实标签中,如果我们生病了,我们就是1,如果我们没生病就是0
TP:我们真的病了,然而模型也预测出来我们生病了(俩都是真病了)
FN:我们真的病了,然后模型却没有预测出来我们生病了(真病,模没病)
FP:我们没有生病,然后模型却预测出来我们生病了(真没病,模有病)
TN:我们没有生病,然后模型也没有预测出来我们生病(俩都没病)
1.混淆矩阵的行代表的是实际的类别,列代表预测的类别,里面的数值代表的是所有的实例预测准确和不准确出现次数的总和。
所以模型预测错误就有两种情况:假负和假正。对于不同的场景,我们对模型的要求也不同。
- 对于诊断疾病的模型,**假负(把病人诊断为健康,会错过最佳治疗时间)**比假正情况更严重,所以该模型应该更倾向于找出所有为positive的样本(患病的就诊者);
- 对于垃圾邮件检测模型,**假正(把正常邮件检测为垃圾邮件,会错过重要邮件)**比假负情况更严重,所以该模型应该更倾向于选出所有为negative的样本(正常邮件)。
须知
1.一个完美的分类器只有真正类和真负类,所以它的混淆矩阵只有对象线上面有值,其他的为0(也就是其他的两类上面全是0)
2.咱们学习混淆矩阵的目的是用来**"评估分类器"性能如何的**
2.根据混淆矩阵推出来的比较好的指标
- 精度
- 召回率
- 精度与召回率权衡
- ROC曲线
1.精度
1.是什么
正类预测的准确率,也称为分类器的精度,说白了就是**“我们预测结果为正类(包括真正类和假正类),预测结果为正类中真实结果也为正类(真正类)的占比”**
2.公式
精度 = T P / ( T P + F P ) 精度 = TP / (TP + FP) 精度=TP/(TP+FP)
TP:是真正类的数量
FP:是假正类的数量
精度也是越大越好
3.注意
因为这个精度忽略了这个预测为正例的其他情况,单独谈论没啥意义,因此精度通常与另外一个指标一起使用,就是召回率
sklearn的precision_score:是精度
2.召回率
1.是什么
是分类器正确检测到真实正类实例的比例,也称为灵敏度或者真正类效率,说白点就是在真实样本实例的所有正例当中(假负类和真正类),预测也为正类(真正类)的占比
2.公式
召回率 = T P / ( F N + T P ) 召回率 = TP / (FN+TP) 召回率=TP/(FN+TP)
FN:假负类的数量
TP:真正类的数量
召回率是越大越好
3.注意
在sklearn中recall_是召回率
3.精度与召回率的讨论
1.须知
我们单看精度或者单看召回率时他们都是单一的指标,比较麻烦,因此我们可以将他们合并成一个指标:F1分数
2.F1分数
1.是什么
F1分数是精度和召回率的谐波平均值,正常的平均值平等对待所有的值,而谐波平均值会给与更高的权重,因此只有当召回率和精度都很高时,分类器才可以得到较高的F1分数
2.公式
F 1 = T P / ( T P + ( F N + F P ) / 2 ) F1 = TP / ( TP + (FN+FP)/2 ) F1=TP/(TP+(FN+FP)/2)
F1分数越大越好
3.使用场景
F1分数对于具有相近的精度和召回率的分类器更为有利,但这也不一定更符合你的期望:在某些情况下我们更关心的是精度,另外一些情况下你更关心的是召回率
我们可以使用sklearn的f1_score求得
我们一般情况下并不是直接使用f1,召回率,精度的,而是精度和召回率权衡使用的比较多
4.精度与召回率权衡
-
很遗憾的是,我们并不能同时增加精度又减少召回率,反之亦然,这称为精度/召回率权衡
-
实现的原理:就是在精度和召回率之间设置一个阈值,如果提高这个阈值精度和召回率的变化如何,如果降低这个阈值精度和召回率如何,这个阈值可以理解为是一个在数据集上面已经预测过的决策分数阈值
-
目的:就是选择出一个合适的阈值,可以让咱们的精度和召回率尽可能的符合咱们的需要
-
我们有两种方式来查找精度与召回率的权衡
-
绘制所有可能的阈值对应的精度和召回率
我们会是使用sklearn实现,步骤如下
- 先使用cross_val_predict()获取训练集中所有实例的分数,但这次返回的是决策分数而不是预测结果
- 有了这些分数以后,使用precision_recall_curve()函数计算所有可能的阈值所对应的精度和召回率
- 最后使用mattplotlib绘制精度和召回率相对于阈值的函数图
-
直接绘制精度和召回率的函数图
-
5.ROC曲线
1.是什么
这是一种经常和二元分类器一起使用的工具,叫做受试者工作特征曲线(简称ROC)
它与精度/召回率曲线非常像,但绘制的并不是精度和召回率,而是真正类(召回率TPR)与假正类率(FPR)
假正类率
=
F
P
(
假正类
)
/
(
F
P
(假正类)
+
T
N
(
真负类
)
)
假正类率 = FP(假正类) / (FP(假正类) + TN(真负类) )
假正类率=FP(假正类)/(FP(假正类)+TN(真负类))
特异度 = T N (真负类) / ( F P (假正类) + T N ( 真负类 ) ) 特异度 = TN(真负类)/ (FP(假正类) + TN(真负类) ) 特异度=TN(真负类)/(FP(假正类)+TN(真负类))
假正类率 = 1 − 特异度 假正类率 = 1 - 特异度 假正类率=1−特异度
2.结论
- 绘制的图像纵坐标是召回率,横坐标是假正类率
- 一个完美的分类器,对应的ROC曲线,会非常的接近左上角
- 召回率越高,分类器产生的假正类就越多,图中的虚线表示纯种随机分类器的ROC曲线
3.绘制ROC曲线步骤
- 我们会先还使用sklearn的roc_cure()计算多种阈值的TPR和FPR
- 然后使用matplotlib绘制FPR对TPR的曲线
6.AUC曲线
1.是什么
其实也是一种评估分类器好坏的方式
2.如何计算
其实就是上面求得ROC曲线下面的面积
3.结论
- 完美分类器的ROC,AUC等于1,而纯随机的分类器的ROC,AUC等于0,5,
- sklearn提供了计算auc的函数roc_auc_score
总结
对于“ROC曲线”和“精度/召回率曲线”他们两者我们应该如何选择?
1.如果正类非常的少见或者你更关注假正类,而不是假负类时,你应该选择“精度/召回率曲线”
2.反之你应该选择“ROC曲线”