输入含np.nan时sklearn OrdinalEncoder输出结果不一致问题求解
OrdinalEncoder多场景输出不一致问题原因及解决方案
三个场景差异的核心原因
- 场景1(嵌套列表输入,自动推断类别):嵌套列表属于混合类型结构,其中的
np.nan是真实浮点空值,OrdinalEncoder自动推断类别时会默认跳过空值,不会将其纳入有效类别,转换后空值位置保留nan输出,和预期一致。 - 场景2(numpy数组输入,自动推断类别):numpy数组要求所有元素数据类型统一,当同时存入字符串和
np.nan时,np.nan会被强制转换为字符串类型的'nan',被OrdinalEncoder判定为普通有效类别,因此被分配了编码3,不符合预期。 - 场景3(手动指定categories参数):OrdinalEncoder默认
handle_unknown='error',也就是输入值只要不在指定的类别列表里就会报错,输入中的np.nan不在给定的enc_order列表中,因此抛出ValueError异常。
符合预期的实现方案
要实现「指定有序类别、空值保留不参与编码」的效果,调整代码如下:
import numpy as np from sklearn.preprocessing import OrdinalEncoder dummy_array = [["1-5"],["6-10"],["10-15"],["6-10"],["10-15"],["10-15"],["1-5"],[np.nan]] enc_order = ["1-5","6-10","10-15"] enc = OrdinalEncoder( categories=[enc_order], handle_unknown='use_encoded_value', unknown_value=np.nan ) print(enc.fit_transform(dummy_array))
输出结果如下,符合预期逻辑:
[[ 0.] [ 1.] [ 2.] [ 1.] [ 2.] [ 2.] [ 0.] [nan]]
内容的提问来源于stack exchange,提问作者adrianop01
相关产品推荐
相关产品推荐

