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

