正负样本比例不平衡

📅 2026/6/29 23:19:34
正负样本比例不平衡
之前的一个ctr预测任务数据集正负样本比例达到惊人的1:64导致acc很高但是auc低因为模型倾向于将样本判负负样本多都预测为负值自然acc高。belike[W1]Epoch1:loss0.7100acc0.4700auc0.5534gauc0.5104[W1]Epoch2:loss0.6931acc0.5149auc0.6044gauc0.5183[W1]Epoch3:loss0.6818acc0.6062auc0.6424gauc0.5336[W1]Epoch4:loss0.6734acc0.6955auc0.6647gauc0.5457[W1]Epoch5:loss0.6659acc0.7706auc0.6781gauc0.5525[W1]Epoch6:loss0.6540acc0.8560auc0.6905gauc0.5627[W1]Epoch7:loss0.6375acc0.9189auc0.6984gauc0.5677[W1]Epoch8:loss0.6195acc0.9509auc0.7025gauc0.5727优化思路一、调整正负样本比例也就是对负样本进行采样按时间or用户随机采样采样困难负样本其他根据实际任务的采样策略等。但是做这种任务时总是“不舍得”为数不多的数据总想着将所有数据都用上。二、调整正负样本对梯度的贡献比例分析CTR任务的损失函数一般是BCE换种不等价但是直观的理解方式就是ACC准确率。如果一个batch内有63个负样本1个正样本只需要将样本全部预测为负ACC就会很高。所以样本不均衡造成的问题是梯度被负样本淹没梯度将向着“将样本预测为负”的方向优化。解决思路既然是正样本对梯度的贡献太小那么提高正样本的贡献权重。1. balance ce loss即加权BCE标准 BCE二元交叉熵的公式LBCE(y,p)−[y⋅log⁡(p)(1−y)⋅log⁡(1−p)]\mathcal{L}_{\text{BCE}}(y, p) - \big[ y \cdot \log(p) (1 - y) \cdot \log(1 - p) \big]LBCE​(y,p)−[y⋅log(p)(1−y)⋅log(1−p)]对于一个批次batch的 ( N ) 个样本平均损失为LBCE−1N∑i1N[yi⋅log⁡(pi)(1−yi)⋅log⁡(1−pi)]\mathcal{L}_{\text{BCE}} -\frac{1}{N} \sum_{i1}^{N} \big[ y_i \cdot \log(p_i) (1 - y_i) \cdot \log(1 - p_i) \big]LBCE​−N1​i1∑N​[yi​⋅log(pi​)(1−yi​)⋅log(1−pi​)]对于正负样本比例1:64的1 batch数据将正样本的loss乘权重64模型优化时每看到一个正样本它的梯度贡献等价于看到 64个负样本——刚好抵消数据中的比例失衡。即LBCE(y,p)−[α⋅log⁡(p)(1−y)⋅log⁡(1−p)]\mathcal{L}_{\text{BCE}}(y, p) - \big[\alpha \cdot \log(p) (1 - y) \cdot \log(1 - p) \big]LBCE​(y,p)−[α⋅log(p)(1−y)⋅log(1−p)]其中α正样本/负样本\alpha 正样本/负样本α正样本/负样本注意此公式是一种简单情况下的简化更通用的是log§乘αlog(1 - p) 乘1-α(1−α)/α 正样本/负样本 m为正样本数n为负样本数。2. Focal loss即动态调整困难样本的权重通过修改标准的交叉熵损失函数降低对能够很好分类样本的权重(down-weights the loss assigned to well-classified examples)解决类别不均衡问题.# p_t: 正确类别的预测概率 p_t p * y_true (1 - p) * (1 - y_true) # [B, 1] # alpha_t: 类别权重 alpha_t alpha * y_true (1 - alpha) * (1 - y_true) # [B, 1] # Focal Loss ce F.binary_cross_entropy_with_logits(logits, y_true, reductionnone) fl alpha_t * (1 - p_t) ** gamma * ce