RandomForestClassifier中class_weight参数在不平衡数据集无效果问题排查
问题排查与解决方案
核心原因:SMOTE与class_weight重复作用
你已经对训练集做了SMOTE过采样,这会让训练集中的正负类样本数量趋于平衡。而class_weight的作用是在类别不平衡的训练集中,给少数类更高的权重来引导模型关注它。现在训练集已经平衡了,权重调整自然不会产生任何效果,模型测试时依然会倾向于多数类的固有分布。
具体解决方案
二选一:去掉SMOTE或放弃class_weight
如果想通过class_weight提升少数类召回率,直接使用原始不平衡的训练集训练,不要做SMOTE过采样。可以用class_weight='balanced'让sklearn自动计算权重,比手动设置更准确:model = RandomForestClassifier(bootstrap=False, criterion='gini', max_depth=24, max_features='log2', min_samples_leaf=1, min_samples_split=2, n_estimators=200, class_weight='balanced') model.fit(X_train, y_train) # 用原始训练集,不是SMOTE处理后的调整决策阈值(适合保留SMOTE的场景)
如果你想继续用SMOTE处理后的训练集,可以通过降低模型预测的决策阈值来提升少数类召回率。默认阈值是0.5,你可以用predict_proba获取概率,然后自定义阈值:y_pred_proba = model.predict_proba(X_test_outliers)[:, 1] # 降低阈值,比如设为0.3,让模型更容易预测为正类 y_pred = (y_pred_proba >= 0.3).astype(int)这个操作会让更多样本被预测为正类,直接提升少数类的召回率,同时牺牲部分精确率,符合你的预期。
检查数据一致性
确认X_test_outliers和y_test是严格对应的测试集数据,没有出现数据错位、混淆的情况,这会导致评估结果失真。
内容的提问来源于stack exchange,提问作者Raughar
相关产品推荐
相关产品推荐

