关于处理数据不平衡问题的一些探索

一、背景:

最近在做意见解释分类任务,数据集中出现了严重的类别不均衡的问题,类别1的数目大概只有类别2的七分之一,类别2的数目大概占全部数据集的一大半了。在这种情况下,模型训练容易忽视小类而偏向大类,而小类别信息对我们来说也是非常重要的,我们也希望能提取更多的小类的特征,提高小类别的准确率。所以如何处理数据类别的不平衡问题,提高模型的宏平均值,也是我们需要重点关注的问题。

 

二、解决办法

解决这个问题的一个思路就是希望在模型训练的时候小类和大类的重要性的一样的,主要可以通过两种方法实现,一个是采样,一个加权,还有数据增强。

1. 采样

理论:

采样分为上采样和下采样。上采样是将小类别复制多份,使得他们的数目与大类别相近。下采样是在大类别中随机剔除一些数据,使得大类别和小类别数目相近。

这样的方法缺点也很明显了,上采样的话,由于将小类别样本复制了多份,那么模型就容易出现过拟合问题,下采样的话,由于删除了一部分数据,那么模型就有可能学不到一些特征,模型性能就会降低。

所以综合了上采样和下采样的方法,先是对大类进行多次下采样,将小类别复制多份与大类别子集合并,从而产生多个训练子集,用多个训练子集分别训练出多个模型,最后用投票的方式得到最后结果。

实践:

将类别2随机分成7个子集,每个子集数目与其他小类别数目相近,然后将每一个类别2的子集与其他小类别的数据合并训练一个模型,这样可以同时训练7个模型,最后测试的时候用这个7个模型得到的结果进行投票(加权平均)。
结果:
在小类别上的性能是上升了,但是在大类别上的性能下降了,整体性能与之前差不多,性能没有得到什么提升啊。
 
2. 加权
针对数据不平衡问题,尝试使用目标检测任务中的方法,用focal loss和pull away term loss对各个类别进行加权,使用加权的方法处理不平衡问题是需要大量的调参的,而且我们有4个类别,调参组合很多,很难调参。目前使用最简单粗暴的参数设置,Y=2,alpha=0,性能有一点提升,在宏平均上有1%左右的提升,在微平均上与baseline持平。
 
3. 数据增强
理论:
之前在上采样中提到,如果将小类别复制多份容易产生过拟合问题,要解决这个问题,我们其实可以在数据中增加一些随机扰动,效果可能会好一些。在图像处理里面,常见的做法是修改RGB值,那么在文本处理里面,我想到可以使用同义词替换来构造小类别样本。
实践:
(1)在github上找到了哈工大同义词林的最新版,选取其中的同义词,共计9995对,55846个词。
(2)由于一个词可能会有多个同义词,我采用随机选取的方式构造语料,测试结果如下所示:
发现构造结果非常不好,思考了一下,应该是因为同义词的涉及领域太广了,所以对同义词进行了删选。
(3)用手机领域的背景语料对同义词进行了删选,最后还剩31225个词。为了防止过拟合,对替换的句子进行了筛选,只选取了替换处大于3处的句子。用删选后的同义词构造语料,测试结果如下所示:
发现情况好一些了,但是还是不确定这样的语料是否有效。
(4)采用2种方式构造小类别数据,1种是全句替换,另外1种是保留意见解释片段,只替换上下文。还没有跑出结果。
 
扩展做法:
1. 如果同义词随机替换的方法没有效果,也可采用计算embedding相似度的方法替换,没进行过尝试,以后有时间可以探索一下。
2. 为了使替换的同义词更准确,也可以加入词性分析。
 
结果:
按照上述步骤处理之后,用新的数据集在baseline模型上进行了测试,模型分类效果显著,得到了目前为止的最高性能。
 
posted @ 2018-06-03 08:50  Joyce_song94  阅读(463)  评论(0编辑  收藏  举报