Sklearn的OneHotEncoder输出非表格格式,如何正确完成特征编码
问题原因
你得到的是稀疏矩阵的打印格式,本质是OneHotEncoder默认输出稀疏矩阵来降低高基数类别特征编码后的内存占用,直接用np.array()转换不会自动把稀疏矩阵转为可直接查看、适配所有模型的稠密numpy数组。
解决方法
方案1:初始化编码器时直接指定输出稠密数组(推荐)
直接在定义OneHotEncoder时配置参数,一步得到稠密数组:
- sklearn 1.2及以上版本代码:
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder import numpy as np # 新增sparse_output=False参数指定输出稠密数组 ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(sparse_output=False), [0])], remainder='passthrough') x_yam = ct.fit_transform(x_yam)
- sklearn 1.2以下旧版本,把
sparse_output=False替换为sparse=False即可。
方案2:手动转换已生成的稀疏矩阵
如果不想修改编码器初始化参数,也可以在转换后手动调用方法转稠密数组:
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder import numpy as np ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough') # 调用toarray()将稀疏矩阵转为稠密数组 x_yam = np.array(ct.fit_transform(x_yam).toarray())
注意:如果Entity列的唯一值非常多(高基数特征),转为稠密数组会占用大量内存。XGBoost、LightGBM、Sklearn自带的逻辑回归、SVM等大多数机器学习模型都原生支持稀疏矩阵输入,这种场景不需要转稠密数组,直接用原始稀疏矩阵训练即可。
内容的提问来源于stack exchange,提问作者Umut K.
相关产品推荐
相关产品推荐

