【问题标题】:Weighting a regression CNN for imbalanced data?为不平衡数据加权回归 CNN?
【发布时间】:2019-12-08 09:46:51
【问题描述】:

我有一个用于回归的 CNN,它获取图像并输出 0-10 的浮点数。我的模型运行良好,但我的数据不平衡存在严重问题,使我的模型对几乎所有图像的预测在 6-8 之间,但实现了不错的均方误差。我知道有人根据他们的数据集的不平衡程度来衡量他们的班级。那么,有没有办法用回归模型来做到这一点?如果有帮助,我的输出是一个浮点数,但我所有的数据都在 0-10 范围内以 0.5 的间隔为间隔,所以在某种程度上有 20 个不同的类。这是我的数据标签的分布。

我知道还有其他方法,例如:

  • 对少数群体进行过采样。
  • 使用数据增强来“复制”少数群体。
  • 优化不同的性能指标。 (不知道会是什么)

有什么建议吗?谢谢。

【问题讨论】:

    标签: tensorflow deep-learning regression conv-neural-network data-science


    【解决方案1】:

    您的数据最初可能代表一个回归问题,但在将其分成 20 个组后,您正在针对 20 类分类问题训练您的模型。因此,您应该这样对待它,并寻找解决这种不平衡的方法。最流行的方法是:

    • 过采样少数类
    • 欠采样多数类
    • 使用类权重

    我通常更喜欢第一种,因为模型在处理更多数据时往往会做得更好,但第三种更易于实现并且不会为训练增加额外的计算成本。

    【讨论】:

    • 好吧,我明白你的意思,它就像一个 20 类分类,但你是说我应该把我的模型变成一个分类模型,或者只是这样对待它。当没有技术课程时,我只是对如何添加课程权重感到困惑。
    • 因为您正在使用分类模型,而在模型看来,它只是一个分类任务。由于您的模型将输出视为类,因此您应该像在分类任务中一样使用类权重。如果它是一个回归任务,那就没有太大区别了; “类”权重的作用是告诉模型更多地关注某些样本而不是其他样本,具体取决于它们的目标。即使您有回归任务,您也可以使用“类”权重。不同之处在于权重不取决于类别,而是取决于其连续标签。
    • 我找到了不同类的权重并将其作为class_weights 的参数,如下所示:model.fit(train_images, train_labels, epochs=100, callbacks=[keras.callbacks.ModelCheckpoint("./model.ckpt", monitor='mean_squared_error', save_best_only=True, verbose=1)], class_weight=class_weights) 虽然它确实显示了加权均方误差,但它仍然基于未加权的误差进行了优化均方误差。我错过了什么还是我必须编写自定义损失函数?
    • 不,这就是你想要的。如果您使用未加权的 MSE,则与以前没有区别。在它完成加权 MSE 的训练后,在常规 MSE 上对其进行评估,看看它是否有所改善。
    【解决方案2】:

    一种流行的过采样技术是SMOTE

    对于优化不同的指标,一种选择是优化加权损失,其中权重与类表示的倒数成正比。

    【讨论】:

    • tensorflow 或 keras 是否有内置方法来制作自定义指标,或者这完全是手动过程?
    • 这是一个回归问题,那么类表示的倒数是什么?
    猜你喜欢
    • 2021-08-25
    • 2021-01-27
    • 2017-11-17
    • 2013-03-11
    • 2014-05-07
    • 2016-02-09
    • 2017-09-19
    • 2016-02-10
    • 2018-07-26
    相关资源
    最近更新 更多