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

Scikit-Learn中OneHotEncoder输出不符合预期该如何解决?

问题原因
  • OneHotEncoder在scikit-learn 1.2版本之前默认参数sparse=True,编码后会输出稀疏矩阵;同时ColumnTransformer默认参数sparse_threshold=0.3,当输出的稀疏比例超过30%时会自动返回稀疏矩阵格式,直接用np.array()包裹稀疏矩阵不会自动转为稠密数组,才会出现你看到的坐标+值的输出格式。
  • 你的数据集和核心逻辑没有问题,只是参数配置没有指定输出稠密格式。
修复方案

你可以根据自己的sklearn版本任选一种改法:

方案1:直接指定OneHotEncoder输出稠密数组(所有版本通用)

修改OneHotEncoder的初始化参数,关闭稀疏输出即可:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
import numpy as np

# sklearn >=1.2版本写法
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(sparse_output=False), [0])], remainder='passthrough')
# sklearn <1.2版本把上面的sparse_output替换为sparse,即OneHotEncoder(sparse=False)
X = ct.fit_transform(X)

方案2:对返回的稀疏矩阵手动转稠密

如果不想修改编码器参数,也可以调用稀疏矩阵的toarray()方法转成普通numpy数组:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
import numpy as np

ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough')
X = np.array(ct.fit_transform(X).toarray())

该方案仅适合特征维度较低的场景,如果你后续有上百上千个离散特征,直接转稠密会占用过多内存,建议优先使用方案1或者直接选用支持稀疏矩阵输入的模型。

两种方案执行后,X就会是你预期的[1.0, 0.0, 0.0, ..., 2017]格式的稠密数组,可以直接传入train_test_split或者回归模型使用。

内容的提问来源于stack exchange,提问作者Umut K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 18:27:04