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
相关产品推荐
相关产品推荐

