在Keras类不平衡的多类分类损失函数

问题描述 投票:0回答:1

我想深度学习应用到多类分类问题,目标类(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)

基本上,在火车上的数据我有94981米的样品。每个样品含有20个时间戳的序列。有18个特征。

目标类(10K,500K,90K,30K)之间的不平衡仅仅是一个例子。我有我的真实数据集类似的比例。

enter image description here

enter image description here

python keras lstm
1个回答
2
投票

首先,你有10万〜样品。开始与一些较小的,如100个样本,多时代,看看您的机型是否overfits这个较小的训练数据集(如果不能,你要么有一个错误在你的代码或模型是不能够依赖模型[我会去与第二种情况])。说真的,开始与这一个。请记住关于代表在这个小数据集的所有类。

其次,LSTM隐藏的大小可能太小了,你有18个特征的每个序列和序列具有20的长度,而你隐藏的是只有10,而且你申请退学最糟糕的是,甚至进一步正规化的网络。

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

最后但并非最不重要的,你可能要上取样代表性不足的数据。 0 class不得不反复被说50倍(或者25),class 2的东西约4倍,你的一个约10-15倍,因此网络对他们的培训。

哦,用交叉验证为您的超参数,如隐藏的大小,密集单元的数量等。

另外,我不知道有多少你时期一直在训练这个网络做什么,是你的测试数据集(这是完全可能的,如果你没有做分层它只不过是第一类的)。

我认为,这将让你开始打我了在评论任何怀疑。

编辑:当涉及到的指标,你可能要检查的东西比单纯的精度不同;也许F1分数和你的损失监控+准确性,看看它如何执行。还有其他可用的选择,寻找灵感,您可以检查sklearn's documentation为他们提供了不少选择。

© www.soinside.com 2019 - 2024. All rights reserved.