【发布时间】:2021-03-02 04:14:53
【问题描述】:
我正在使用 sklearn 的管道转换器实现预处理管道。我的管道包括 sklearn 的 KNNImputer 估计器,我想用它来估算数据集中的分类特征。 (我的问题类似于这个帖子,但它不包含我的问题的答案:How to implement KNN to impute categorical features in a sklearn pipeline)
我知道分类特征必须在插补之前进行编码,这就是我遇到麻烦的地方。使用标准标签/序数/onehot 编码器,当尝试使用缺失值 (np.nan) 对分类特征进行编码时,您会收到以下错误:
ValueError: Input contains NaN
我已经设法通过创建一个自定义编码器来“绕过”它,在该编码器中我将 np.nan 替换为“缺失”:
class CustomEncoder(BaseEstimator, TransformerMixin):
def __init__(self):
self.encoder = None
def fit(self, X, y=None):
self.encoder = OrdinalEncoder()
return self.encoder.fit(X.fillna('Missing'))
def transform(self, X, y=None):
return self.encoder.transform(X.fillna('Missing'))
def fit_transform(self, X, y=None, **fit_params):
self.encoder = OrdinalEncoder()
return self.encoder.fit_transform(X.fillna('Missing'))
preprocessor = ColumnTransformer([
('categoricals', CustomEncoder(), cat_features),
('numericals', StandardScaler(), num_features)],
remainder='passthrough'
)
pipeline = Pipeline([
('preprocessing', preprocessor),
('imputing', KNNImputer(n_neighbors=5))
])
然而,在这种情况下,我无法找到一种合理的方法将编码的“缺失”值设置回 np.nan,然后再使用 KNNImputer。
我读到我可以在此线程上使用 OneHotEncoder 转换器手动执行此操作:Cyclical Loop Between OneHotEncoder and KNNImpute in Scikit-learn,但我想再次在管道中实现所有这些以自动化整个预处理阶段。
有没有人设法做到这一点?有人会推荐替代解决方案吗?使用 KNN 算法进行插补可能不值得麻烦,我应该使用简单的插补器吗?
提前感谢您的反馈!
【问题讨论】:
-
作为对第二个链接线程的一种跟进,stackoverflow.com/q/66635031/10495893 处有一个可流水线转换器。
标签: python encoding scikit-learn pipeline imputation