Python 为sklearn管道实现自定义一个热编码功能

Python 为sklearn管道实现自定义一个热编码功能,python,transform,pipeline,missing-data,one-hot-encoding,Python,Transform,Pipeline,Missing Data,One Hot Encoding,在与中发布的问题相关的文章中,我正在尝试创建一个自定义函数,在对分类变量进行热编码时处理NAs。该设置应适用于使用sklearn pipeline进行列车/测试拆分和建模 我的问题的一个简单可重复的例子: #Packages import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import OneHotEncod

在与中发布的问题相关的文章中,我正在尝试创建一个自定义函数,在对分类变量进行热编码时处理NAs。该设置应适用于使用
sklearn pipeline
进行列车/测试拆分和建模

我的问题的一个简单可重复的例子:

#Packages
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.impute import KNNImputer
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.linear_model import Ridge
from sklearn.impute import SimpleImputer


# Make some categorical data X and a response y and split it. 
X = pd.DataFrame(columns=["1","2"],data = [["A",np.nan],["B","A"],[np.nan,"A"],[np.nan,"B"],["B","A"],["A","B"],["C","B"],["D","E"]])
y = pd.DataFrame(data = np.array([1,5,4,6,2,3,9,9]))
X_train, X_test, Y_train, Y_test = train_test_split(X,y,test_size=0.2,random_state=42)
然后,我创建了一个自定义函数,该函数对nan执行OHE(使用中描述的过程)

然后将其组合到一个管道中,该管道使用岭回归预测y(随机选择模型,仅举个例子…)

可安装以下程序:

pipe_fit = Estimator.fit(X_train,Y_train)
但对看不见数据的测试失败:

pipe_fit.score(X_test, Y_test)

ValueError: X has 2 features, but KNNImputer is expecting 7 features as input.
这是因为
OHE\u with_nan
中的
onehotcoder
中的
handle\u unknown=“ignore
不再是“活动的”,因为它已包装到我的自定义函数中

如果只是在管道中直接使用
OneHotEncoder(handle_unknown=“ignore”)
,一切都会正常工作(但这不是我的意图,因为这会“删除”我试图插补的数据中的NAN。)

我的问题 如何在自定义函数中启用
handle_unknown=“ignore”
,以便它也可以在管道设置中对未看到的数据执行操作


希望您了解我的情况-非常感谢您的帮助!

我认为主要问题是您需要在适当的时候保存更多信息(特别是内部的
OneHotEncoder
)。我还使缺少的列标识更加可靠(我想你可能是在依赖排序,把它放在最后,但这只适用于你的样本数据,因为按字母顺序排列?)。我没有花太多时间清理东西或寻找效率

OHE_________________________________
“”“一个热编码,传播NAN。
需要一个数据帧作为输入!
"""
def配合(自身、X、y=无):
self.orig\u cols=X列
self.inputer=简单计算机(strategy=“constant”,fill\u value=“MISSING”)
X_filled=自插补器拟合变换(X)
self.ohe u=OneHotEncoder(稀疏=假,句柄未知=“忽略”)
自适配(X_填充)
self.ohe\u colnames=self.ohe\u.get\u feature\u name(X.columns)
self.missing_value_columns=np.array([“missing”在col中表示self.ohe_colnames中的col)
回归自我
def变换(自、X、y=无):
原始数据帧(self.ohe_uu.transform(self.inputer_u.transform(X)),列=self.ohe_ucolnames_u)
out_list=[]
#循环列以将0替换为正确的位置。
对于self.orig\u cols中的原始列:
tmp_data=raw_ohe[self.ohe_colnames][pd.Series(self.ohe_colnames).str.startswith(orig_col)]]
缺少_name=tmp_数据.columns[[[对于tmp_数据.columns中的col,col中的“缺少”]]
缺少索引=np。其中(tmp\U数据[缺少名称]==1)[0]
tmp_data.loc[缺少索引,:]=np.nan
tmp_数据1=tmp_数据.drop(缺少_名称,轴=1)
out\u list.append(tmp\u数据1)
out=pd.concat(out\U列表,轴=1)
返回

再次感谢Ben这真的很有帮助!
pipe_fit = Estimator.fit(X_train,Y_train)
pipe_fit.score(X_test, Y_test)

ValueError: X has 2 features, but KNNImputer is expecting 7 features as input.