游乐游手机版
首页/编程语言/文章详情

Python中使用SMOTE过采样处理不平衡数据集方法

时间:2026-07-13 06:51
使用SMOTE前需确保X为二维数值数组,编码分类变量、处理缺失值;k_neighbors应小于少数类样本数,固定random_state;仅对训练集重采样,并验证合成样本分布合理性,避免测试集混入假样本导致评估虚高。

使用SMOTE过采样技术前,必须确保数据已清洗干净且类型正确:X需为二维数值型数组,需剔除无关特征列、对分类变量进行编码转换、并妥善处理缺失值;k_neighbors参数应小于少数类样本数量,random_state参数务必固定;训练集与测试集须严格分离,仅对训练集实施重采样,且需验证合成样本的分布是否合理。

怎么在Python环境下针对不平衡数据集进行SMOTE过采样处理?

许多开发者在调用 fit_resample() 时遭遇报错,例如 ValueError: Expected 2D array, got 1D array insteadTypeError: A sparse matrix was passed, but dense data is required。问题的根源并不在SMOTE算法本身,而在于输入数据未达到要求。

  • X 必须是二维数组(pandas.DataFramenumpy.ndarray),不可为 pandas.Series 或一维向量
  • 所有特征列均需为数值类型——分类变量(如 genderproduct_type)须先用 pd.get_dummies()OneHotEncoder 进行编码,不能保留 object 类型
  • 缺失值需提前处理:SMOTE 无法接受 NaN,否则会触发 ValueError: Input contains NaN
  • 应避免混入ID、时间戳、文本等非特征列——这些列在 X 中必须通过 drop() 移除,否则插值结果将失去实际意义

SMOTE(random_state=42, k_neighbors=5) 的参数该如何选择

k_neighbors 是最容易被忽视却影响极大的参数。默认值为5,但并非适用于所有场景:当少数类样本总数小于 k_neighbors 时(例如只有3个欺诈样本),SMOTE 会直接报错 ValueError: Expected n_neighbors <= n_samples

  • 若少数类样本数少于20,建议将 k_neighbors 设为3或2;取值过小会导致合成样本多样性不足,过大则无法正常运行
  • random_state 必须固定,否则每次运行生成的合成样本都会不同,导致模型无法复现
  • 不要为提高“质量”而盲目增大 k_neighbors——邻居范围过大,可能将分布边缘甚至噪声点纳入范围,反而冲淡少数类的真实模式
  • 如果特征维度较高(超过50),可考虑先用 PCA 降维再执行 SMOTE,否则欧氏距离可能失效,邻居选择出现偏差

训练集与测试集必须严格分离,不可对全量数据调用 fit_resample()

这是导致线上模型效果崩塌的最常见原因。有些开发者直接将整个 df 送入 SMOTE,然后再划分训练集和测试集,导致测试集中混入了基于自身信息生成的“假样本”,使评估结果严重虚高。

  • 务必先用 train_test_split(..., stratify=y) 完成切分,然后仅对 X_trainy_train 执行 smote.fit_resample()
  • y_test 绝对不能参与任何重采样操作——它必须保持原始分布,才能真实反映模型在业务场景中的泛化能力
  • 如需使用交叉验证,应将 SMOTE 封装进 Pipeline,确保每一折的重采样独立发生在训练折内部
  • 注意:stratify=y 参数不可省略,否则切分后训练集可能不含少数类样本,导致后续 SMOTE 直接失败

过采样后不要只看 value_counts() 就认为万事大吉

各类别数量平衡了,并不代表模型效果一定会提升。常见的陷阱是合成样本集中在少数类边界附近,导致决策面被强行“撑开”,反而降低了模型的鲁棒性。

  • 利用 scatter_matrix 或 PCA 投影绘制图形,观察合成样本是否明显偏离原始少数类簇(尤其在离群点附近大量聚集的情况)
  • 检查 SMOTE 后的 X_res 是否存在极端异常值——插值本身不会越界,但如果原始数据中有未清洗的离群点,合成点可能放大其负面影响
  • 务必使用 classification_report(y_test, y_pred) 对比召回率(recall)和F1值,而非准确率(accuracy);前者才能反映模型对少数类的真实捕获能力
  • 如果合成后模型在验证集上的 precision 大幅下降(例如从0.8降至0.3),说明新样本引入了大量误判风险,应降低采样比例或改用 ADASYN 算法

实际操作中最容易被忽略的环节,是验证合成样本的几何合理性——它不体现在代码行数中,却直接决定了你花费数小时调参的成果能否真正上线运行。

来源:https://www.php.cn/faq/2812884.html
上一篇Go函数参数传递:值传递本质与指针传递适用场景 下一篇GC算法面试:标记到清理全链路过程详细解析
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Go语言AES混淆加密解密敏感数据详解
编程语言 · 2026-07-13

Go语言AES混淆加密解密敏感数据详解

Go语言AES加密需注意:密钥长度必须为16、24或32字节,否则会引发panic;CBC模式解密乱码常因IV或PKCS7填充错误;GCM模式中nonce不可重用,否则密钥可被恢复;ECB模式因明文块输出固定密文,存在安全风险,不建议使用。

C++ std::atomic::wait高性能轮询等待原子变量状态变化
编程语言 · 2026-07-13

C++ std::atomic::wait高性能轮询等待原子变量状态变化

C++20的std::atomic::wait是轻量级等待机制,需GCC11+ Clang12+及glibc≥2 34,macOS不支持。需与notify配对,注意内存序,循环检查防虚假唤醒。超时版本精度有限,高性能关键在notify时机与内存序正确性。

VSCode左侧边栏不见了?快速找回方法
编程语言 · 2026-07-13

VSCode左侧边栏不见了?快速找回方法

按Ctrl+B或Cmd+B可恢复被误触隐藏的侧边栏。若无效,需检查窗口焦点是否在编辑器、是否处于全屏或Zen模式、workbench activityBar visible配置项、扩展冲突以及远程环境同步问题,并逐一排查。

VSCode中利用Node批量修改多媒体文件元数据标签
编程语言 · 2026-07-13

VSCode中利用Node批量修改多媒体文件元数据标签

music-metadata库支持跨格式读写MP3、FLAC、M4A、WAV等音频元数据,需先用parseFile()初始化,再调用writeMetadata()写入。批量修改前必须验证写入支持,封面图片需为Uint8Array格式。在VSCode终端运行脚本比插件更可控,处理中文路径时需切换终端代码页为UTF-8并指定ID3v2 3版本以避免乱码。

用Composer引入PHP-Console-Highlighter在终端高亮代码段
编程语言 · 2026-07-13

用Composer引入PHP-Console-Highlighter在终端高亮代码段

php-console-highlighter已废弃且不兼容现代PHP,无法通过Composer安装。推荐使用clue rainbow库,执行composerrequire后调用静态方法高亮代码。若需原库,须手动下载并require_once,但存在兼容问题,不推荐生产环境。