【问题标题】:Accessing column names of a pandas dataframe within a custom transformer in a Sklearn pipeline with ColumnTransformer?使用 ColumnTransformer 在 Sklearn 管道中的自定义转换器中访问熊猫数据框的列名?
【发布时间】:2020-12-29 13:07:51
【问题描述】:

我需要在使用列名的管道中使用自定义转换器。但是,之前的管道转换将数据帧转换为 numpy 数组。我知道我可以从列转换器对象中检索列名之后管道已经适合,但我需要在适合步骤内访问列名。下面我的示例中的自定义转换器是一个简单的最小示例,仅用于说明,而不是真正的转换。

import pandas as pd

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, MinMaxScaler
from sklearn.base import BaseEstimator, TransformerMixin


class MyCustomTransformer(BaseEstimator, TransformerMixin):
    def my_custom_transformation(self, X):
        """
        Parameters
        ----------
        X: pandas dataframe
        """
        columns_to_keep = [col for col in X.columns if col.endswith(('_a', '_b'))]
        return columns_to_keep
    
    def fit(self, X, y=None):
        self.columns_to_keep = self.my_custom_transformation(X)
        return self

    def transform(self, X, y=None):
        return X[self.columns]

numeric_transformer = Pipeline(steps=[('minmax_scaler', MinMaxScaler())])
categorical_transformer = Pipeline(steps=[('onehot_encoder', OneHotEncoder(sparse=False))])

column_transformer = ColumnTransformer(transformers=[
    ('numeric_transformer', numeric_transformer, ['num']),
    ('categorical_transformer', categorical_transformer, ['cat']),
])

pipeline = Pipeline(steps=[
    ('column_transformer', column_transformer),
    ('my_custom_transformer', MyCustomTransformer())
])

df = pd.DataFrame(data={'num': [1,2,3], 'cat':['a', 'b', 'c']})
pipeline.fit(data_df)

理想的结果是:

transformed_df = pipeline.transform(df)
print(transformed_df)
>>>    num    cat_a    cat_b
    0    0        1        0
    1  0.5        0        1
    2    1        0        0

column_transformer 中的转换将数据帧转换为 numpy 数组,然后将其传递给自定义转换器。显然这会导致错误,因为您无法从 numpy 数组中获取列名。

我不能使用索引来访问列,因为一次性编码会导致列数未知。

如果我可以在自定义转换器的 fit 方法中访问 ColumnTransformer 对象,我可以检索列名,然后创建一个 pandas 数据框以在上面的 fit 方法中使用(?),但我没有成功找到方法来做到这一点。

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas dataframe scikit-learn pipeline


    【解决方案1】:

    请参阅我对ColumnTransformerWithNames 的建议实施,以响应how do i get_feature_names using a column transformer。 您可以用ColumnTransformerWithNames 替换对ColumnTransformer 的调用,管道的输出将是带有列名的DataFrame =)

    【讨论】:

      【解决方案2】:
      pip install sklearn-pandas-transformers
      

      从 sklearn_pandas_transformers.transformers 导入 SklearnPandasWrapper

      column_transformer = ColumnTransformer(transformers=[
          ('numeric_transformer', SklearnPandasWrapper(numeric_transformer), ['num']),
          ('categorical_transformer', SklearnPandasWrapper(categorical_transformer), ['cat']),
      ])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        • 2021-09-26
        • 1970-01-01
        • 1970-01-01
        • 2020-02-03
        • 2020-12-03
        相关资源
        最近更新 更多