Scikit-learn的混淆矩阵
介绍
在我最近的一个项目中,事务监控系统生成了大量误报警报(然后由调查小组手动调查这些警报)。我们被要求使用机器学习来自动关闭那些错误警报。机器学习模型的评估标准是一个度量负预测值(Negative Predicted Value),表示在模型的总负预测中,有多少个案例是正确识别的。
NPV = True Negative / (True Negative + False Negative)
我会快速显示混淆矩阵,下面是jupyter笔记本的输出。在二分类模型中,target=1是欺诈交易,target=0是非欺诈交易。
cm = confusion_matrix(y_test_actual, y_test_pred)print(cm)----- Output -----[[230, 33] [24, 74]
根据解释混淆矩阵的不同方式,你会得到90%或76%的NPV。因为:
TN = cm[0][0] 或者 cm[1][1] 也就是 230 或者 74
FN = cm[1][0] 也就是 24
维基百科表示
我参考了维基百科中的混淆矩阵表示法。
这张来自维基百科的图片显示,预测的标签位于水平面,而实际的标签位于垂直面。这意味着:
TN = cm[1][1] ie. 76
FN = cm[1][0] ie. 24
NPV=76%
Sklearn表示法
Scikit-learn文档说Wikipedia和其他参考文献可能对axes使用不同的约定:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html#sklearn.metrics.confusion_matrix
他们认为维基百科和其他参考文献可能会使用不同的坐标轴惯例。
我们已经看到,如果对轴使用错误的约定,度量可能会偏的非常厉害。
如果你通读文档,会发现这个示例:
tn, fp, fn, tp = confusion_matrix([0, 1, 0, 1], [1, 1, 1, 0]).ravel()
这里,他们将矩阵输出展平。在我们的例子中,这意味着:
TN = cm[0][0] ie. 230
FN = cm[1][0] ie. 24
NPV = 90%
理解混淆矩阵的结构
清楚地理解混淆矩阵的结构是非常重要的。尽管你可以直接使用公式计算大多数标准指标,如准确度、精确度、召回率等。许多时候,你需要计算诸如NPV、假正例率、假反例率等指标,这些指标在现成的软件包中是不可用的。
现在,如果我让你为混淆矩阵选择正确的选项,那就是混淆矩阵的输出。你会选哪一个?
你的答案是“A”是因为维基百科是这么说的,还是“C”是因为sklearn文档是这么说的?
让我们看看
考虑一下这些是你的y_true 和y_pred 值。
y_true = [0, 1, 0, 1, 0, 1, 0]y_pred = [1, 1, 1, 0, 1, 0, 1]
我们可以计算如下:
TP (True Positive) = 1
FP (False Positive) = 4
TN (True Negative) = 0
FN (False Negative) = 2
对于二分类的经典机器学习模型,主要是运行以下代码来获得混淆矩阵。
from sklearn.metrics import confusion_matrixconfusion_matrix(y_true, y_pred)
如果我们把它填回混淆矩阵,我们得到如下的混淆矩阵:
cm = confusion_matrix(y_true, y_pred)print (cm)--- Output ---[[0,4] [2,1]] which translates to this: predicted 0 1 ----- ----- 0| 0 | 4 actual ----- ----- 1| 2 | 1
TN (True Negative) = cm[0][0] = 0
FN (False Negative) = cm[1][0] = 2
TP (True Positive) = cm[1][1] = 1
FP (False Positive) = cm[0][1] = 4
但是,如果要添加一个简单的参数“labels”。
cm = confusion_matrix(y_true, y_pred, labels=[1,0])print (cm)--- Output ---[[1,2] [4,0]] which translates to this: predicted 1 0 ----- ----- 1| 1 | 2 actual ----- ----- 0| 4 | 0
TP (True Positive) = cm[0][0] = 1
FP (False Positive) = cm[1][0] = 4
TN (True Negative) = cm[1][1] = 0
FN (False Negative) = cm[0][1] = 2
结论:
下面是sklearn的混淆矩阵的默认输出的正确表示。水平轴上的真实标签和垂直轴上的预测标签。
1.默认输出:
# 1.默认输出confusion_matrix(y_true, y_pred)
2.通过添加labels参数,可以获得以下输出:
# 2. 使用labels参数confusion_matrix(y_true, y_pred, labels=[1,0])
Github链接:https://github.com/samarth-agrawal-86/data_scientist_toolkit