13.1. Вывод Pandas/Polars для преобразователей с API set_output
В этой части руководства пользователя объясняется, как scikit-learn поддерживает табличные данные.
13.1.1. Передача имен признаков
По умолчанию transformers scikit-learn (оцениватели с методом transform) возвращают массивы numpy (иногда также разреженные массивы). Поскольку массивы numpy не содержат имен индексов осей/измерений, до версии 1.0 pipeline.Pipeline не умел передавать имена признаков:
- Оцениватели, состоящие из одного шага, не умели обрабатывать входящие имена признаков.
- Конвейер не умел передавать имена признаков от одного шага к другому.
На практике многие варианты использования начинаются с табличных данных, например, фрейма данных pandas или фрейма данных polars, в которых есть имена столбцов/признаков.
Первый шаг к поддержке этого важного варианта использования был сделан при добавлении compose.ColumnTransformer в версии 0.20. Он служит точкой входа для применения разных оценивателей к разным признакам. В частности, он распознаёт входящие имена признаков.
Эту проблему окончательно решили в SLEP007: имена признаков, их генерация и API, реализованном в полном объёме в версии 1.1. См. основные нововведения версии 1.0 и основные нововведения версии 1.1. Если во время вызова fit оценивателю передать фрейм данных, оцениватель задаст атрибут feature_names_in_, содержащий имена признаков. Он распознаёт фреймы данных pandas, а также фреймы данных, поддерживающие протокол взаимодействия фреймов данных Python __dataframe__. Кроме того, у обученных оценивателей есть метод get_feature_names_out. get_feature_names_out преобразователя возвращает — как вы уже догадались — имена признаков, которые возвращает transform.
13.1.2. Представляем API set_output
Следующим важным шагом в поддержке фреймов данных по принципу «фрейм данных на входе — фрейм данных на выходе» стало предложение SLEP018, реализованное для фреймов данных pandas в версии 1.2, а для фреймов данных polars — в версии 1.4. В нём был представлен API set_output для настройки преобразователей, возвращающих фреймы данных pandas или polars. Формат вывода преобразователей можно настроить отдельно для каждого оценивателя, вызвав метод set_output, или глобально, задав set_config(transform_output="pandas"). Установите значение "polars" вместо "pandas", если хотите получить тот же результат, но в виде фреймов данных polars.
В общем виде это используется так:
>>> import numpy as np
>>> import pandas as pd
>>> from sklearn.compose import ColumnTransformer
>>> from sklearn.pipeline import make_pipeline
>>> from sklearn.preprocessing import OneHotEncoder
>>> from sklearn.linear_model import LinearRegression
>>> X = pd.DataFrame(
... {"animals": ["cat", "cat", "dog", "dog"], "numeric": np.linspace(-1, 1, 4)}
... )
>>> y = np.array([-1.5, 0, 0.1, 1.0])
>>> ct = ColumnTransformer(
... [("categorical", OneHotEncoder(sparse_output=False), ["animals"])],
... remainder="passthrough",
... )
>>> model = make_pipeline(ct, LinearRegression()).fit(X, y)
>>> model.feature_names_in_
array(['animals', 'numeric'], dtype=object)
>>> model[0].get_feature_names_out()
array(['categorical__animals_cat', 'categorical__animals_dog',
'remainder__numeric'], dtype=object)
>>> model[0].transform(X)
array([[ 1. , 0. , -1. ],
[ 1. , 0. , -0.33333333],
[ 0. , 1. , 0.33333333],
[ 0. , 1. , 1. ]])
Теперь то же самое, но с выводом в формате pandas:
>>> from sklearn import set_config
>>> set_config(transform_output="pandas")
>>> model[0].transform(X)
c...
| categorical__animals_cat | categorical__animals_dog | remainder__numeric | |
|---|---|---|---|
| 0 | 1.0 | 0.0 | -1.000000 |
| 1 | 1.0 | 0.0 | -0.333333 |
| 2 | 0.0 | 1.0 | 0.333333 |
| 3 | 0.0 | 1.0 | 1.000000 |
Чтобы вернуться к настройкам по умолчанию, выполните:
>>> set_config(transform_output="default")
Более подробный пример приведён в разделе Знакомство с API set_output.
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/modules/df_output_transform.html