ScikitLearn OneHotEncoder在管道中获取功能名称

2024-09-28 23:37:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个预处理特征的管道

在名义分类特征的情况下,我输入缺失值,然后使用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_namestransformer方法,将原始的标称分类特征数据输入(作为数据帧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()时,我会为空值获取一个特征名称

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

感谢您的指导

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


Tags: 方法self名称get管道namesdef特征