imblearn库的smote等采样方法要求输入数据为数值型、无缺失值、y为1d离散标签(整数或字符串),否则会报错;必须先清洗数据并验证格式,再应用采样。

Imblearn 库的过采样和欠采样方法不能直接套用在所有数据上——关键看你的标签是否是 numpy.ndarray 或 pandas.Series,且必须是 1D、无缺失值、类别标签为整数或字符串(不能是浮点数或嵌套结构)。
SMOTE 过采样前必须检查输入格式
SMOTE 会拒绝处理含 nan、inf 的特征,也要求 y 是一维离散标签。常见报错如 ValueError: Expected n_neighbors ,往往是因为某类样本数少于默认 <code>n_neighbors=5。
- 先运行
print(y.value_counts() if hasattr(y, 'value_counts') else np.bincount(y))确认最小类样本数 - 若某类只有 2 个样本,需显式设
SMOTE(n_neighbors=1) - 特征矩阵
X必须是float64或float32;若含object列(如原始字符串),SMOTE会直接报错 - 别在 pipeline 外对整个
X做标准化再送入SMOTE——它内部不自动缩放,但距离计算依赖量纲,建议先用StandardScaler预处理
RandomUnderSampler 欠采样时类别丢失风险
默认 RandomUnderSampler 对每类随机删样本,但如果某类原始只有 1 个样本,而你设了 sampling_strategy=0.5(保留 50%),结果可能删掉它——导致训练时该类彻底消失,后续 predict 报 ValueError: y_true and y_pred contain different number of classes。
- 用
sampling_strategy='not minority'更安全,它只对多数类下采样,保留所有少数类样本 - 想精确控制每类保留数量?传字典,例如
{0: 100, 1: 80, 2: 60},键为标签值,值为保留样本数 - 注意:欠采样后
X_res和y_res的索引会重置为0, 1, 2...,原pd.DataFrame的索引丢失,如有后续 join 操作需提前保存
Pipeline 中集成采样器要避开 fit_transform 陷阱
把 SMOTE 或 RandomUnderSampler 放进 sklearn.pipeline.Pipeline 时,它们只能出现在第一步,且必须用 imblearn.pipeline.Pipeline 替代原生 sklearn 版本,否则 fit_transform 会被忽略,采样根本不生效。
- 错误写法:
from sklearn.pipeline import Pipeline+SMOTE()→ 无声失败 - 正确写法:
from imblearn.pipeline import Pipeline,且采样器必须是第一个 step - 验证是否生效:在 pipeline
fit后,手动取pipeline.named_steps['smote'].sampling_strategy_查实际采样比例 - 别把采样器和
ColumnTransformer混用在同一 pipeline —— 当前版本imblearn不支持对部分列采样
最易被忽略的是:采样操作只应在训练集上做,绝不能在完整数据集或测试集上调用 fit_resample。哪怕只是想看采样效果,也要先用 train_test_split 划分好,再仅对 X_train, y_train 操作——否则数据泄露会让评估结果严重虚高。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











