首页 > 解决方案 > 一种热编码保留用于插补的 NA

问题描述

我正在尝试使用 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 存储库中已经讨论过这个问题,即让 OneHotEncoder 通过参数自动处理这个handle_missing问题,但我不确定他们的工作状态。

标签: pythonscikit-learnnanmissing-dataone-hot-encoding

解决方案


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

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


推荐阅读