了解精确召回曲线和 Precision/Recall 指标
Understanding Precision Recall Curve and Precision/Recall metrics
我想了解为什么少数 class ("1") 的准确率-召回率曲线如此好,而关于准确率 (0,2) 和召回率 (0,4) 的指标因为同样的 class 太糟糕了。
我将 sklearn.metrics.plot_precision_recall_curve 与 pos_label=0(多数 class)和 pos_label=1(少数 class)一起使用。
您可以在下面看到使用的代码。
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)
这是混淆矩阵:
Matrix
还有曲线……:
Curves
不知道是不是我调用函数“plot_precision_recall_curve”时出错了。
请记住,您的 precision/recall-curves 是针对分类器的不同阈值绘制的(我假设您使用的是随机森林)。
Precision/recall曲线
曲线是计算出来的; “如果我将模型输出为 0.1(或更大)的输入分类为 'stroke',我的 precision/recall 是什么?如果我将模型输出为 0.2(或更大)的输入分类为 'stroke',而不是 0.1,那么 precision/recall 是什么?如果我将分数更改为 0.3、0.4 ...,1",这就是您得到的曲线图。
混淆矩阵
您的混淆矩阵基于单个阈值,即您可能会说“如果我模型中的 score/output 为 0.5 或更大,我将所有对象分类为 'stroke'”(这通常是如果您不更改它,则标准阈值为二进制大小写)。然后根据 单个 阈值对测试集进行分类,并创建混淆矩阵。
因此您的 precision = 0.2
、recall=0.4
(我猜)是基于阈值 0.5,其中您的曲线基于 不同的 阈值告诉你“是否有一个阈值可以在你的准确率和召回率之间做出良好的权衡?”。
获取最优阈值
您可以使用 scikit-learns precision_recall_curve 获得每个阈值的 precision/recall 值,选择最佳 precision/recall 值的阈值,然后 然后 创建你的混淆矩阵。
我假设如果你用它来检查你的模型,当阈值在 0.5 左右时你会发现 0.4 和 0.2 值
我想了解为什么少数 class ("1") 的准确率-召回率曲线如此好,而关于准确率 (0,2) 和召回率 (0,4) 的指标因为同样的 class 太糟糕了。 我将 sklearn.metrics.plot_precision_recall_curve 与 pos_label=0(多数 class)和 pos_label=1(少数 class)一起使用。 您可以在下面看到使用的代码。
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)
这是混淆矩阵: Matrix
还有曲线……: Curves
不知道是不是我调用函数“plot_precision_recall_curve”时出错了。
请记住,您的 precision/recall-curves 是针对分类器的不同阈值绘制的(我假设您使用的是随机森林)。
Precision/recall曲线
曲线是计算出来的; “如果我将模型输出为 0.1(或更大)的输入分类为 'stroke',我的 precision/recall 是什么?如果我将模型输出为 0.2(或更大)的输入分类为 'stroke',而不是 0.1,那么 precision/recall 是什么?如果我将分数更改为 0.3、0.4 ...,1",这就是您得到的曲线图。
混淆矩阵
您的混淆矩阵基于单个阈值,即您可能会说“如果我模型中的 score/output 为 0.5 或更大,我将所有对象分类为 'stroke'”(这通常是如果您不更改它,则标准阈值为二进制大小写)。然后根据 单个 阈值对测试集进行分类,并创建混淆矩阵。
因此您的 precision = 0.2
、recall=0.4
(我猜)是基于阈值 0.5,其中您的曲线基于 不同的 阈值告诉你“是否有一个阈值可以在你的准确率和召回率之间做出良好的权衡?”。
获取最优阈值
您可以使用 scikit-learns precision_recall_curve 获得每个阈值的 precision/recall 值,选择最佳 precision/recall 值的阈值,然后 然后 创建你的混淆矩阵。
我假设如果你用它来检查你的模型,当阈值在 0.5 左右时你会发现 0.4 和 0.2 值