随机森林分类器异常问题:新数据近乎全预测为类别1
问题描述
我构建了两个结构完全相同的RandomForestClassifier,模型定义如下:
rf_PB = RandomForestClassifier(n_estimators=800, min_samples_split = 10, min_samples_leaf = 4, max_features = 'sqrt', max_depth = 50, bootstrap = True, random_state=59)
两者使用结构一致的数据集训练,但目标变量对应两款产品的“售出/未售出”标签:
- 训练集均含约13500条样本,类别1(售出)约7000条,类别0(未售出)约6500条,数据平衡
- 第一个模型准确率78%,
predict_proba输出的类别1概率分布合理;第二个模型训练准确率达84%,但对新客户数据预测时,近乎所有样本都被预测为类别1,概率>0.8甚至达0.99 - 业务端反馈:第一个模型可锁定约1000个高潜力客户,效果满意;第二个模型输出约120000个预测为类别1的客户,质疑训练效果
- 发现与目标变量相关性最高的特征系数为0.5,但新数据中该特征几乎全为0,无法理解此异常
训练代码如下:
X = df.drop(columns=['ValoreTrainingAI']) y = df['ValoreTrainingAI'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=4) rf_PB = RandomForestClassifier(n_estimators=800, min_samples_split = 10, min_samples_leaf = 4, max_features = 'sqrt', max_depth = 50, bootstrap = True, random_state=59) rf_PB.fit(X_train, y_train) y_pred_proba = rf_PB.predict_proba(X_test)
技术分析与解决建议
核心原因分析
关键特征的数据漂移
与目标变量强相关的特征是训练时模型区分两类的核心依据,但新数据中该特征几乎全0,导致模型失去最关键的判断维度。训练时模型依赖这个特征输出合理概率,新数据中该特征失效后,模型只能基于其他弱特征判断,而这些特征无法有效区分类别,最终倾向于预测训练集中占比略高的类别1。模型过拟合
第二个模型训练准确率(84%)远高于第一个(78%),结合max_depth=50的设置,大概率存在过拟合:过深的决策树会记住训练集的细节甚至噪声,当新数据与训练集特征分布不一致时,过拟合模型的泛化能力极差,会做出极端预测结果。概率未校准
随机森林的predict_proba输出的是基于树投票的相对概率,并非严格校准后的概率。当训练集与新数据特征分布差异较大时,这个概率会严重失真,出现大面积高概率的类别1预测。
解决办法
- 验证特征分布偏移:对比训练集和新数据中该强相关特征的分布,计算PSI(群体稳定性指标)或KS检验值,量化漂移程度。若漂移严重,说明新数据与训练集不属于同一分布,需要重新采集符合当前业务场景的训练数据。
- 降低模型复杂度:调小
max_depth(建议10-20),增大min_samples_split或min_samples_leaf,减少n_estimators,削弱模型的拟合能力,提升泛化性。 - 监控特征分布:在新数据预测前,增加关键特征的分布校验步骤,若特征分布与训练集差异超过阈值,暂停预测并触发模型更新流程。
- 校准预测概率:使用
CalibratedClassifierCV对模型进行概率校准,通过Platt缩放或isotonic回归,让模型输出的概率更贴合实际类别比例,避免极端概率值。 - 重新评估模型泛化能力:不要仅关注训练准确率,重点查看测试集的混淆矩阵、类别0的召回率、Precision-Recall曲线,确认模型在测试集上是否真能有效区分两类,而非单纯拟合训练数据。
内容的提问来源于stack exchange,提问作者Federicofkt
相关产品推荐
相关产品推荐

