作用
kaggle的Quora Question Pairs比赛的任务是: 对于一个样本, 由两个句子组成, 判断两个句子是不是同一个意思. 是一个二分类问题.
比赛使用的评价方式是log loss, 即逻辑回归中的损失函数. 对于这种特定的评价方式, 能用下面的方法, 探测出提交的测试集中, 正样本的比例.
得到测试集中正样本的比例之后, 一个比较有效的提高leaderboard排名的方式是: 判断训练集和测试集中的正样本比例相差是否过大. 假设它们来自于同一个分布采样得到的, 那么就应该调整训练集的样本比例或者使用改造的损失函数来解决训练集和测试集分布不一致的问题.
方法
Data Analysis & XGBoost Starter (0.35460 LB)中, 作者在使用xgboost进行训练之前, 对负样本进行了oversample. 原因是训练集中的正样本比例为36%, 高于测试集中的17%. 然而测试集并没有标签, 17%的数值是如何获取的呢?
在How many 1's are in the Public LB?中描述的具体的原理和方法, 简述如下:
- 计算训练集的正样本的比例. 并作为一个常数, 作为每个样本的预测概率. 在Quora Question Pairs问题中, 这个比例约为0.37, 将其作为测试集的预测概率并提交, 得到返回的log loss, 此例中为0.55.
log loss公式为(单样本):
\[\text{log loss}=r \cdot log(p) + (1-r) \cdot log(1-p)\]
\(p\)为预测概率, 也就是我们给出的常数预测0.55, \(r\)是测试集中的正样本的真实概率, 也就是测试集中正样本的比例. 因此, 可以得到:
\[r = \frac{\text{log loss} + log(1-p)}{log\big( \frac{1-p}{p}\big)}\]
因此得到测试集中正样本的概率为0.174
Train/Test不平衡处理方法
如果得到的测试集中的正样本比例与训练集中的比例不平衡的时候, 调节的方法有:
使用新的损失函数进行训练
\[\text{log loss} = \alpha \cdot y \cdot \log(\hat{y}) + \beta \cdot (1-y) \log(1 - \hat{y})\]
其中, \(\alpha\)为[训练集正样本比例]/[测试集正样本比例], \(\beta\)为[训练集负样本比例]/[测试集负样本比例]. 原理见Cross entropy and training-test class imbalance.
负采样, 确保训练集与测试集的正样本比例相同.