来自概率的混淆矩阵
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 但是你明白最终的数组不是统一预测,而是依赖于不同部分的训练数据 是的,否则我应该怎么做?我无法在循环中平均混淆矩阵。此外,以上是关于来自概率的混淆矩阵的主要内容,如果未能解决你的问题,请参考以下文章
R语言glm拟合logistic回归模型:模型评估(模型预测概率的分组密度图混淆矩阵准确率精确度召回率ROCAUC)PRTPlot函数获取logistic模型最优阈值(改变阈值以优化)