Представляем set_output API#

Этот пример продемонстрирует set_output API для настройки преобразователей на вывод pandas DataFrames. set_output может быть настроен для каждого оценщика путем вызова метода set_output методом или глобально, установив set_config(transform_output="pandas"). Подробности см. в SLEP018.

Сначала мы загружаем набор данных iris как DataFrame, чтобы продемонстрировать set_output API.

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

X, y = load_iris(as_frame=True, return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
X_train.head()
длина чашелистика (см) ширина чашелистика (см) длина лепестка (см) ширина лепестка (см)
60 5.0 2.0 3.5 1.0
1 4.9 3.0 1.4 0.2
8 4.4 2.9 1.4 0.2
93 5.0 2.3 3.3 1.0
106 4.9 2.5 4.5 1.7


Чтобы настроить оценщик, такой как preprocessing.StandardScaler для возврата DataFrame, вызовите set_output. Эта функция требует установки pandas.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler().set_output(transform="pandas")

scaler.fit(X_train)
X_test_scaled = scaler.transform(X_test)
X_test_scaled.head()
длина чашелистика (см) ширина чашелистика (см) длина лепестка (см) ширина лепестка (см)
39 -0.894264 0.798301 -1.271411 -1.327605
12 -1.244466 -0.086944 -1.327407 -1.459074
48 -0.660797 1.462234 -1.271411 -1.327605
23 -0.894264 0.576989 -1.159419 -0.933197
81 -0.427329 -1.414810 -0.039497 -0.275851


set_output может быть вызван после fit для настройки transform после факта.

scaler2 = StandardScaler()

scaler2.fit(X_train)
X_test_np = scaler2.transform(X_test)
print(f"Default output type: {type(X_test_np).__name__}")

scaler2.set_output(transform="pandas")
X_test_df = scaler2.transform(X_test)
print(f"Configured pandas output type: {type(X_test_df).__name__}")
Default output type: ndarray
Configured pandas output type: DataFrame

В pipeline.Pipeline, set_output настраивает все шаги на вывод DataFrames.

from sklearn.feature_selection import SelectPercentile
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline

clf = make_pipeline(
    StandardScaler(), SelectPercentile(percentile=75), LogisticRegression()
)
clf.set_output(transform="pandas")
clf.fit(X_train, y_train)
Pipeline(steps=[('standardscaler', StandardScaler()),
                ('selectpercentile', SelectPercentile(percentile=75)),
                ('logisticregression', LogisticRegression())])
В среде Jupyter, пожалуйста, перезапустите эту ячейку, чтобы показать HTML-представление, или доверьтесь блокноту.
На GitHub HTML-представление не может отображаться, попробуйте загрузить эту страницу с помощью nbviewer.org.


Каждый трансформер в конвейере настроен на возврат DataFrames. Это означает, что финальный шаг логистической регрессии содержит имена признаков входных данных.

clf[-1].feature_names_in_
array(['sepal length (cm)', 'petal length (cm)', 'petal width (cm)'],
      dtype=object)

Примечание

Если использовать метод set_params, преобразователь будет заменен новым с форматом вывода по умолчанию.

clf.set_params(standardscaler=StandardScaler())
clf.fit(X_train, y_train)
clf[-1].feature_names_in_
array(['x0', 'x2', 'x3'], dtype=object)

Для сохранения ожидаемого поведения используйте set_output на новом преобразователе заранее

scaler = StandardScaler().set_output(transform="pandas")
clf.set_params(standardscaler=scaler)
clf.fit(X_train, y_train)
clf[-1].feature_names_in_
array(['sepal length (cm)', 'petal length (cm)', 'petal width (cm)'],
      dtype=object)

Далее мы загружаем набор данных Titanic, чтобы продемонстрировать set_output с compose.ColumnTransformer и разнородные данные.

from sklearn.datasets import fetch_openml

X, y = fetch_openml("titanic", version=1, as_frame=True, return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)

The set_output API может быть настроен глобально с помощью set_config и установка transform_output to "pandas".

from sklearn import set_config
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, StandardScaler

set_config(transform_output="pandas")

num_pipe = make_pipeline(SimpleImputer(), StandardScaler())
num_cols = ["age", "fare"]
ct = ColumnTransformer(
    (
        ("numerical", num_pipe, num_cols),
        (
            "categorical",
            OneHotEncoder(
                sparse_output=False, drop="if_binary", handle_unknown="ignore"
            ),
            ["embarked", "sex", "pclass"],
        ),
    ),
    verbose_feature_names_out=False,
)
clf = make_pipeline(ct, SelectPercentile(percentile=50), LogisticRegression())
clf.fit(X_train, y_train)
clf.score(X_test, y_test)
0.7621951219512195

С глобальной конфигурацией все трансформеры выводят DataFrames. Это позволяет нам легко строить графики коэффициентов логистической регрессии с соответствующими именами признаков.

import pandas as pd

log_reg = clf[-1]
coef = pd.Series(log_reg.coef_.ravel(), index=log_reg.feature_names_in_)
_ = coef.sort_values().plot.barh()
plot set output

Чтобы продемонстрировать config_context функциональность ниже, давайте сначала сбросим transform_output к значению по умолчанию.

set_config(transform_output="default")

При настройке типа вывода с помощью config_context конфигурация в момент, когда transform или fit_transform вызываются - вот что имеет значение. Установка этих параметров только при создании или обучении трансформера не имеет эффекта.

from sklearn import config_context

scaler = StandardScaler()
scaler.fit(X_train[num_cols])
StandardScaler()
В среде Jupyter, пожалуйста, перезапустите эту ячейку, чтобы показать HTML-представление, или доверьтесь блокноту.
На GitHub HTML-представление не может отображаться, попробуйте загрузить эту страницу с помощью nbviewer.org.


with config_context(transform_output="pandas"):
    # the output of transform will be a Pandas DataFrame
    X_test_scaled = scaler.transform(X_test[num_cols])
X_test_scaled.head()
возраст fare
391 -0.044009 -0.125325
701 -0.880239 -0.471468
591 -1.716470 -0.124794
1196 -0.044009 -0.456257
1049 -0.671182 -0.342893


вне контекстного менеджера вывод будет массивом NumPy

X_test_scaled = scaler.transform(X_test[num_cols])
X_test_scaled[:5]
array([[-0.04400864, -0.12532481],
       [-0.88023923, -0.47146783],
       [-1.71646982, -0.12479447],
       [-0.04400864, -0.45625688],
       [-0.67118158, -0.34289311]])

Общее время выполнения скрипта: (0 минут 0.127 секунд)

Связанные примеры

Основные новости выпуска scikit-learn 1.2

Основные новости выпуска scikit-learn 1.2

Отображение конвейеров

Отображение конвейеров

Трансформер столбцов со смешанными типами

Трансформер столбцов со смешанными типами

Основные нововведения выпуска scikit-learn 1.4

Основные нововведения выпуска scikit-learn 1.4

Галерея, созданная Sphinx-Gallery