如何实现仅对数据集中指定类型样本的resample操作?
核心错误原因
当前代码的采样输入对象从根源上就错了:Stroke['stroke']==1 是和原数据集长度一致的布尔掩码,作用是标记哪些行属于正例,本身不是筛选完成的正例数据。把这个由真假值组成的数组丢给resample方法,自然是对布尔值本身做采样,最终返回全是True/False的结果。
正确实现流程
- 先通过布尔索引从原数据集里把所有正例的完整样本筛出来,这才是重采样要操作的对象
- 把筛好的正例子集传入
resample接口,按照需要的目标采样数执行有放回重采样 - 等重采样完成后,把新生成的正例子集和原来的负例样本上下拼起来,就得到了分布平衡的完整训练集
修正后的参考代码
# 第一步:筛选出所有原始正例样本 positive_raw = Stroke[Stroke['stroke'] == 1] # 第二步:对正例子集执行有放回重采样,目标采样总数设为800 bootstrap_positive = resample( positive_raw, replace=True, n_samples=800, random_state=1 )
实操注意事项
- 设多少
n_samples要结合实际的负例规模调整,一般平衡后正负例比例在1:2到1:1区间就够了,正例采得太多反而容易让模型过拟合重复的正例样本 - 固定
random_state的取值,能保证每次跑代码的采样结果完全可复现,不会因为采样随机性干扰后续的模型对比实验 - 重采样只能作用于拆分后的训练集部分,绝对不要碰测试集,否则会让模型评估结果完全失真
内容的提问来源于stack exchange,提问作者Dillon Hector
相关产品推荐
相关产品推荐

