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

(0)

相关推荐