问题
在我们的舆情系统里,客户标注了一批文章倾向性的数据,为了降低人工成本,客户希望使用模型来实现自动的标注。
但是客户标注的这批数据是极其不平衡的,绝大部分数据都是同一个分类,而且数据是多人标注的,数据质量其实比较一般,同事在这批数据上验证了一下,指标如下:
训练时使用的损失函数是交叉熵,过程有使用过采样之类的。
从数据看,最大的类别准确率召回率都很高,但是其他三个类别的指标就有点难看了。
而中性指标这么好看,客户却不太关注这个值,客户希望各个类别的准确率都要比较高。
分析与方案
要提升其他类别的准确率,最开始想的是可以直接对类别的置信度乘以一个权重,得到的新值作为最后的置信度。这样,如果要提升某个类别的准确率,显然乘以一个大于0小于1的值就行,该权重值越小通常准确率越高。当然这肯定是有副作用的,就是该类别准确率越高的时候,召回率就会越低。
同事试验了效果,客户关心的指标是确实会变好的(各类别的准确率)。
但是这个类别权重不好控制,另外因为我们最终是要实现客户自助标注自助或者自动训练,这样的一个权重可能客户得不停地试验才能得到比较好的值,显然这是有点难接受的(客户可不想干这事)。
关注损失函数
训练是有目标的,就是让loss值最小化,但是loss值最小和各个类别的准确都比较好却不是等价的,因为类别之间太不平衡了。loss最小,应该是倾向于整体准确率最好。
那我们是不是可以将各个类别的准确率加入到loss中去呢?显然是可以的,准确率概率值,用1减去它就行,可以用原来的loss加上这个值,构成新的loss,这样和类别的准确率就作为模型训练的目标之一了。
同事测试反馈效果还不错。
进一步
更进一步考虑:
1. 增加一个权重参数控制两部分loss的相对重要性,会不会效果更好呢?
2. 直接以各个类别准确率的均值(当然要1减去它)作为loss,效果会不会更好?
让同事去尝试中(其实大概率是可以试出更好指标的)。
关于损失函数的理解
损失函数并不是一成不变的,很多时候应该从场景的目标出来,设计出跟目标直接相关的损失函数,往往能收到好的效果。
机器学习里经常出现的距离函数往往也是这样的。
-------------------------------
ps:坐地铁回家,真是刚好够时间凑一篇文章。