一种热编码保留用于插补的 NA

Posted

技术标签:

【中文标题】一种热编码保留用于插补的 NA【英文标题】:One Hot Encoding preserve the NAs for imputation 【发布时间】:2021-06-08 08:08:36 【问题描述】:

我正在尝试使用 KNN 在 python 中输入分类变量。

为此,一种典型的方法是在之前对变量进行一次热编码。但是 sklearn OneHotEncoder() 不处理 NA,因此您需要将它们重命名为创建单独变量的名称。

可重现的小例子:

import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder
from sklearn.impute import SimpleImputer

#Create random pandas with categories to impute
data0 = pd.DataFrame(columns=["1","2"],data = [["A",np.nan],["B","A"],[np.nan,"A"],["A","B"]])

原始数据框:

data0
     1    2
0    A  NaN
1    B    A
2  NaN    A
3    A    B

继续进行一种热编码:

#Rename for sklearn OHE
enc_missing = SimpleImputer(strategy="constant",fill_value="missing")
data1 = enc_missing.fit_transform(data0)
# Perform OHE:
OHE = OneHotEncoder(sparse=False)
data_OHE = OHE.fit_transform(data1) 

Data_OHE 现在是一种热编码:

Data_OHE
array([[1., 0., 0., 0., 0., 1.],
       [0., 1., 0., 1., 0., 0.],
       [0., 0., 1., 1., 0., 0.],
       [1., 0., 0., 0., 1., 0.]])

但是由于单独的“缺失”类别 - 我没有任何 nans 可以估算了。

我想要的一种热编码输出

array([[1,        0,      np.nan, np.nan],
       [0,        1,        1,       0   ],
       [np.nan, np.nan,     1,       0   ], 
       [1,        0,        0,       1   ]
       ])

这样我就保留了 nans 以供以后估算。

你知道有什么办法吗?

据我了解,这已在 scikit-learn Github repo here 中讨论过 和here,即让OneHotEncoder 使用handle_missing 参数自动处理此问题,但我不确定他们的工作状态。

【问题讨论】:

【参考方案1】:

OneHotEncoder 中缺失值的处理最终被合并到 PR17317 中,但它只是将缺失值视为一个新类别(如果我理解正确,没有其他处理选项)。

this answer 中描述了一种手动方法。由于上面的 PR,第一步现在不是绝对必要的,但也许用自定义文本填充会更容易找到该列?

【讨论】:

谢谢,这正是我想要的! - 希望有一天能在 OneHotEncoder 中直接实现这一点.. 你好,本。我能够执行您的答案中提供的步骤来制作一个热编码。但是您将如何将其放入 sklearn 管道中呢?如果我使用 BaseEstimatorTransformerMixin 创建自己的 MyOneHotEncoder 类,则由于:“拟合数据集与要转换的数据集之间的维度不兼容”,它无法适合测试数据。我怀疑这是因为 sklearn OneHotEncoder 现在包装在我自己的类中,因此 "handle_unknown = ignore" 不再发挥其作用。可能适合在这里发表新帖子而不是评论.. Kr Kasper 我没有追求编写自定义估算器,因为它看起来不太容易且相当小众。但如果您已经开始,我(可能还有其他人)会很乐意回答具体的新问题。 但它是利基市场吗?我的意思是,我看到很多人想要使用 KNN(或其他需要 OHE 的方法)来估算分类变量,这似乎是唯一的方法?我是否完全错过了在分类变量上使用 KNN 的替代方法?管道设置更多是因为这是我的首选,以确保我们在评估模型性能时在训练/测试之间没有信息泄漏。可能会就我的问题发布另一个问题,关于如何将此自定义函数放入管道中。 我在***.com/questions/66635031/…中设置了一个新问题

以上是关于一种热编码保留用于插补的 NA的主要内容,如果未能解决你的问题,请参考以下文章

一种热编码及其与 DecisionTreeClassifier 的组合

字符串分类特征的一种热编码

一种热编码分类特征 - 仅稀疏形式

大型数据集的一种热编码

一种热编码标签和分层 K 折交叉验证

如何对变体长度特征进行一种热编码?