Sklearn:是否可以在 OneHotEncoder 中为未知类别指定 null 或 NaN 值?
Sklearn: is it possible to specify null or NaN values for unknown categories in OneHotEncoder?
我正在处理混合分类变量和数字变量的数据集。有很多缺失的数据,因此,我希望通过分类器做一些插补。我目前正在使用 impyute.imputation.cs
中的 fast_knn
。 fast_knn
是一个易于使用的函数,它使用 kNN 模型填充缺失值。
我希望将一个 numpy
数组传递给 fast_knn
,其中包含分类变量的一个热编码,np.nan
用于缺少的值,与来自数字属性的数据(也有 np.nan
用于缺少的值)。
困难在于确保在将分类数据转换为一种热编码后缺失值是明显的。 如何将分类数据转换为一种热编码,以便缺失值导致 np.nan
(而不是一种热编码)? 我为此苦苦挣扎了一段时间令人尴尬的是——我的印象是 scikit
中的 OneHotEncoder
为缺失值放置了 0 填充数组,但我认为这是不正确的。
我想用一个一次性的例子。假设我有一个包含三个特征的数据集,两个分类特征和一个数字特征。这是我想要的最终结构的示例。前两个特征是分类的,第三个是数字的:
#np.nan is in place for any missing value.
[
[[0, 0], [0, 1], [1, 0], [1, 1], np.nan],
[[0, 0, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], np.nan] #Suppose this category has 8 possible values the attribute can take on.
[1, 3, np.nan, 3, 5]
]
fast_knn
会归因于 np.nan
.
我希望我的问题很清楚。请记住,分类子集非常大——145000 行 x 5 列。最好不要做一些计算上昂贵的事情。我希望有一种技术,除了将缺失值指定为分类属性可以采用的另一种值,然后遍历一个热编码以将其更改回 np.nan
.
1。一个热编码器(np.nan 不支持未知值)
如果您想采用单一热编码方法,OneHotEncoder
确实为未知值设置了一个零数组,例如考虑
from sklearn.preprocessing import OneHotEncoder
import numpy as np
import pandas as pd
enc = OneHotEncoder(handle_unknown='ignore', sparse=False)
s = pd.Series(list('abca'))
enc.fit(s.values.reshape(-1, 1))
t = enc.transform(np.array(['a', 'c', 'Other', 'b', 'Another']).reshape(-1, 1))
t
>>>
array([[1., 0., 0.],
[0., 0., 1.],
[0., 0., 0.],
[0., 1., 0.],
[0., 0., 0.]])
未知类别Other
和Another
是零数组。替换 t
中的所有零数组
zero_cond = (t == 0).all(axis=1)
t[zero_cond] = np.nan
t
>>>
array([[ 1., 0., 0.],
[ 0., 0., 1.],
[nan, nan, nan],
[ 0., 1., 0.],
[nan, nan, nan]])
您现在可以将其传递给输入器。
2。 Ordinal Encoder(未知值可以设置为np.nan)
另一种处理为未知变量设置 Nan
的分类变量的选项是 OrdinalEncoder(自 scikit-learn 版本 0.24 起)
from sklearn.preprocessing import OrdinalEncoder
enc = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=np.nan)
enc.fit(s.values.reshape(-1, 1))
enc.transform(np.array(['a', 'c', 'Other', 'b', 'Another']).reshape(-1, 1))
>>>
array([[ 0.],
[ 2.],
[nan],
[ 1.],
[nan]])
我正在处理混合分类变量和数字变量的数据集。有很多缺失的数据,因此,我希望通过分类器做一些插补。我目前正在使用 impyute.imputation.cs
中的 fast_knn
。 fast_knn
是一个易于使用的函数,它使用 kNN 模型填充缺失值。
我希望将一个 numpy
数组传递给 fast_knn
,其中包含分类变量的一个热编码,np.nan
用于缺少的值,与来自数字属性的数据(也有 np.nan
用于缺少的值)。
困难在于确保在将分类数据转换为一种热编码后缺失值是明显的。 如何将分类数据转换为一种热编码,以便缺失值导致 np.nan
(而不是一种热编码)? 我为此苦苦挣扎了一段时间令人尴尬的是——我的印象是 scikit
中的 OneHotEncoder
为缺失值放置了 0 填充数组,但我认为这是不正确的。
我想用一个一次性的例子。假设我有一个包含三个特征的数据集,两个分类特征和一个数字特征。这是我想要的最终结构的示例。前两个特征是分类的,第三个是数字的:
#np.nan is in place for any missing value.
[
[[0, 0], [0, 1], [1, 0], [1, 1], np.nan],
[[0, 0, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], np.nan] #Suppose this category has 8 possible values the attribute can take on.
[1, 3, np.nan, 3, 5]
]
fast_knn
会归因于 np.nan
.
我希望我的问题很清楚。请记住,分类子集非常大——145000 行 x 5 列。最好不要做一些计算上昂贵的事情。我希望有一种技术,除了将缺失值指定为分类属性可以采用的另一种值,然后遍历一个热编码以将其更改回 np.nan
.
1。一个热编码器(np.nan 不支持未知值)
如果您想采用单一热编码方法,OneHotEncoder
确实为未知值设置了一个零数组,例如考虑
from sklearn.preprocessing import OneHotEncoder
import numpy as np
import pandas as pd
enc = OneHotEncoder(handle_unknown='ignore', sparse=False)
s = pd.Series(list('abca'))
enc.fit(s.values.reshape(-1, 1))
t = enc.transform(np.array(['a', 'c', 'Other', 'b', 'Another']).reshape(-1, 1))
t
>>>
array([[1., 0., 0.],
[0., 0., 1.],
[0., 0., 0.],
[0., 1., 0.],
[0., 0., 0.]])
未知类别Other
和Another
是零数组。替换 t
zero_cond = (t == 0).all(axis=1)
t[zero_cond] = np.nan
t
>>>
array([[ 1., 0., 0.],
[ 0., 0., 1.],
[nan, nan, nan],
[ 0., 1., 0.],
[nan, nan, nan]])
您现在可以将其传递给输入器。
2。 Ordinal Encoder(未知值可以设置为np.nan)
另一种处理为未知变量设置 Nan
的分类变量的选项是 OrdinalEncoder(自 scikit-learn 版本 0.24 起)
from sklearn.preprocessing import OrdinalEncoder
enc = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=np.nan)
enc.fit(s.values.reshape(-1, 1))
enc.transform(np.array(['a', 'c', 'Other', 'b', 'Another']).reshape(-1, 1))
>>>
array([[ 0.],
[ 2.],
[nan],
[ 1.],
[nan]])