我正在尝试构建一个多标签分类器,以预测某些输入数据的概率为0或1.我正在使用神经网络和Tensorflow + Keras(可能是CNN以后)。
问题如下: 数据高度倾斜。还有很多负面的例子,而不是积极的,可能是90:10。因此,我的神经网络几乎总是输出非常低的概率作为正例。使用二进制数,在大多数情况下它会预测为0.
表现是>几乎所有课程都有95%,但这是因为它几乎总是预测为零...... 因此,假阴性的数量非常高。
如何解决此问题的一些建议?
以下是我到目前为止所考虑的想法:
使用自定义丢失功能(我的第一次尝试失败)更多地惩罚假阴性。类似于类中加权积极的例子而不是消极的例子。这类似于类权重,但在类中。 你会如何在Keras实现这一点?
通过克隆它们然后过度拟合神经网络来过度采样正例,以便平衡正面和负面的例子。
提前致谢!
答案 0 :(得分:2)
你走在正确的轨道上。
通常,您可以在训练之前平衡您的数据集,即减少过度代表的类或为代表性不足的类生成人工(增强)数据以增加其发生。
减少过度代表的课程 这个更简单,您只需随机选择与代表性不足的类一样多的样本,丢弃其余的样本并使用新的子集进行训练。当然,缺点是你会失去一些学习潜力,这取决于你的任务有多复杂(有多少功能)。
增加数据 根据您使用的数据类型,您可以"增加"数据。这只意味着您从数据中获取现有样本并稍微修改它们并将其用作其他样本。这对图像数据,声音数据非常有效。您可以翻转/旋转,缩放,添加噪声,降低亮度,缩放比例,裁剪等。 这里重要的是你要处在现实世界中可能发生的事情的范围内。例如,如果您想要识别" 70mph速度限制"标志,好吧,翻转它没有意义,你永远不会遇到一个真正翻转的70mph标志。如果您想要识别花朵,则允许翻转或旋转花朵。同样的声音,改变音量/频率轻微赢得了很多。但是,颠倒音频轨道改变了它的意思"并且你不必在现实世界中识别倒退的口语。
现在,如果你必须增加表格数据,比如销售数据,元数据等等......那就太麻烦了,因为你必须小心而不是隐含地将自己的假设输入到模型。
答案 1 :(得分: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
你的损失函数可以调查积极类的召回以及其他一些衡量标准。