Hinweis
Gehen Sie zum Ende, um den vollständigen Beispielcode herunterzuladen oder dieses Beispiel über JupyterLite oder Binder in Ihrem Browser auszuführen.
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()
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()
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)
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()

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