不平衡数据的 class_weight - Keras

Posted

技术标签:

【中文标题】不平衡数据的 class_weight - Keras【英文标题】:class_weight for imbalanced data - Keras 【发布时间】:2018-09-23 04:33:57 【问题描述】:

我正在尝试使用高度不平衡的数据集执行二进制分类。我的目标值为 0(84%)和 1(16%)。我在模型中使用了 class_weight,但少数类的精度和召回率始终为 0。我不确定我是否正确使用了 class_weights。非常感谢您对此提供任何帮助!

下面是我的代码:

class_weight = 0:1,1:50
numpy.random.seed(5)

model = Sequential()
model.add(Dense(13,input_dim = 5, activation='relu'))
model.add(Dense(13, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss="binary_crossentropy", optimizer = "adam", metrics = ['accuracy'])
model.fit(X_train,Y_train, epochs = 10, batch_size = 30, class_weight = class_weight, validation_data = (X_test, Y_test))
preds = model.predict_classes(X_test)
print (classification_report(Y_test, preds))

           precision    recall  f1-score   support

      0       0.83      1.00      0.91     24126
      1       0.00      0.00      0.00      4879

【问题讨论】:

【参考方案1】:

据我所知,您使用正确。但是,我不确定您的数据集上的不平衡率。如果您愿意,scikit-learn 有一个 function 可以为您计算。

话虽如此,我个人更喜欢过采样/欠采样而不是类权重。我最成功的算法称为SMOTE。你一定要试试这个。

【讨论】:

【参考方案2】:

没有足够的声望来添加评论。因此写作作为 回答。

您说您的班级不平衡率为 84:16(大约 5:1),但您将班级 2 发送为班级 1 的 50 次。尝试 5-10 之间的某个值

【讨论】:

以上是关于不平衡数据的 class_weight - Keras的主要内容,如果未能解决你的问题,请参考以下文章

Keras:class_weight 实际上试图平衡啥?

ValueError:`class_weight`必须包含数据中的所有类。类{1,2,3}存在于数据中,但不存在于`class_weight`中

class_weights 或加权损失在哪里惩罚网络?

在随机森林中传递 Class_weight 参数时出错

Keras:one-hot 编码的类权重(class_weight)

具有不平衡数据的 SKlearn SVM RBF