【问题标题】:Applying SimpleImputer and OneHotEncoder to multiple columns at once一次将 SimpleImputer 和 OneHotEncoder 应用于多个列
【发布时间】:2020-10-06 14:24:15
【问题描述】:

我正在应用以下代码来估算并编码我的数据集中的分类数据:

    # Encoding categorical data
    # Define a Pipeline with an imputing step using SimpleImputer prior to the OneHot encoding
    from sklearn.compose import ColumnTransformer
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.impute import SimpleImputer
    from sklearn.pipeline import Pipeline

    # use strategy='constant', fill_value='missing' for imputing to preserve the categories' structure
    categorical_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
        ('encoder', OneHotEncoder(handle_unknown='ignore'))])

    preprocessor = ColumnTransformer(
        transformers=[
            ('cat', categorical_transformer, [0])
        ])

    Z = np.array(preprocessor.fit_transform(Z))

    print (Z[:,0])

我想对数组 Z 中的所有列重复这些步骤,因为 Z 包含我原始数据集中的所有分类特征。 有没有更有效的方法来做到这一点,而不是像这样列出每一列:

preprocessor = ColumnTransformer(
    transformers=[
        ('cat', categorical_transformer, [0,1,2,3,4,5,6,7,8,9,10])
    ])

提前致谢!

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    如果所有列都具有相同的类型,我会简单地省略 ColumnTransformer 并在您的情况下使用简单的管道:

    import numpy as np
    import pandas as pd
    from sklearn.impute import SimpleImputer
    from sklearn.pipeline import make_pipeline
    from sklearn.preprocessing import OneHotEncoder
    
    
    # some sample data
    X = pd.DataFrame({
        'col1': ['obj1', 'obj2', 'obj3'],
        'col2': [np.nan, 'oj3', 'oj1'],
        'col3': ['jo3', 'jo1', np.nan]
    }).astype('category')
    y = pd.Series([0, 1, 1])
    
    pipeline = make_pipeline(
        SimpleImputer(missing_values=np.nan, strategy='constant', fill_value='missing'),
        OneHotEncoder(handle_unknown='ignore', sparse=False)
    )
    
    Z = pipeline.fit_transform(X, y)
    

    ColumnTransformer 用于在输入的列或列子集需要单独转换时用于异构数据(阅读here)。但是,由于您的特征都是相同的类型并且都需要相同的预处理过程,您可以将 SimpleImputerOneHotEncoder 应用于整个数据集,因为这些转换器将自动检测要转换的列(在您的情况下是只是所有)。

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 2021-01-18
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2020-02-10
      • 2021-09-13
      • 2019-07-27
      • 2017-11-19
      相关资源
      最近更新 更多