一、不平衡数据集(unbalanced training set)
数据比算法重要
现实业务场景不像学术上的标准数据集,往往是脏的、不平衡的。比如信用卡欺诈检测,搜索引擎点击预测、网络入侵检测等。
以二分类为例,假如训练数据集正反样本数量比为$100:1$,这种情况称为unbalanced training set。这种情况下对模型学习是极其不利的。
二、解决方法
1.损失函数加惩罚项(加权)
以三分类(类别名可标为0, 1, 2)为例,假设训练集三种类别数量分别为$100000,1000, 100$,其比例为$1000:10:1$。则在其损失函数对每类别添加权重$weight = [1,10,1000]$(注意:是类别数量比重的倒序,即数据少的weight需要大一点),表示类别0权重为1,类别1权重为10,类别2权重为1000. 具体我们来看Pytorch中的torch.nn.CrossEntropyLoss是怎么实现weight的。
Python中无加权的CrossEntropyLoss:
$$
\begin{split}
loss(x, class) &= -log\left(\frac{e^{x[class]}}{\sum_je^{x[j]}}\right) \ &= -x[class] + log\left(\sum\nolimits_je^{x[j]}\right)
\end{split}
$$
其中,$x$为$[1.3,-0.4,0.7]$形状的向量,往往是line层的输出,未经过softmax处理。$class$为真实标签(0、1或2)。