基于列最小value_count()多类别下采样,求通用高效实现方案
通用类别下采样至最小样本量的实现方案
针对类别不平衡数据集,将所有类别样本量统一下采样至最小类别样本数的需求,以下是更通用、高效的实现方案,替代硬编码的手动拆分方式:
步骤1:确定最小样本量
首先获取各类别的样本计数,提取最小样本数:
import pandas as pd from sklearn.utils import resample # 获取各类别样本量 class_counts = wisdm["activity"].value_counts() # 提取最小样本数 min_sample_count = class_counts.min()
步骤2:通用下采样实现
利用groupby分组+apply批量处理所有类别,无需手动枚举每个类别:
# 批量下采样每个类别至最小样本量 balanced_dataset = wisdm.groupby("activity", group_keys=False).apply( lambda group: resample( group, replace=False, # 下采样用无放回采样,若需有放回可改为True n_samples=min_sample_count, random_state=42 # 固定随机种子保证结果可复现 ) )
验证结果
查看处理后的类别分布,确认所有类别样本量一致:
print(balanced_dataset["activity"].value_counts())
方案优势
- 通用性强:无论数据集有多少类别,无需修改代码即可适配,新增/删除类别时自动生效
- 代码简洁:避免重复的类别拆分与合并代码,降低维护成本
- 可复现性:通过
random_state固定随机采样过程,结果稳定
补充说明
- 若需要重置索引,可在
resample后添加.reset_index(drop=True) replace=False是下采样的常规设置,仅当目标样本数大于当前类别样本量时(非当前场景)才需要设置replace=True
内容的提问来源于stack exchange,提问作者Dumb Stranger
相关产品推荐
相关产品推荐

