使用imblearn随机欠采样平衡数据框后,如何保存被移除的样本至新数据框?
如何保存随机欠采样中被移除的数据?
嘿,这个需求其实很好实现,RandomUnderSampler自带了一个实用参数能帮咱们拿到被保留样本的索引,反向操作就能提取出被欠采样掉的数据啦,我给你一步步拆解:
首先,你需要在初始化RandomUnderSampler时加上return_indices=True参数,这样调用fit_resample时会额外返回一个被保留样本的索引数组。接着用原数据的索引集合减去这个保留索引的集合,就能得到被移除的样本索引,最后用这些索引从原数据里把对应行取出来就行。
下面是修改后的完整代码:
import pandas as pd from imblearn.under_sampling import RandomUnderSampler # 初始化采样器,添加return_indices=True参数以获取保留样本的索引 rus = RandomUnderSampler(sampling_strategy=1, return_indices=True) # 此时fit_resample会返回三个值:平衡后的X、平衡后的y、被保留样本的索引 X_res, y_res, retained_indices = rus.fit_resample(X, y) # 生成你原本需要的平衡数据集 df1 = pd.concat([X_res, y_res], axis=1) # 计算被移除样本的索引:原数据索引集合减去保留索引集合 original_indices = set(X.index) removed_indices = original_indices - set(retained_indices) # 从原数据中提取被移除的行,组成新的DataFrame removed_df = pd.concat([X.loc[removed_indices], y.loc[removed_indices]], axis=1)
这里补充两个小细节:
- 如果你的原数据一开始就是一个完整的DataFrame(而非拆分的X和y),那直接用原DataFrame.loc[removed_indices]提取会更简洁
- 用集合操作计算被移除索引是为了兼容非连续的索引场景,避免因索引不连续导致的提取错误
内容的提问来源于stack exchange,提问作者Avi1-x
相关产品推荐
相关产品推荐

