【问题标题】:Loss function for class imbalanced multi-class classifier in KerasKeras中类不平衡多类分类器的损失函数
【发布时间】:2019-02-07 23:05:57
【问题描述】:

我正在尝试将深度学习应用于目标类(10K、500K、90K、30K)之间高度不平衡的多类分类问题。我想编写一个自定义损失函数。 这是我目前的模型:

model = Sequential()

model.add(LSTM(
                units=10, # number of units returned by LSTM
                return_sequences=True, 
                input_shape=(timestamps,nb_features),
                dropout=0.2, 
                recurrent_dropout=0.2
              )
         )

model.add(TimeDistributed(Dense(1)))

model.add(Dropout(0.2))

model.add(Flatten())

model.add(Dense(units=nb_classes,
               activation='softmax'))

model.compile(loss="categorical_crossentropy",
              metrics = ['accuracy'],
              optimizer='adadelta')

不幸的是,所有预测都属于第 1 类!!!该模型总是为任何输入预测 1...

感谢任何关于我如何解决此任务的指示。

更新:

输入数据的维度:

94981 train sequences
29494 test sequences
X_train shape: (94981, 20, 18)
X_test shape: (29494, 20, 18)
y_train shape: (94981, 4)
y_test shape: (29494, 4)

基本上在训练数据中我有 94​​981 个样本。每个样本包含 20 个时间戳的序列。有 18 个功能。

目标类别(10K、500K、90K、30K)之间的不平衡只是一个例子。我的真实数据集中的比例相似。

【问题讨论】:

  • 发布有关您的数据的更多信息。每个数据点有多少特征?
  • @SzymonMaszke:我更新了我的帖子。

标签: python keras lstm


【解决方案1】:

首先,您有大约 10 万个样本。从较小的东西开始,例如 100 个样本和多个 epoch,看看您的模型是否过拟合到这个较小的训练数据集(如果不能,您的代码中有错误,或者模型无法对依赖项进行建模 [我会使用第二种情况])。说真的,从这个开始。记住在这个小数据集中表示你所有的类。

其次,LSTM 的隐藏大小可能太小,每个序列有 18 个特征,序列的长度为 20,而隐藏只有 10 个。并且你应用 dropout 来弥补它并进一步规范网络。

此外,您可能希望添加一些密集输出单元,而不是仅仅为每个时间戳返回大小为 10 x 1 的线性层。

最后但同样重要的是,您可能需要对代表性不足的数据进行上采样。 0 class 必须重复说 50 次(或者可能是 25 次),class 2 大约 4 次,而你的大约 10-15 次,所以网络是针对它们进行训练的。

哦,对你的超参数使用交叉验证,比如隐藏大小、密集单元的数量等。

另外,我不知道你已经训练了这个网络多少个 epoch,你的测试数据集是什么(如果你没有进行分层,它完全有可能只构成第一类)。

我想这会让你开始,如果有任何疑问,请联系我。

编辑:当涉及到指标时,您可能想要检查的不仅仅是准确性;也许是 F1 分数和你的损失监控 + 准确性,看看它的表现如何。还有其他可用的选择,为了获得灵感,您可以查看sklearn's documentation,因为它们提供了很多选择。

【讨论】:

  • 非常感谢您宝贵的 cmets。我将在您的指导下重新开始我的实验。但是,能否请您告诉我应该使用哪些指标?
  • 老实说,无论您想要什么,但我已经更新了我的答案。显示混淆矩阵也可能很有价值。
  • 我可以在 Keras 中使用balanced_accuracy 吗?我无法在 Keras 中找到这样的指标。它只存在于 Sklearn 中。还是我应该自己创建函数?
  • 另外,if it can't, you either have an error in your code 是什么意思?如果it can't 什么?你的意思是如果模型没有过拟合,我的代码就有错误?!
  • 是的,或者模型无法模拟您正在寻找的关系(这比代码中的错误更有可能,因为我也没有看到)。据我回忆,Keras 提供很多指标,您必须自己实现这些指标或使用this package
猜你喜欢
  • 2016-05-11
  • 2019-02-09
  • 2020-03-01
  • 2019-08-27
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 2017-12-08
  • 2020-06-18
相关资源
最近更新 更多