我正在尝试构建一个多标签分类器来预测某些输入数据的概率为0或1.我使用的是神经网络和Tensorflow + Keras(后来可能是CNN)。
问题如下:数据严重偏差。还有很多负面的例子,而不是积极的,可能是90:10。因此,我的神经网络几乎总是输出非常低的概率作为正例。使用二进制数,它在大多数情况下会预测为0。
几乎所有类别的性能都> 95%,但这是因为它几乎总是预测为零......因此假阴性的数量非常高。
一些建议如何解决这个问题?
以下是我到目前为止所考虑的想法:
提前致谢!
你走在正确的轨道上。
通常,您可以在训练之前平衡您的数据集,即减少过度代表的类或为代表性不足的类生成人工(增强)数据以增强其发生。
现在,如果你必须增加表格数据,如销售数据,元数据等等......那就太麻烦了,因为你必须小心不要隐含地将你自己的假设输入到模型中。
我认为你的两个建议已经很好了。当然,你也可以简单地对负面类进行抽样。
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
你的损失函数可以调查积极类的召回以及其他一些测量。