首页 > 解决方案 > Scikit-Learn OneHotEncoder - 管道中的 get_feature_names

问题描述

我有一个预处理功能的管道。

在名义分类特征的情况下,我估算缺失值,然后使用 scikit-learn onehotencoder 进行一次热编码。

稍后我想获得这些转换后的特征的名称。

所以这里是代码:

正如我所说,对于名义特征,我有一个看起来像这样的管道:

    pipeline_categorical_nominal = Pipeline(steps=[
        ('ColumnSelector', ColumnSelector(feature_lists_dict['categorical_features_nominal'])),
        ('cat_impute_binary', CategoricalImputeNominal(cat_impute_approach)),
        ('create_dummies', DummyCreator())
    ])

我的自定义转换器类DummyCreator()如下所示:

   class DummyCreator(BaseEstimator, TransformerMixin):

        def __init__(self):
            self.enc = None

        def fit(self, X, y=None):
            self.enc = OneHotEncoder(handle_unknown='ignore').fit(X)
            return self

        def transform(self, X):
            ohc = self.enc
            X_categorical_scaled = ohc.transform(X)
            transformed_cols = ohc.get_feature_names(X.columns)
            X_categorical_scaled_df = pd.DataFrame.sparse.from_spmatrix(X_categorical_scaled,
                                                                        index= X.index,
                                                                        columns=transformed_cols)
            return X_categorical_scaled_df

        def get_feature_names(self, X):
            ohc = self.enc
            transformed_cols = ohc.get_feature_names(X.columns)
            return transformed_cols

执行时fittransform管道工作正常。因为我在一个热编码特征被正确转换为二进制列之前估算了缺失值。

我的问题是运行管道之后(实际上是更大的功能联合的一部分)。我想为预处理特征列表提取转换后的名义分类特征的名称。所以我最终重新初始化类(这是错误的),调用get_feature_names转换器方法,在(作为 dataframe X)中输入原始标称分类特征数据,拟合并onehotencoder使用该get_feature_names库中的方法(不要与我的方法混淆同名)。

        dc_class = DummyCreator()
        categorical_features_nominal_label_list = dc_class.get_feature_names(
            X_train[feature_lists_dict['categorical_features_nominal']])

当我这样做时,因为我没有使用管道和估算缺失值,所以当我使用时,onehotencoder.get_feature_names() 我会得到一个 null values 的功能名称

我想我可以删除其中包含“无”的功能名称,但这似乎是一种草率(并且可能不准确)的处理方式。onehotencoder.fit()在使用或'onehotencoder.get_feature_names()'时,是否有某种方法可以忽略缺失值作为一个类?就像我说的那样,我可以得到想要的结果,但它们看起来真的很草率。

指导表示赞赏。

正如您在上面看到的,我的自定义类中有一个方法get_feature_names

标签: pythonscikit-learnone-hot-encoding

解决方案


推荐阅读