我构建了一个具有35000个输入样本和20个预测变量的序列keras模型,测试数据输出类分布为:
利用(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)
答案 0 :(得分:3)
重新平衡损失的最简单方法是:
定义class_weights
字典:
class_weights_dict = {0: 1.0 / 0_class_freq, 1: 1.0 / 1_class_freq, ... }
i_class_freq
的频率为i-th
等级。
将您的fit
功能更改为:
model.fit(X, Y, epochs=500, verbose=1, class_weight=class_weights_dict)
上面定义的模型应该等同于使用Bayessian重新加权类的模型。
答案 1 :(得分:1)
要解决的一种方法是在代表的类示例下进行过采样。 也就是说,如果你有两个A类(66.6%)和B(33.3%),那么你比B采样B两次。 为了使其更简单,您可以通过复制B一次并使数据集像A + 2 * B来更改数据集。
或者,您可以修改您的损失函数,以便在对代表性不足的类进行错误分类时给予更多权重。