Python中文本分类过采样报错:ValueError(1D/2D数组不匹配)求解
Fixing "ValueError: Expected 2D array, got 1D array instead" with RandomOverSampler for Text DataFrames
这个报错我之前处理过,原因很直接:RandomOverSampler(以及绝大多数scikit-learn/imblearn的工具)要求输入的特征数据是二维数组(形状为(样本数, 特征数)),但你传入的df['Features']是一维的pandas Series(形状为(样本数,)),维度不匹配就会触发这个错误。
下面给你两种实用的解决办法:
方法1:快速修复维度问题(直接调整输入格式)
只需要把一维的Series转换成二维的DataFrame即可,用双重方括号[['Features']]就能实现(单括号返回Series,双括号返回DataFrame)。修改后的代码如下:
from imblearn.over_sampling import RandomOverSampler from collections import Counter import pandas as pd # 你的示例数据构建 df = [ ['I am going to class today']*10 + ['I am not going to class today']*4, ['Positive']*10 + ['Negative']*4 ] df = pd.DataFrame(df).transpose() df.columns=['Features','Class'] # 修正后的过采样代码 oversample = RandomOverSampler(sampling_strategy='minority') # 用df[['Features']]代替df['Features'],得到二维结构 X_over, y_over = oversample.fit_resample(df[['Features']], df['Class']) # 验证结果 print(Counter(y_over)) # 输出应该是 Counter({'Positive': 10, 'Negative': 10})
方法2:符合文本分类流程的规范做法
实际文本分类任务中,原始字符串无法直接用于建模,必须先转换成数值型的二维特征矩阵(比如TF-IDF、词袋特征)。因此更合理的流程是先做文本特征提取,再执行过采样,这样既解决了维度问题,也为后续建模做好准备:
from imblearn.over_sampling import RandomOverSampler from collections import Counter import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer # 示例数据构建(同上) df = [ ['I am going to class today']*10 + ['I am not going to class today']*4, ['Positive']*10 + ['Negative']*4 ] df = pd.DataFrame(df).transpose() df.columns=['Features','Class'] # 第一步:将文本转换为TF-IDF特征(得到二维稀疏矩阵) vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(df['Features']) y = df['Class'] # 第二步:执行过采样 oversample = RandomOverSampler(sampling_strategy='minority') X_over, y_over = oversample.fit_resample(X, y) # 验证结果 print(Counter(y_over)) # 后续可以直接用X_over和y_over训练分类模型
如果只是临时解决当前的报错,方法1足够;但如果是完整的文本分类项目,更推荐方法2,它更贴合实际建模流程。
内容的提问来源于stack exchange,提问作者user86907
相关产品推荐
相关产品推荐

