在情感分类任务中,数据集的标签分布往往是极度不平衡的。以我目前手上的这个二分类任务来说,正例样本14.4万个:负例样本166.1万 = 1 :11.5。很显然这是一个极度不平衡的数据集,假设我把样本全部预测为负,那准确率也高达92%,但这么做没有意义。
那么我们如何处理这个不平衡数据集呢?
因为我用的是神经网络,我不希望减少训练样本,因此我不会采用下采样的方式。有三个方向可以尝试:
- 使用自定义的loss函数
- 设置class weight
- 设置sample weight
这里,我将尝试三种不同的loss函数并进行对比。
(一)三种损失函数
令
表示样本的真实标签,则
。令
表示sigmoid输出的预测类别为1的概率,显然
。下面给出三种损失函数的定义:
1. Binary crossentropy
大名鼎鼎的交叉熵损失函数,这里就不赘述了。
2. 修正的Binary crossentropy
这个损失函数来自苏神的两篇文章:
【1】文本情感分类(四):更好的损失函数
【2】何恺明大神的「Focal Loss」,如何更好地理解?
引入单位跃阶函数
取定阈值
(可调超参数,原则上大于0.5均可),则:
(这里我稍微修改了一点点,以使得损失函数更加对称)
这个损失函数跟Binary Crossentropy比起来,就是多了
这个调节因子,我们来分析一下这个公式: