分类:类中的数据偏斜

问题描述 投票:8回答:2

我正在尝试构建一个多标签分类器来预测某些输入数据的概率为0或1.我使用的是神经网络和Tensorflow + Keras(后来可能是CNN)。

问题如下:数据严重偏差。还有很多负面的例子,而不是积极的,可能是90:10。因此,我的神经网络几乎总是输出非常低的概率作为正例。使用二进制数,它在大多数情况下会预测为0。

几乎所有类别的性能都> 95%,但这是因为它几乎总是预测为零......因此假阴性的数量非常高。

一些建议如何解决这个问题?

以下是我到目前为止所考虑的想法:

  1. 使用定制的损失函数惩罚假阴性(我的第一次尝试失败)。类似于类中加权积极的例子而不是消极的例子。这类似于类权重,但在类中。你会如何在Keras实现这一点?
  2. 通过克隆它们然后过度拟合神经网络来过采样正例,以便平衡正面和负面的例子。

提前致谢!

python tensorflow neural-network keras multilabel-classification
2个回答
2
投票

你走在正确的轨道上。

通常,您可以在训练之前平衡您的数据集,即减少过度代表的类或为代表性不足的类生成人工(增强)数据以增强其发生。

  1. 减少过度代表的类这个更简单,您只需随机选择与代表性不足的类一样多的样本,丢弃其余的并使用新子集进行训练。当然,缺点是你失去了一些学习潜力,这取决于你的任务有多复杂(有多少功能)。
  2. 扩充数据根据您使用的数据类型,您可以“扩充”数据。这只意味着您从数据中获取现有样本并稍微修改它们并将其用作其他样本。这对图像数据,声音数据非常有效。你可以翻转/旋转,缩放,添加噪音,降低亮度,缩放比例,裁剪等等。重要的是你要保持在现实世界中可能发生的范围内。例如,如果您想要识别“70mph速度限制”标志,那么,翻转它没有意义,您将永远不会遇到实际翻转的70mph标志。如果您想要识别花朵,则允许翻转或旋转花朵。同样的声音,改变音量/频率轻微无关紧要。但是,反转音轨改变了它的“意义”,你不必在现实世界中识别倒退的口语。

现在,如果你必须增加表格数据,如销售数据,元数据等等......那就太麻烦了,因为你必须小心不要隐含地将你自己的假设输入到模型中。


0
投票

我认为你的两个建议已经很好了。当然,你也可以简单地对负面类进行抽样。

def balance_occurences(dataframe, zielspalte=target_name, faktor=1):
    least_frequent_observation=dataframe[zielspalte].value_counts().idxmin()
    bottleneck=len(dataframe[dataframe[zielspalte]==least_frequent_observation])
    balanced_indices=dataframe.index[dataframe[zielspalte]==least_frequent_observation].tolist()
    for value in (set(dataframe[zielspalte])-{least_frequent_observation}):
        full_list=dataframe.index[dataframe[zielspalte]==value].tolist()
        selection=np.random.choice(a=full_list,size=bottleneck*faktor, replace=False)
        balanced_indices=np.append(balanced_indices,selection)
    df_balanced=dataframe[dataframe.index.isin(balanced_indices)]
    return df_balanced

你的损失函数可以调查积极类的召回以及其他一些测量。

© www.soinside.com 2019 - 2024. All rights reserved.