Random Forest Classifier预测阳性样本比例低于实际的原因排查
解决Random Forest在类别不平衡任务中预测阳性比例偏低的问题
1. 调整类别权重参数
Random Forest默认class_weight=None,也就是对所有类别赋予相同权重,在负类占80%的场景下,模型天然会偏向预测多数类。你可以直接设置class_weight='balanced',它会根据样本占比自动计算权重:权重与类别的样本数成反比,公式为n_samples / (n_classes * np.bincount(y));如果用的是有放回采样(默认bootstrap=True),更推荐class_weight='balanced_subsample',它会在每个决策树的采样过程中重新计算类别权重,适配采样后的样本分布。
示例代码:
from sklearn.ensemble import RandomForestClassifier clf = RandomForestClassifier(class_weight='balanced', random_state=42)
2. 手动调整决策阈值
默认的0.5阈值是为类别均衡场景设计的,在不平衡数据下完全不适用。你可以先让模型输出样本属于正类的概率,再根据目标阳性比例调整阈值:
- 用
predict_proba()获取正类概率(假设正类标签是1) - 统计概率分布,找到一个阈值,让大于该阈值的样本占比接近20%
示例代码:
# 获取测试集正类预测概率 y_proba = clf.predict_proba(X_test)[:, 1] # 取概率排名前20%的样本作为阳性预测,对应阈值为80分位数 threshold = np.percentile(y_proba, 80) y_pred = (y_proba >= threshold).astype(int)
3. 尝试样本采样策略
除了模型参数,也可以从数据层面优化:
- 过采样:对正类样本进行重复采样或生成合成样本(比如SMOTE),提升正类的样本占比
- 欠采样:随机剔除部分负类样本,缩小正负类的样本量差距
不过要注意,欠采样可能丢失负类的有效信息,过采样有一定过拟合风险,但你提到模型无过拟合迹象,可以尝试这类方法。
4. 更换更合适的评估指标
别只盯着预测阳性比例,类别不平衡任务里准确率基本没有参考价值。建议重点关注召回率(正类被正确识别的比例)、精确率、F1分数,以及PR-AUC(精确率-召回率曲线下面积)——PR-AUC对类别不平衡的敏感度远高于ROC-AUC,能更真实反映模型对正类的识别能力。
内容的提问来源于stack exchange,提问作者Jurgita-ds
相关产品推荐
相关产品推荐

