May 14, 2022

Композитная трансформация колонок

Рассмотрим композитные трансформаторы значений колонок, которые можно применять в пайплайнах для избирательных преобразований. Например, если требуется к части колонок применить энкодер, а к другой нормализатор. Создадим демонстрационный датафрейм:

from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import make_column_selector, make_column_transformer
import numpy as np
import pandas as pd

df = pd.DataFrame({'group': ['first', 'third', 'second', 'first'],
                   'level': [5, 3, 4, 5], 
                   'noisy':[1,2,3,4]})
df

Посредством метода make_column_transformer можно задать набор кортежей, в каждом из которых задаются класс преобразования и набор имен колонок, к которым оно применяется:

ct = make_column_transformer((OneHotEncoder(), ['group']), (StandardScaler(), ['level']) )

ct.fit_transform(df)

Если требуется задать выбор столбцов через сложные условия, можно воспользоваться make_column_selector:

зададим выбор колонок по типу:

ct = make_column_transformer((OneHotEncoder(), make_column_selector(dtype_include=object)),
                             (StandardScaler(),make_column_selector(dtype_include=np.number)))
ct.fit_transform(df)

или по регулярному выражению (аргумент pattern):

ct = make_column_transformer((OneHotEncoder(), make_column_selector(dtype_include=object)),
                             (StandardScaler(),make_column_selector(pattern=r'level'))
                            )
ct.fit_transform(df)

Аргумент remainder позволяет задать поведение в отношении оставшихся колонок. Так как по умолчанию они исключаются, чтобы сохранить, задайте remainder='passthrough':

ct = make_column_transformer((OneHotEncoder(), make_column_selector(dtype_include=object)),
                             (StandardScaler(),make_column_selector(pattern=r'level')),
                             remainder='passthrough'
                            )
ct.fit_transform(df)

В целом make_column_transformer создает объект класса ColumnTransformer с заданными по умолчанию именами преобразований:

Соответственно, композитную трансформацию можно создать с ColumnTransformer:

from sklearn.compose import ColumnTransformer
ct = ColumnTransformer([('oh', OneHotEncoder(), ['group']), ('enc', StandardScaler(), 
                                                             ['level', 'noisy'])])
ct.fit_transform(df)

Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях:

Яндекс Дзен

Telegram