Python中如何将自定义数据集添加到imblearn导入的数据集列表
自定义数据集复用现有不平衡处理测试代码的方法
你不需要修改imblearn库的源码往内置fetch_datasets里硬塞数据,只要把自定义数据包装成和内置数据集一致的结构,就能100%复用你写好的循环逻辑,操作步骤如下:
第一步:先明确内置数据集的结构
imblearn通过fetch_datasets()返回的是一个字典,每个键对应数据集名称,值是一个带两个属性的对象:
.data:二维特征矩阵,形状为(样本数, 特征数),要求全为数值型、无缺失值.target:一维标签向量,形状为(样本数,),二分类任务下正负类编码不管是0/1还是-1/1都能被imblearn采样器兼容
第二步:加载并预处理自己的数据集
先把你的自定义数据集加载成特征矩阵和标签向量的格式,举个最常见的读CSV的例子:
import pandas as pd # 读取本地csv数据集,假设标签列的列名为class df = pd.read_csv("你的本地数据集路径.csv") # 拆分特征和标签 X_custom = df.drop(columns=["class"]).values # 特征部分,去掉标签列 y_custom = df["class"].values # 标签部分 # 提前做基础清洗:删掉有缺失值的行、把字符串类型的类别特征转成数值编码
第三步:把自定义数据集合并到数据集字典里
用Python自带的namedtuple快速构造和内置数据集结构一致的对象,直接加到内置数据集字典里即可,不需要改后续循环的核心逻辑:
from imblearn.datasets import fetch_datasets from collections import namedtuple # 你原来导入的其他库(train_test_split、MinMaxScaler、随机森林、各类欠采样器)保持不变 # 定义和imblearn内置数据集结构一致的数据结构 ImbDataset = namedtuple("ImbDataset", ["data", "target"]) # 加载所有内置数据集 all_datasets = fetch_datasets() # 把自定义数据集加进去,给它起个好记的名字,比如my_credit_fraud all_datasets["my_credit_fraud"] = ImbDataset(data=X_custom, target=y_custom) # 数据集列表里直接加上自定义数据集的名字就行 datasets_ls = [ "thyroid_sick", "my_credit_fraud" ]
第四步:微调原循环的数据集加载行
把原来循环里data = fetch_datasets()[dataset]这一行,改成从我们刚拼好的all_datasets里取数据即可,剩下的训练集测试集拆分、归一化、欠采样测试、随机森林效果验证的代码完全不用动:
# 原循环其他部分完全不变,只改加载数据的这一行 for dataset in datasets_ls: results_dict[dataset] = {} shapes_dict[dataset] = {} print(dataset) # 原来的data = fetch_datasets()[dataset] 改成下面这行 data = all_datasets[dataset] # 下面的train_test_split、scaler、模型训练、欠采样循环逻辑全部原样保留即可 X_train, X_test, y_train, y_test = train_test_split( data.data, data.target, test_size=0.3, random_state=0, ) # ... 剩下的你原来写的代码全部不用改
常见踩坑提醒
- 不要往特征里传字符串、日期这类非数值内容,提前做编码转换,不然归一化和模型训练都会报错
- 标签必须是一维向量,这套代码默认跑二分类不平衡任务,多分类任务需要单独调整模型评估指标(比如原来的ROC-AUC要换成多分类版本)
- 如果你已经提前把自定义数据集拆好了训练集和测试集,只要在循环里加个判断,自定义数据集直接用你拆分好的X_train/y_train/X_test/y_test即可,不用走train_test_split逻辑
- 不需要修改imblearn的安装文件,上面的方法是运行时动态加载的,换环境只要把读自定义数据的路径改对就能跑,不会因为升级库丢失配置
内容的提问来源于stack exchange,提问作者Esty
相关产品推荐
相关产品推荐

