训练和测试模型时指标值相等

Posted

技术标签:

【中文标题】训练和测试模型时指标值相等【英文标题】:Metrics values are equal while training and testing a model 【发布时间】:2019-05-17 11:19:25 【问题描述】:

我正在使用带有 TensorFlow 后端的 Keras 使用 Python 开发神经网络模型。数据集包含两个序列,结果可以是 1 或 0,数据集中的正负比为 1 到 9。模型将这两个序列作为输入并输出概率。起初我的模型有一个带有一个隐藏单元和 sigmoid 激活函数作为输出的 Dense 层,但后来我将模型的最后一层更改为具有两个隐藏单元和 softmax 激活函数的 Dense,并使用 Keras to_categorical 函数更改了我的数据集的结果。在这些更改之后,包含 Accuracy、Precision、Recall、F1、AUC 的模型指标都是相等的,并且具有很高的错误值。这是我用于这些指标的实现

def recall(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
    recall = true_positives / (possible_positives + K.epsilon())
    return recall

def precision(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

def f1(y_true, y_pred):
    precisionValue = precision(y_true, y_pred)
    recallValue = recall(y_true, y_pred)
    return 2*((precisionValue*recallValue)/(precisionValue+recallValue+K.epsilon()))

def auc(y_true, y_pred):
    auc = tf.metrics.auc(y_true, y_pred)[1]
    K.get_session().run(tf.local_variables_initializer())
    return auc

这是训练结果

Epoch 1/5
4026/4026 [==============================] - 17s 4ms/step - loss: 1.4511 - acc: 0.9044 - f1: 0.9044 - auc: 0.8999 - precision: 0.9044 - recall: 0.9044
Epoch 2/5
4026/4026 [==============================] - 15s 4ms/step - loss: 1.4573 - acc: 0.9091 - f1: 0.9091 - auc: 0.9087 - precision: 0.9091 - recall: 0.9091
Epoch 3/5
4026/4026 [==============================] - 15s 4ms/step - loss: 1.4573 - acc: 0.9091 - f1: 0.9091 - auc: 0.9083 - precision: 0.9091 - recall: 0.9091
Epoch 4/5
4026/4026 [==============================] - 15s 4ms/step - loss: 1.4573 - acc: 0.9091 - f1: 0.9091 - auc: 0.9090 - precision: 0.9091 - recall: 0.9091
Epoch 5/5
4026/4026 [==============================] - 15s 4ms/step - loss: 1.4573 - acc: 0.9091 - f1: 0.9091 - auc: 0.9085 - precision: 0.9091 - recall: 0.9091

之后,我使用 predict 测试了我的模型,并使用 sklearn 的 precision_recall_fscore_support 函数计算了指标,我再次得到了相同的结果。指标都是相等的并且具有很高的值(0.93),根据我生成的混淆矩阵,这是错误的

我做错了什么?

【问题讨论】:

你确定你的recall和f1函数的实现吗?我认为他们错了。 我知道,但问题是 sklearn 的precision_recall_fscore_support 函数@today 计算错误值 【参考方案1】:

自 Keras 2.0 以来,精度、召回、F1 已被删除,因为这些指标应该是全局计算的,但它们是按批次计算的。您的代码类似于 keras 1.X 中使用的代码,这可能是问题。

尝试使用包keras_metrics

import keras
import keras_metrics

model = models.Sequential()
model.add(keras.layers.Dense(1, activation="sigmoid", input_dim=2))
model.add(keras.layers.Dense(1, activation="softmax"))

model.compile(optimizer="sgd",
              loss="binary_crossentropy",
              metrics=[keras_metrics.precision(), keras_metrics.recall()])

【讨论】:

以上是关于训练和测试模型时指标值相等的主要内容,如果未能解决你的问题,请参考以下文章

模型训练与优化

R语言构建xgboost模型并评估模型(测试集训练集每一轮):误分类率指标(misclassification rate)logloss

Tensorboard 未显示最后训练模型的自定义指标

Matlab 机器学习训练、验证、测试分区

第二章 模型评估与选择

数据集的划分