使用 sequential() 模型进行二元分类的精度矩阵
Accuracy matrices for binary classification with sequential() model
我用 sequential()
keras 模型创建了一个深度神经网络模型。这是一个二元分类问题。我已经为 model
安装了火车数据。
我对训练和验证数据的不同准确度指标的计算感到困惑。我正在计算 RMSE、F1 分数、ROC 的 AUC 和 PR 曲线,
# 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
我的代码正确吗?
抱歉,不完全是 -
对于 Precision、Recall 和 f1,您不应该采用 f1_train = np.mean(..
等曲线的平均值,而是:
使用您的 PR-AUC 和 ROC -AUC 定义阈值。使用该阈值将 y_pred_ * 二值化,然后调用 classification_report
打印最终精度、召回率和 f1 分数。然后,您将看到有效的 f1 分数以及精确度和召回率如何影响它。
RMSE
:选择交叉熵指标可能是(在你对你的预测进行二值化之后),因为它是你训练的分类器。
我用 sequential()
keras 模型创建了一个深度神经网络模型。这是一个二元分类问题。我已经为 model
安装了火车数据。
我对训练和验证数据的不同准确度指标的计算感到困惑。我正在计算 RMSE、F1 分数、ROC 的 AUC 和 PR 曲线,
# 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
我的代码正确吗?
抱歉,不完全是 -
对于 Precision、Recall 和 f1,您不应该采用
f1_train = np.mean(..
等曲线的平均值,而是:
使用您的 PR-AUC 和 ROC -AUC 定义阈值。使用该阈值将 y_pred_ * 二值化,然后调用classification_report
打印最终精度、召回率和 f1 分数。然后,您将看到有效的 f1 分数以及精确度和召回率如何影响它。RMSE
:选择交叉熵指标可能是(在你对你的预测进行二值化之后),因为它是你训练的分类器。