我想深度学习应用到多类分类问题,目标类(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)之间的不平衡仅仅是一个例子。我有我的真实数据集类似的比例。
首先,你有10万〜样品。开始与一些较小的,如100个样本,多时代,看看您的机型是否overfits这个较小的训练数据集(如果不能,你要么有一个错误在你的代码或模型是不能够依赖模型[我会去与第二种情况])。说真的,开始与这一个。请记住关于代表在这个小数据集的所有类。
其次,LSTM隐藏的大小可能太小了,你有18个特征的每个序列和序列具有20的长度,而你隐藏的是只有10,而且你申请退学最糟糕的是,甚至进一步正规化的网络。
此外,可能希望添加某些致密的输出单元,而不是仅仅针对每个时间戳返回大小10 x 1
的线性层。
最后但并非最不重要的,你可能要上取样代表性不足的数据。 0 class
不得不反复被说50倍(或者25),class 2
的东西约4倍,你的一个约10-15倍,因此网络对他们的培训。
哦,用交叉验证为您的超参数,如隐藏的大小,密集单元的数量等。
另外,我不知道有多少你时期一直在训练这个网络做什么,是你的测试数据集(这是完全可能的,如果你没有做分层它只不过是第一类的)。
我认为,这将让你开始打我了在评论任何怀疑。
编辑:当涉及到的指标,你可能要检查的东西比单纯的精度不同;也许F1分数和你的损失监控+准确性,看看它如何执行。还有其他可用的选择,寻找灵感,您可以检查sklearn's documentation为他们提供了不少选择。