使用OneHotEncoder编码邮政编码时得到0维数组的问题咨询
为什么用ColumnTransformer+OneHotEncoder处理numpy数组后得到0维数组?
核心原因是scikit-learn的OneHotEncoder默认返回稀疏矩阵(sparse_output=True,scikit-learn 0.23+版本默认开启),而ColumnTransformer会将OneHotEncoder的稀疏输出与其他列的密集数组拼接成一个整体的稀疏矩阵。当你直接用np.array()转换这个稀疏矩阵时,在某些场景下会意外生成0维数组——这是稀疏矩阵转numpy数组时的一个潜在问题。
你提到的缺失值处理步骤和这个问题无关,因为你的数据没有缺失,跳过SimpleImputer完全没问题。
正确的处理方式
有两种简单的解决办法:
- 在OneHotEncoder里显式设置
sparse_output=False(旧版本用sparse=False),让编码器直接返回密集numpy数组:
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder import numpy as np ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(sparse_output=False), [11])], remainder='passthrough') X = ct.fit_transform(X) # 直接返回numpy数组,无需额外转换
- 如果保留稀疏输出,使用稀疏矩阵的
.toarray()方法转换为numpy数组,而非直接用np.array():
X = ct.fit_transform(X).toarray()
你用Pandas的get_dummies能成功,是因为它默认返回密集的DataFrame或数组,不会涉及稀疏矩阵的转换问题。
内容的提问来源于stack exchange,提问作者Frederik
相关产品推荐
相关产品推荐

