准确度陷阱和混淆矩阵(confusion matrix)

对于有偏的数据(skewed data)二分类时使用的度量指标:

对于二分类问题,很难用准确度来度量算法的好坏,比如有一个算法,用10000个人的体检样本来预测得癌症的准确率是99.99%, 如果在这个算法中把所有的人都默认预测为不会得癌症(0), 也完全符合前面99.99%的要求,因为样本中本身得癌症的样本就很少。 所以用准确度 (accuracy_score) 无法区分这个算法性能到底是怎么样的。 所以引入了混淆矩阵, 精准度, 召回率和 ROC曲线等来度量二分法性能的优略.

混淆矩阵

矩阵每一行代表样本的真实结果,每一列代表样本的预测结果,每一行列都是从 0(预测为阴 Negative) 开始, 再是 1(预测为阳 positive):

在矩阵中,每一个格子用两个字符来表示其含义,第二个字符表示预测的结果,第一个字符表示预测结果和真实结果相比是真还是假。

真实值 | 预测值01
0TN(True Negative)FP (False Positive)
1FN(False Negative)TP (True Positive)

精准率 - Precision score

$$ Precision\ score = \frac {TP} {TP + FP} $$

召回率 - Recall score

$$ Recall\ score = \frac {TP} {TP + FN} $$

$F_1\ Score$ - Balanced F score

精准率和召回率的调和平均值,如果一个值特别低,得到的值也将特别低, 只有 2 者都高的时候才会特别高.

$$ \frac 1 {F_1} = \frac 1 2 (\frac 1 {precision} + \frac 1 {recall}) $$

$$ F_1\ Score = \frac {2} {\frac 1 {精度} + \frac 1 {召回率} } = \frac {TP} {TP + \frac {FN + FP} 2} $$

不同的应用场景,关注的二分类指标是不一样的,比如股票预测注重精准率,不关注召回率。 医疗领域的病人诊断中我们注重召回率,不想漏掉任何患病的人群,但是精准率就不那么重要了。

同时关注精准率和召回率 $F_1\ score$

sklearn 中的实现

from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import confusion_metrix
from sklearn.metrics import f1_score
confusion_metrix(y_test, y_predict)
array([[403,   2],
       [  9,  36]], dtype=int64)