首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在训练和测试模型时,度量值是相等的。

在训练和测试模型时,度量值是相等的。
EN

Data Science用户
提问于 2018-12-16 21:39:10
回答 2查看 369关注 0票数 1

我正在使用带有TensorFlow后端的Keras开发一个使用python的神经网络模型。数据集包含两个序列,结果可以是1或0,数据集中的正负比为1: 9。模型将这两个序列作为输入输出概率。首先,我的模型有一个密集层,有一个隐藏单元和乙状结肠激活函数作为输出,然后我将模型的最后一层改为一个有两个隐藏单元和softmax激活函数的稠密层,并使用Keras to_categorical函数改变了数据集的结果。这些变化后,模型的准确性、精确性、召回性、F1、AUC等指标都是相等的,具有很高的和错误的价值。下面是我用于这些度量的实现

代码语言:javascript
复制
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

这是训练的结果

代码语言:javascript
复制
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),根据我生成的混淆矩阵,这是错误的。

我做错了什么?

EN

回答 2

Data Science用户

发布于 2018-12-18 12:38:55

这种情况可能有不同的原因:

  • 你的模型学会了快速(不到一个时代)。在这种情况下,您需要增加数据集(通过添加一些数据或增强)
  • 丢失函数不能正常工作,每次调用都返回零梯度。
  • 你的训练模式不属于火车模式。
  • 您的数据加载错误。测试模型的输入是什么
票数 0
EN

Data Science用户

发布于 2018-12-18 13:16:08

你的问题似乎是阶级不平衡的问题。与其他类相比,一个类的样本太多了。试图最小化损失的优化器通过学习预测上级类来解决问题,从而最小化错误--它作弊。您应该做的是根据类或样本在其他类(Es)中所占的比例来赋予它们权重,这样错误地预测少数类的代价就会更高,而真正预测上级阶级则会从优化器那里得到更便宜的回报。

您可以从这个答案中找到如何计算类权重或样本权重。

以及您应该如何在Keras中使用(这些是我的代码中的片段):

代码语言:javascript
复制
nn.fit(x_train, y_train, callbacks = [es], epochs=8000, batch_size=64,
       shuffle=True, validation_data=(x_dev, y_dev), 
       sample_weight = sample_weights)

如果您想使用sample_weights。同样的,

代码语言:javascript
复制
nn.fit(x_train, y_train, callbacks = [es], epochs=8000, batch_size=64, 
       shuffle=True, validation_data=(x_dev, y_dev),
       class_weight=class_weight)

如果您想要使用类的权重。不过,没有什么区别,只是不要两者兼用。

祝好运!

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/42726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档