【问题标题】:Accuracy matrices for binary classification with sequential() model使用序列()模型进行二元分类的准确度矩阵
【发布时间】:2021-11-20 04:10:40
【问题描述】:

我用sequential() keras 模型创建了一个深度神经网络模型。这是一个二元分类问题。我已经为model 安装了火车数据。

我对训练和验证数据的不同准确度指标的计算感到困惑。我正在计算 RMSE、F1 分数、ROC 和 PR 曲线的 AUC,

# Prediction
y_pred_train = model.predict(x_train_df).ravel()
y_pred_val = model.predict(x_val_df).ravel()

# RMSE
rmse_train = mean_squared_error(y_train_df, y_pred_train)
rmse_val = mean_squared_error(y_val_df, y_pred_val)

# ROC-AUC
fpr_train, tpr_train, thresholds_roc_train = roc_curve(y_train_df, y_pred_train, pos_label=None)
fpr_val, tpr_val, thresholds_roc_val = roc_curve(y_val_df, y_pred_val, pos_label=None)

roc_auc_train = auc(fpr_train, tpr_train)
roc_auc_val = auc(fpr_val, tpr_val)

# PR-AUC
precision_train, recall_train, thresholds_pr_train = precision_recall_curve(y_train_df, y_pred_train)
precision_val, recall_val, thresholds_pr_val = precision_recall_curve(y_val_df, y_pred_val)
pr_auc_train = auc(recall_train, precision_train)
pr_auc_val = auc(recall_val, precision_val)

# F1 Score
f1_train = np.mean(2 * (precision_train * recall_train) / (precision_train + recall_train))
f1_val = np.mean(2 * (precision_val * recall_val) / (precision_val + recall_val))

这些精度的值是,

  • RMSE 训练 0.11
  • RMSE 验证 0.13
  • ROC-AUC 训练 0.94
  • ROC-AUC 验证 0.91
  • PR-AUC 训练 0.96
  • PR-AUC 验证 0.93
  • F1 分数训练 0.66
  • F1 分数验证 0.66

我对机器学习很陌生。我通过搜索各种网页实现了这些代码。 我的代码是否正确?我感到很困惑,因为 F1 分数不是很高,尽管所有其他指标的值都很高。

如果代码正确,那为什么我的 F1 分数没有那么高?

编辑 1

正如评论中所问,精度和召回值是

print(np.mean(precision_train))
print(np.mean(recall_train))
print(np.mean(precision_val))
print(np.mean(recall_val))

输出:

0.9299899169174257
0.6012312742646909
0.8988925808831595
0.6052356704530617

【问题讨论】:

  • 为什么不打印精确率和召回率来了解为什么 f1 分数会这样?
  • 添加了这些有问题的值。此外,所有指标的计算/代码是否正确?
  • 结果F1低是因为召回率低。
  • RMSE 在分类问题中毫无意义

标签: python tensorflow machine-learning keras


【解决方案1】:

我的代码正确吗?

对不起,不完全-

  1. 对于精度、召回率和 f1,您不应取曲线的平均值,例如 f1_train = np.mean(..,而是:
    使用您的 PR-AUC 和 ROC-AUC 来定义阈值。使用该阈值对 y_pred_ * 进行二值化,然后调用 classification_report 以打印最终精度、召回率和 f1 分数。然后,您将看到有效的 f1 分数以及准确率和召回率如何影响它。

  2. RMSE: 可能需要交叉熵度量(在您对预测进行二值化之后),因为它是您训练的分类器。

【讨论】:

  • 如何使用您的 PR-AUC 和 ROC-AUC 来定义阈值?是否所有指标计算都不正确,换句话说,我是否必须对所有指标进行二值化 y_pred_ 或其中一些指标可以采用 _y_pred__?跨度>
  • 所有曲线看起来都很好。您可以在此处阅读有关找到良好阈值的信息以及其中提供的链接 - stats.stackexchange.com/questions/123124/…
猜你喜欢
  • 1970-01-01
  • 2019-10-21
  • 2016-07-12
  • 2019-01-11
  • 2021-06-14
  • 1970-01-01
  • 2017-02-26
  • 2013-12-02
  • 1970-01-01
相关资源
最近更新 更多