Анатомия пайплайнов, рассеиваем туман над сложной структурой данных
Оттого что мысли мои не облекаются в слова, чаще всего они остаются хлопьями тумана. Они принимают смутные, причудливые формы, набегают одна на другую, и я тотчас их забываю (Жан-Поль Сартр). Разберем ключевые свойства 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()