分类:类中的数据偏斜

Bug*_*sli 8 python neural-network multilabel-classification keras tensorflow

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

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

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

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

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

  1. 使用定制的损失函数惩罚假阴性(我的第一次尝试失败).类似于类中加权积极的例子而不是消极的例子.这类似于类权重,但在类中.你会如何在Keras实现这一点?

  2. 通过克隆它们然后过度拟合神经网络来过采样正例,以便平衡正面和负面的例子.

提前致谢!

Ann*_*nne 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
Run Code Online (Sandbox Code Playgroud)

您的损失函数可以结合一些其他测量来研究正类别的召回。