Einführung in die set_output API#

Dieses Beispiel demonstriert die set_output API zur Konfiguration von Transformern, um pandas DataFrames auszugeben. set_output kann pro Estimator durch Aufruf der Methode set_output konfiguriert werden oder global durch Setzen von set_config(transform_output="pandas"). Details finden Sie unter SLEP018.

Zuerst laden wir den Iris-Datensatz als DataFrame, um die set_output API zu demonstrieren.

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()
Sepal-Länge (cm) Sepal-Breite (cm) Petal-Länge (cm) Petal-Breite (cm)
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


Um einen Estimator wie preprocessing.StandardScaler so zu konfigurieren, dass er DataFrames zurückgibt, rufen Sie set_output auf. Diese Funktion erfordert, dass pandas installiert ist.

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()
Sepal-Länge (cm) Sepal-Breite (cm) Petal-Länge (cm) Petal-Breite (cm)
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 kann nach fit aufgerufen werden, um transform nachträglich zu konfigurieren.

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

In einer pipeline.Pipeline konfiguriert set_output alle Schritte so, dass sie DataFrames ausgeben.

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())])
In einer Jupyter-Umgebung führen Sie diese Zelle bitte erneut aus, um die HTML-Darstellung anzuzeigen, oder vertrauen Sie dem Notebook.
Auf GitHub kann die HTML-Darstellung nicht gerendert werden. Versuchen Sie bitte, diese Seite mit nbviewer.org zu laden.


Jeder Transformer in der Pipeline ist so konfiguriert, dass er DataFrames ausgibt. Das bedeutet, dass der letzte Logistische Regressionsschritt die Merkmalsnamen der Eingabe enthält.

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

Hinweis

Wenn die Methode set_params verwendet wird, wird der Transformer durch einen neuen mit dem Standard-Ausgabeformat ersetzt.

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

Um das beabsichtigte Verhalten beizubehalten, verwenden Sie set_output auf dem neuen Transformer im Voraus.

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)

Als nächstes laden wir den Titanic-Datensatz, um set_output mit compose.ColumnTransformer und heterogenen Daten zu demonstrieren.

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)

Die set_output API kann global mit set_config und Setzen von transform_output auf "pandas" konfiguriert werden.

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

Mit der globalen Konfiguration geben alle Transformer DataFrames aus. Dies ermöglicht uns, die Koeffizienten der logistischen Regression einfach mit den entsprechenden Merkmalsnamen darzustellen.

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

Um die untenstehende config_context Funktionalität zu demonstrieren, setzen wir zunächst transform_output auf seinen Standardwert zurück.

set_config(transform_output="default")

Bei der Konfiguration des Ausgabetypen mit config_context zählt die Konfiguration zum Zeitpunkt des Aufrufs von transform oder fit_transform. Das Setzen dieser Werte nur bei der Konstruktion oder dem Anpassen des Transformers hat keine Auswirkung.

from sklearn import config_context

scaler = StandardScaler()
scaler.fit(X_train[num_cols])


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()
Alter Fahrpreis
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


außerhalb des Kontextmanagers ist die Ausgabe ein NumPy-Array

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]])

Gesamtlaufzeit des Skripts: (0 Minuten 0,143 Sekunden)

Verwandte Beispiele

Release Highlights für scikit-learn 1.2

Release Highlights für scikit-learn 1.2

Pipelines anzeigen

Pipelines anzeigen

Column Transformer mit gemischten Typen

Column Transformer mit gemischten Typen

Release Highlights für scikit-learn 1.4

Release Highlights für scikit-learn 1.4

Galerie generiert von Sphinx-Gallery