训练和测试模型时指标值相等
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