来自概率的混淆矩阵

Posted

技术标签:

【中文标题】来自概率的混淆矩阵【英文标题】:Confusion matrix from probabilities 【发布时间】:2018-04-26 03:37:33 【问题描述】:

我有以下 scikit-learn 机器学习管道:

cv = StratifiedKFold(n_splits=6)
classifier = svm.SVC(kernel='linear', probability=True,
                     random_state=random_state)

tprs = []
aucs = []
mean_fpr = np.linspace(0, 1, 100)

i = 0
for train, test in cv.split(X, y):
    probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test])
    # Compute ROC curve and area the curve
    fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])
    tprs.append(interp(mean_fpr, fpr, tpr))
    tprs[-1][0] = 0.0
    roc_auc = auc(fpr, tpr)
    aucs.append(roc_auc)
    i += 1

现在我还想计算(并绘制)混淆矩阵。上面的代码如何做到这一点?我只得到概率(我需要计算 AUC)。我有 4 节课 (1...4)。

【问题讨论】:

那么你有预测标签和原始标签的概率,那么为什么不继续使用sklearn.confusion_matrix呢? 为什么不直接使用 predict(X[test]) 作为混淆矩阵。 @VivekKumar 如果我还使用随机搜索进行超参数优化,那么同时使用 predict_proba 和 predict 会导致计算开销,因为随机搜索使用交叉验证。所以我会随机搜索 predict_proba 和 predict。 【参考方案1】:

您可以在此处使用此示例来绘制混淆矩阵:

http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html#sphx-glr-auto-examples-model-selection-plot-confusion-matrix-py

但是为此,您需要有离散的类值(不是概率)。这可以很容易地从您的 probas_ 变量中导出:

y_pred = np.argmax(probas_, axis=1)

现在你可以在混淆矩阵中使用这个 y_pred

【讨论】:

非常感谢。但是我想在 for 循环之后计算混淆矩阵,即在所有数据点(不是子集)上。我怎样才能跟踪它?我的意思是在每次循环迭代中我都有测试的预测,我必须以某种方式将它存储在与 y 匹配的正确位置的变量 y_total 中,以便我可以在最后调用混淆矩阵(y_total,y)。 @machinery 那么你会在循环之后再次计算所有数据点的 predict_probas 吗? 不,我不会再计算了。在循环中,我计算所有数据点的概率。问题是我有数组 y 并且在每次循环迭代中我只计算 y_pred 的一部分。所以我必须将数组拼接在一起才能得到最终的预测。 @machinery 但是你明白最终的数组不是统一预测,而是依赖于不同部分的训练数据 是的,否则我应该怎么做?我无法在循环中平均混淆矩阵。此外,

以上是关于来自概率的混淆矩阵的主要内容,如果未能解决你的问题,请参考以下文章

来自 rpart 的混淆矩阵

Python hmmlearn中的混淆矩阵是怎么表示的

如何标准化混淆矩阵?

不正确的混淆矩阵图

混淆矩阵和列联表有啥区别?

R语言glm拟合logistic回归模型:模型评估(模型预测概率的分组密度图混淆矩阵准确率精确度召回率ROCAUC)PRTPlot函数获取logistic模型最优阈值(改变阈值以优化)