必须用imblearn而非sklearn做重采样,因sklearn无重采样功能;正确安装为pip install imbalanced-learn;采样器统一用fit_resample()而非fit_transform();SMOTE不适用于高维稀疏特征;重采样须限于训练集,测试集严禁采样。

用 imblearn 而不是 sklearn 做重采样
Scikit-learn 本身不提供重采样工具,硬要用 sklearn 处理类别不平衡(比如靠 class_weight='balanced' 或手动调 sample_weight),只能缓解训练偏差,无法生成新样本或删减多数类。真正做上采样(SMOTE)、下采样(RandomUnderSampler)或混合策略,得装并用 imbalanced-learn(imblearn)。它 API 风格和 sklearn 一致,但底层是专为不平衡设计的。
常见错误:pip install sklearn 后直接 import imblearn → 报 ModuleNotFoundError。正确做法是:
pip install imbalanced-learn,然后
from imblearn.over_sampling import SMOTE 或 from imblearn.under_sampling import RandomUnderSampler。
fit_resample() 是核心方法,别用错成 fit_transform()
imblearn 的采样器统一用 fit_resample(X, y),不是 fit_transform() —— 后者是 sklearn 预处理器的接口,混用会报错或静默出错(比如返回 shape 不匹配的数组)。
使用场景举例:训练前对原始数据做一次重采样,再进 pipeline;或者在交叉验证内每次 fold 单独 resample(避免数据泄露)。
立即学习“Python免费学习笔记(深入)”;
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 上采样示例:
smote = SMOTE(random_state=42)<br>X_res, y_res = smote.fit_resample(X_train, y_train)
- 下采样示例:
rus = RandomUnderSampler(random_state=42)<br>X_res, y_res = rus.fit_resample(X_train, y_train)
- 注意:
X_res和y_res长度变了,后续模型训练必须用这对新数据,不能还拿原X_train混用
SMOTE 不适合高维稀疏特征或文本向量
SMOTE 通过在同类样本间插值生成新样本,依赖欧氏距离。当特征维度高、稀疏(比如 TF-IDF 向量),插值结果可能落在无意义区域,甚至破坏类别边界,反而降低模型效果。
容易踩的坑:
- 对
CountVectorizer或TfidfVectorizer输出直接跑SMOTE→ 准确率不升反降 - 没做标准化就用 SMOTE(尤其数值量纲差异大时)→ 距离被某几个特征主导
- 解决办法:先用
StandardScaler归一化(仅对稠密数值特征),或换更鲁棒的方法,比如imblearn.ensemble.BalancedRandomForestClassifier,它内部自动处理不平衡,不碰原始特征
评估必须在重采样之外做,且用合适指标
重采样只该发生在训练集内部。如果在整份数据上跑 fit_resample() 再切 train/test,测试集就被污染了——这等于把未来信息“泄漏”进训练过程,评估结果虚高。
关键点:
- 永远先划分 train/test(用
train_test_split),再对X_train/y_train单独 resample - 测试集
X_test/y_test保持原样,不做任何采样 - 别只看 accuracy:类别不平衡时,accuracy 可能 >95% 却完全不会识别少数类。改用
f1_score(y_true, y_pred, average='macro')或classification_report看 per-class precision/recall/f1
复杂点在于:有些采样器(如 SMOTEENN)自带清洗步骤,有些集成方法(如 EasyEnsembleClassifier)内部多轮下采样,它们的 fit 逻辑更隐蔽——务必读文档确认是否已包含 CV 内 resampling,否则可能重复操作。

















