You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Pandas稀疏DataFrame无法适配imblearn的RandomOverSampler?

问题原因与解决方案

报错原因

  1. Pandas稀疏DataFrame与imblearn的适配缺陷:虽然imblearn文档标注支持DataFrame类型,但针对Pandas稀疏DataFrame的处理逻辑存在问题。当传入稀疏DataFrame时,RandomOverSampler.fit_resample未能正确识别其多列稀疏结构,误将整个DataFrame当作仅含1个稀疏数组的单列处理,采样后输出形状变为(290210, 1),与原数据的52651列维度冲突,触发报错。
  2. scipy CSR矩阵的原生兼容性:直接传入scipy CSR稀疏矩阵时,imblearn会调用专门针对稀疏矩阵的处理逻辑,能准确维护数据的维度和稀疏结构,因此可以正常运行。

解决方案

方案1:先采样再转稀疏DataFrame(推荐)

保留CSR矩阵完成采样操作,之后再将结果转换为Pandas稀疏DataFrame,既规避适配问题,又能满足后续对DataFrame的需求:

import pandas as pd
from imblearn.over_sampling import RandomOverSampler

# 用CSR矩阵执行采样
x_trainvec_rand, y_train_rand = RandomOverSampler(random_state=0).fit_resample(x_trainvec, y_train)
# 将采样后的稀疏矩阵转为Pandas稀疏DataFrame
x_trainvec_rand_df = pd.DataFrame.sparse.from_spmatrix(x_trainvec_rand)

print(x_trainvec_rand_df)

方案2:升级依赖版本

尝试将imblearn和pandas升级至最新稳定版,部分版本兼容问题可能已被官方修复:

pip install --upgrade imbalanced-learn pandas

方案3:使用密集DataFrame(不推荐)

若内存充足,可将CSR矩阵转为密集DataFrame后再采样,但此方法会占用大量内存(52651列的密集矩阵内存开销极高),仅适用于小维度数据场景:

x_trainvec_dense = pd.DataFrame(x_trainvec.toarray())
x_trainvec_rand, y_train_rand = RandomOverSampler(random_state=0).fit_resample(x_trainvec_dense, y_train)

内容的提问来源于stack exchange,提问作者sazerxv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:09:23