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