将class_weight用于keras中的不平衡数据集时准确性显着降低

时间:2018-11-25 11:47:17

标签: python tensorflow keras sentiment-analysis

我有一个不太直观的问题。我正在对Amazon Book评论进行情感分析,并且数据集严重失衡。正面评价几乎是负面评价的10倍,培训和测试的准确性约为90%(数据集不平衡)。但是,当我尝试在class_weight = {0:10 , 1:1}的帮助下平衡数据集时,训练和测试的准确性都下降到65%左右。同样,如果我再次进行class_weight = {0:1 , 1:10}准确性提升,显然是我将class_weight设置为错误,但据我所知,因为正面评论(1)的数量是负面评论(0)的10倍,不应该将class_weight设置为{0:10,1:1}吗?

这是我对训练和测试数据进行分类的方式:

x_train, x_test, y_train, y_test = train_test_split(sequences,labels, test_size = 0.33, random_state = 42)

这是我的模特

model = Sequential()
model.add(Embedding(max_words, embedding_dim))
model.add(Dropout(0.5))
model.add(LSTM(32, dropout=0.5, recurrent_dropout=0.5))
model.add(Dense(2, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy',metrics=['acc'])
model.fit(x_train, y_train, epochs=10, batch_size=320, class_weight = {0:1 , 1:10})

2 个答案:

答案 0 :(得分:1)

当然,如果您不平衡损失,则比平衡损失可获得更好的准确性。实际上,这就是保持平衡的原因。否则,仅预测所有评论的正面评价的模型将为您提供90%的准确性。但是这种模式是没有用的。对于这种高度不平衡的数据集,准确性通常是不好的指标。改用F1,您会发现不平衡模型会带来更差的F1。

答案 1 :(得分:0)

为数据集中频率较低的班级设置较高的班级权重是正确的方法。除了准确性以外,您还可以查看其他useful metrics,例如精度,召回率,F1得分,auc_roc得分(一致性),混淆矩阵,以实际了解模型正在学习的内容。