Sklearn中MultinomialNB维度错误:独热编码下如何适配一维标签数组?
独热编码适配MultinomialNB的维度错误解决
我有一个已完成独热编码的DataFrame(如下表所示),将其传入Sklearn模型时持续出现维度错误。由于MultinomialNB仅接受一维数组作为目标变量,请问该如何正确实现独热编码并适配模型?
| Color | Col B | Col C | Col D | Col E |
|---|---|---|---|---|
| red | 1 | 0 | 0 | 0 |
| green | 0 | 0 | 1 | 0 |
| blue | 0 | 1 | 0 | 0 |
| green | 0 | 0 | 1 | 0 |
| brown | 0 | 0 | 0 | 1 |
以下代码可正常运行:
cv = CountVectorizer(max_features = 1500) X = cv.fit_transform(df['Color']).toarray() y = df.loc[:, df.columns != 'Color'].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0)
但运行以下代码时出现错误:ValueError: y should be a 1d array
classifier = MultinomialNB() classifier.fit(X_train, y_train)
错误原因
你当前的y是独热编码后的二维数组(形状为(n_samples, n_classes)),但MultinomialNB要求目标变量必须是一维的类别标签数组(形状为(n_samples,)),每个元素对应样本的具体类别,这就是报错的核心问题。
解决方法
方法1:直接使用原始类别标签作为y
如果你的任务是用Color以外的列(Col B-E)作为特征,预测Color的类别,直接把Color列作为目标变量即可:
# 特征X取独热编码后的列(Col B-E) X = df.loc[:, df.columns != 'Color'].values # 目标y取原始类别标签(Color列) y = df['Color'].values # 拆分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=0) # 训练模型 classifier = MultinomialNB() classifier.fit(X_train, y_train) # 此时y是一维数组,可正常运行
方法2:从独热矩阵还原一维类别标签
如果你必须基于现有的独热编码列生成y,可以用np.argmax提取对应类别:
import numpy as np # 定义独热列对应的类别名称(需和表格映射一致:Col B→red,Col C→blue,Col D→green,Col E→brown) class_names = ['red', 'blue', 'green', 'brown'] # 从独热矩阵中提取每个样本对应的类别 y = class_names[np.argmax(df.loc[:, df.columns != 'Color'].values, axis=1)] # 拆分数据集并训练模型 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=0) classifier = MultinomialNB() classifier.fit(X_train, y_train)
关键注意事项
- 特征X可以是独热/词袋编码后的二维矩阵(符合Sklearn模型输入要求);
- 目标y绝对不能用独热编码,必须保持一维的类别标签形式,这是Sklearn绝大多数分类器的统一要求。
内容的提问来源于stack exchange,提问作者SwiftestKoala
相关产品推荐
相关产品推荐

