Python使用imblearn过采样时如何按列表动态命名输出数据集
Python 中不推荐直接生成动态变量,最优方案是用字典存储键值对,键为你指定的数据集名称,值为采样后的数据集对象,后续通过键名即可直接调取对应数据。
原代码问题
- 存在多处拼写错误:
os_y_train_lust应为os_y_train_list、overampling_list应为oversampling_list、over_sampling_list应为oversampling_list - 最初将数据集名称字符串存入列表,后续循环又直接覆盖了列表对应位置的取值为采样后的数据,无法保留名称与数据的映射关系
修正后代码(推荐方案)
import imblearn.over_sampling as imbos # 配置过采样方法列表 oversampling_list = ['RandomOverSampler', 'SMOTE'] # 用字典存储采样后的数据集,key为名称,value为数据 resample_dataset = {} # 替换为你实际的原始训练数据 X_train = ... y_train = ... for sampler_name in oversampling_list: print(f'Oversampling using {sampler_name}') # 动态获取采样器类 sampler_cls = getattr(imbos, sampler_name) # 执行过采样 X_res, y_res = sampler_cls().fit_resample(X_train, y_train) # 按指定名称存入字典 resample_dataset[f'{sampler_name}_X_train_resample'] = X_res resample_dataset[f'{sampler_name}_y_train_resample'] = y_res
调用方式
后续需要调用对应数据时直接取值即可,例如调取SMOTE采样后的特征集:resample_dataset['SMOTE_X_train_resample']
不推荐的动态变量方案(仅做参考)
如果确实需要生成可直接调用的全局变量(容易污染命名空间、引发不可预知的错误,强烈不推荐),可以用以下方式实现:
for sampler_name in oversampling_list: sampler_cls = getattr(imbos, sampler_name) X_res, y_res = sampler_cls().fit_resample(X_train, y_train) globals()[f'{sampler_name}_X_train_resample'] = X_res globals()[f'{sampler_name}_y_train_resample'] = y_res
之后可直接写SMOTE_X_train_resample调取对应数据。
内容的提问来源于stack exchange,提问作者user6825943
相关产品推荐
相关产品推荐

