обработка данных
May 11, 2023

Анатомия пайплайнов, рассеиваем туман над сложной структурой данных

Оттого что мысли мои не облекаются в слова, чаще всего они остаются хлопьями тумана. Они принимают смутные, причудливые формы, набегают одна на другую, и я тотчас их забываю (Жан-Поль Сартр). Разберем ключевые свойства sklearn пайплайна (pipeline) и приемы их модификации. Сначала создадим демонстрационный датафрейм:

import pandas as pd

df = pd.DataFrame([['food', 'apple', 'green', 10], ['not_food', 'ball', 'red', 51], 
                  ['not_food', 'basket', 'black', 132],
                  ['food', 'banana', 'yellow', 15], ['food', 'apple', 'red', 10]], 
                  columns=['target', 'cat1', 'cat2', 'num'])
df

Теперь определим пайплайн:

from sklearn.compose import make_column_transformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder

ct = make_column_transformer((StandardScaler(), ['num']),
                             (OneHotEncoder(sparse_output=False, 
                                            handle_unknown='ignore'), ['cat1']),
                             remainder='passthrough', verbose_feature_names_out=False)


pipe = Pipeline(steps=[('prep', ct)])

pipe.fit(df)

Обращаемся к элементам пайплайна

Это можно сделать через свойство named_steps:

pipe.named_steps['prep']

Также к составляющим пайплайна можно обратиться как к словарю, в качестве ключа используя имя этапа:

pipe['prep']

Обращаемся к ColumnTransformer

Одним из распространенных структурных элементов пайплайна является ColumnTransformer, для обращения к элементам которого можно использовать свойство named_transformers_ или transformers_:

pipe['prep'].named_transformers_
pipe['prep'].transformers_

Get/Set params

Общим интерфейсом получения параметров объектов sklearn выступает метод get_params. Этот способ работает как с пайплайнами, так и их структурными элементами:

pipe.get_params()

Заменим набор колонок для кодирования в трансформаторе, входящем в пайплайн. Сначала получим значение атрибута transformers:

transf_params = pipe['prep'].get_params()['transformers']
transf_params

Затем сформируем новой значение:

transf_params = [transf_params[0],(transf_params[1][0], transf_params[1][1], ['cat2'])]
transf_params

Установка свойств происходит через метод set_params. Запустим преобразования до замены параметра и после:

pipe.fit_transform(df)
pipe['prep'].set_params(transformers = transf_params)
pipe.fit_transform(df)

Просмотр названий признаков пайплайна

Осуществляется методом get_feature_names_out:

pipe.get_feature_names_out()

То же для трансформатора:

pipe['prep'].transformers_[1][1].get_feature_names_out()