我想了解为什么少数类("1")的精确召回曲线如此好,而对于同一个类的精度(0,2)和召回(0,4)的度量却如此糟糕。我将sklearn.metrics.plot_precision_recall_curve与pos_label=0 (多数类)和pos_label=1 (少数类)结合使用。下面您可以看到所使用的代码。
def plotagem_curvas (nome_modelo, modelo, X_test, y_test, folds, pos_label):
roc_auc = 0
ap=0
if (pos_label == 0):
classe='Not Stroke'
else:
classe='Stroke'
fig, axs = plt.subplots(1, 2, figsize=(12,4))
axs[0].set_title("Curva ROC - " + nome_modelo + " \"" + classe + "\"" , fontsize=10)
disp = metrics.plot_roc_curve(modelo, X_test, y_test, ax=axs[0], pos_label=pos_label)
roc_auc = disp.roc_auc
axs[1].set_title("Curva Precision Recall - " + nome_modelo + " \"" + classe + "\"", fontsize=10)
disp = metrics.plot_precision_recall_curve(modelo, X_test, y_test, ax=axs[1], pos_label=pos_label)
ap = disp.average_precision
return (roc_auc, ap)
# Random Forest - Precision_recall curve for both classes (0, 1)
roc_auc, ap = plotagem_curvas ("Random Forest", modelo, X_test, y_test, folds, 0)
roc_auc2, ap2 = plotagem_curvas ("Random Forest", modelo, X_test, y_test, folds, 1)以下是混淆矩阵:矩阵
曲线.:曲线
我不知道在调用函数"plot_precision_recall_curve“时是否犯了错误。
发布于 2021-07-01 13:49:34
记住,您的精确/召回曲线是为您的分类器的不同阈值绘制的(我假设您使用的是随机森林)。
精度/召回曲线
该曲线的计算方法是:“如果我将输入分类为‘笔画’--输出为0.1 (或更大)‘,那么我的精确/回忆是什么?如果我将输入分类为’笔画‘--输出为’笔画‘(或更高),而不是’笔画‘,那么精确/回忆是什么?如果我将分数改为0.3,0.4 ...,1”--这就是你得到的曲线。
混淆矩阵
您的混淆矩阵是基于单个阈值的,也就是说,如果我的模型的分数/输出大于0.5,您可能会说“我将所有对象归类为‘笔画’”(如果不更改,则通常是二进制情况下的标准阈值)。然后,根据单个阈值对测试集进行分类,并创建混淆矩阵。
因此,您的precision = 0.2,recall=0.4 (我猜)是基于阈值0.5,其中您的曲线是基于不同的阈值告诉您“是否有一个阈值,创造了一个良好的权衡,您的精确度和回忆?”
得到最优门限
您可以通过使用scikit学习曲线获得每个阈值的精度/召回值,为您的最佳精度/召回值选择阈值,然后创建您的混淆矩阵。
我假设,如果您使用它来检查您的模型,当阈值在0.5左右时,您会发现这些0.4和0.2值。
https://stackoverflow.com/questions/68211004
复制相似问题