Применение SimpleImputer и OneHotEncoder к нескольким столбцам одновременно - PullRequest
0 голосов
/ 17 июня 2020

Я применяю следующий код для вменения, а затем кодирования категориальных данных в моем наборе данных:

    # 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])
    ])

Заранее спасибо!

1 Ответ

1 голос
/ 17 июня 2020

Если все столбцы имеют один и тот же тип, я бы просто пропустил 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 предназначен для использования для разнородных данных, когда столбцы или подмножества столбцов ввода необходимо преобразовать отдельно (прочтите здесь ). Однако, поскольку все ваши функции относятся к одному типу и требуют одной и той же процедуры предварительной обработки, вы можете просто применить SimpleImputer и OneHotEncoder ко всему набору данных, поскольку эти преобразователи автоматически обнаружат столбцы для преобразования (которые в вашем случае просто все).

...