sklearn.randomforestclassifier 的 sample_weight 参数在 fit() 中传入与样本等长的非负一维数组即可生效,用于加权分裂和 bootstrap 采样,但不可与 class_weight 同时使用。

sklearn.RandomForestClassifier 的 sample_weight 参数怎么用
直接支持,不需要额外封装。只要在 fit() 时传入一维数组即可,长度必须和训练样本数一致。
常见错误是传了 shape 为 (n_samples, 1) 的二维数组,会报 ValueError: Sample weights must be 1D array;或者权重数组里混入 NaN 或负数(sklearn 要求非负)。
- 权重值可以是任意非负浮点数,不强制归一化(内部会自动处理)
- 类别不平衡场景下,给少数类样本赋更高权重,效果通常比过采样更稳定
- 如果用
class_weight='balanced',它和sample_weight是正交机制:前者按类别自动算权重,后者按每个样本手动指定,二者不能同时使用,否则会报错ValueError: class_weight and sample_weight are not supported together
如何从类别分布推导出合理的 sample_weight
目标是让加权后的各类别样本“有效数量”接近。例如训练集有 900 个 class 0、100 个 class 1,可设 sample_weight[i] = n_samples / (n_classes * n_samples_in_class[y[i]]) —— 这正是 class_weight='balanced' 的底层逻辑。
手动实现时注意:必须先统计真实标签分布,再按每个样本的标签查表赋权,不能直接对预测结果操作。
- 用
np.bincount(y_train)快速获取各类频次 - 用
weights = len(y_train) / (len(np.unique(y_train)) * bincount[y_train])一行生成权重数组 - 若训练数据已做 stratify 划分,验证集无需加权(
sample_weight只影响训练时的树分裂,不影响 predict)
sample_weight 对单棵树和最终预测的影响路径
它作用于两个关键环节:一是 CART 分裂时计算加权基尼不纯度或加权信息增益;二是 Bootstrap 采样时按权重做有放回抽样(即高权重样本更可能被选中)。
这意味着:即使所有样本初始权重相同,每棵树的 bootstrap 子集也会不同;而权重差异越大,各树的训练分布越分化,整体模型多样性可能提升,但也可能加剧方差。
- 默认
bootstrap=True,权重直接影响采样概率;设为False后,权重只影响分裂准则,不改变输入样本集合 -
predict_proba()输出仍是各棵树投票均值,不受权重影响;但因树结构变了,结果自然不同 - 用
oob_score=True评估时,OOB 样本的评估不加权,和训练加权无耦合
验证 sample_weight 是否生效的简单方法
最直接的方式:固定 random_state,分别跑两次训练——一次全 1 权重,一次对某类样本权重翻倍,对比特征重要性(feature_importances_)是否明显偏移,或检查某棵子树的 tree_.threshold 和 tree_.children_left 是否变化。
- 打印一棵树的前几层分割点:
rf.estimators_[0].tree_.threshold[:5],两次运行结果不同就说明权重起效 - 避免用准确率判断:因为权重改的是训练目标,测试集指标波动可能不大;优先看树结构或特征重要性变化
- 调试时建议先用极小数据集(如 20 行)+
max_depth=1,便于肉眼观察分裂逻辑
实际项目中容易忽略的是:pipeline 中若含标准化或编码步骤,sample_weight 不会自动透传到前面的 transformer,必须手动在 fit() 时逐级传入,否则只有最后一步 RF 收到权重。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











