Keras多类预测输出仅限于一类

时间:2017-04-02 21:30:09

标签: tensorflow neural-network keras

我构建了一个具有35000个输入样本和20个预测变量的序列keras模型,测试数据输出类分布为:

  • Class_0 = 5.6%
  • Class_1 = 7.7%
  • Class_2 = 35.6%
  • Class_3 = 45.7%
  • Class_4 = 5.4%

利用(np_utils.to_categorical)将输出转换为二进制类矩阵后,训练精度约为54%,当我对测试数据(15000个样本)进行模型拟合时,所有预测(100%)碰巧都是相同的class_3“训练输出中出现率最高”的类,这种偏差的原因是什么,对其他类没有单一的预测?如何使模型对预测更少的类更敏感并提高准确性,特别是如果训练数据中的并发性低至1-3%。

model = Sequential()
model.add(Dense(40, input_dim=20,  activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10,  activation='relu'))
model.add(Dense(5, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

model.fit(X, Y, epochs=500,  verbose=1)

2 个答案:

答案 0 :(得分:3)

重新平衡损失的最简单方法是:

  1. 定义class_weights字典:

    class_weights_dict = {0: 1.0 / 0_class_freq, 1: 1.0 / 1_class_freq, ... }
    

    i_class_freq的频率为i-th等级。

  2. 将您的fit功能更改为:

    model.fit(X, Y, epochs=500,  verbose=1, class_weight=class_weights_dict)
    
  3. 上面定义的模型应该等同于使用Bayessian重新加权类的模型。

答案 1 :(得分:1)

要解决的一种方法是在代表的类示例下进行过采样。 也就是说,如果你有两个A类(66.6%)和B(33.3%),那么你比B采样B两次。 为了使其更简单,您可以通过复制B一次并使数据集像A + 2 * B来更改数据集。

或者,您可以修改您的损失函数,以便在对代表性不足的类进行错误分类时给予更多权重。