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

OneHotEncoder报错Shape mismatch:如何修复分类编码维度不匹配问题?

问题描述

尝试对数据集第一列(国家)执行哑变量编码,流程为:先处理缺失值,再用LabelEncoder转换分类值,最后用OneHotEncoder生成二进制列,但运行时触发错误:

Shape mismatch: if categories is an array, it has to be of shape (n_features)

用到的代码

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Data.csv')

# divide dataset to dependent variable(features) and independent variable(output)
X = dataset.iloc[: , :-1].values 
y = dataset.iloc[: ,3].values

# taking care of missing data
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')

# apply the simpleImputer on the x from column[age to salary]
imputer = imputer.fit(X[: , 1:3 ])

# replace the missing data by the processed data 
X[: , 1:3 ] = imputer.transform(X[: , 1:3 ])


#  Encoding categorical data [country]
from sklearn.preprocessing import LabelEncoder , OneHotEncoder
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[: ,0])
# creates a binary column for each category
onehotencoder_X = OneHotEncoder(categories=['France','Germany','Spain'])
X_1 = onehotencoder_X.fit_transform(X[: ,0].reshape(-1,1)).toarray()
X = np.concatenate([X_1,X[: , 1:]],axis = 1)

数据集情况

数据集包含4列:Country(取值为France、Germany、Spain)、Age、Salary、Purchased,其中Age和Salary列存在缺失值。

错误提示

报错核心为形状不匹配:若categories是数组,必须为(n_features)的形状。


修复方案

错误原因

OneHotEncoder的categories参数要求传入二维数组,每个子数组对应一个特征的类别列表。原代码中传入的是一维列表['France','Germany','Spain'],不符合参数格式要求。

另外,OneHotEncoder可直接处理字符串类型的分类特征,无需先用LabelEncoder转换为数字,能简化流程。

方式1:修正categories参数格式

保留原有LabelEncoder流程,仅修改OneHotEncoder的初始化代码:

# 将categories改为二维数组格式
onehotencoder_X = OneHotEncoder(categories=[['France','Germany','Spain']])
X_1 = onehotencoder_X.fit_transform(X[: ,0].reshape(-1,1)).toarray()
X = np.concatenate([X_1,X[: , 1:]],axis = 1)

方式2:直接对字符串特征做OneHot编码(更简洁)

跳过LabelEncoder步骤,直接处理原始的Country列字符串,同时指定categories确保编码类别固定:

#  Encoding categorical data [country]
from sklearn.preprocessing import OneHotEncoder
# 直接处理原始字符串列,无需LabelEncoder转换
onehotencoder_X = OneHotEncoder(categories=[['France','Germany','Spain']], sparse_output=False)
# 提取未做LabelEncoder转换的原始Country列
X_country = dataset.iloc[:, 0].values.reshape(-1,1)
X_1 = onehotencoder_X.fit_transform(X_country)
# 拼接编码后的列与处理好缺失值的Age、Salary列
X = np.concatenate([X_1, X[:, 1:]], axis=1)

完整修正后代码

import numpy as np
import pandas as pd

# 导入数据集
dataset = pd.read_csv('Data.csv')
X = dataset.iloc[:, :-1].values 
y = dataset.iloc[:, 3].values

# 处理缺失值
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
X[:, 1:3] = imputer.fit_transform(X[:, 1:3])

# 哑变量编码(直接处理字符串列)
from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder(categories=[['France','Germany','Spain']], sparse_output=False)
# 使用原始字符串列而非LabelEncoder转换后的数值
X_country = dataset.iloc[:, 0].values.reshape(-1,1)
X_onehot = onehotencoder.fit_transform(X_country)
# 拼接编码结果与其他特征
X = np.concatenate([X_onehot, X[:, 1:]], axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:10:33