Kategorische Datentransformation mit TargetEncoder

Machine LearningMachine LearningBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir lernen, wie man die TargetEncoder-Klasse aus der Scikit-learn-Bibliothek verwendet. Zielkodierung (Target Encoding) ist eine Technik, die dazu dient, kategorische Daten in numerische Daten umzuwandeln, die als Eingabe für maschinelle Lernalgorithmen verwendet werden können. Die TargetEncoder ersetzt jede Kategorie eines kategorischen Merkmals durch den Mittelwert der Zielvariablen für diese Kategorie. Diese Methode ist nützlich, wenn es eine starke Beziehung zwischen dem kategorischen Merkmal und der Zielvariablen gibt.

Tipps für die virtuelle Maschine (VM)

Nachdem die VM gestartet wurde, klicken Sie in der oberen linken Ecke auf die Registerkarte Notebook, um auf Jupyter Notebook für die Übung zuzugreifen.

Manchmal müssen Sie möglicherweise einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Aufgrund von Einschränkungen in Jupyter Notebook kann die Validierung von Operationen nicht automatisiert werden.

Wenn Sie während des Lernens Probleme haben, können Sie sich gerne an Labby wenden. Geben Sie uns nach der Sitzung Feedback, und wir werden das Problem umgehend für Sie lösen.

Installation der erforderlichen Bibliotheken

Zunächst müssen wir die erforderlichen Bibliotheken installieren. Wir werden die Bibliotheken Scikit-learn, Pandas und Matplotlib verwenden. Führen Sie den folgenden Befehl aus, um diese Bibliotheken zu installieren:

!pip install scikit-learn pandas matplotlib

Importieren der erforderlichen Bibliotheken

Als Nächstes müssen wir die erforderlichen Bibliotheken importieren. Führen Sie den folgenden Code aus, um die erforderlichen Bibliotheken zu importieren:

import numpy as np
import pandas as pd
from sklearn.preprocessing import KBinsDiscretizer, TargetEncoder
from sklearn.linear_model import Ridge
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

Erstellen eines synthetischen Datensatzes

Für dieses Lab werden wir einen synthetischen Datensatz mit drei kategorischen Merkmalen erstellen: ein informatives Merkmal mit mittlerer Kardinalität, ein nicht informatives Merkmal mit mittlerer Kardinalität und ein nicht informatives Merkmal mit hoher Kardinalität. Wir werden die KBinsDiscretizer-Klasse aus Scikit-learn verwenden, um das informative Merkmal zu generieren. Führen Sie den folgenden Code aus, um den synthetischen Datensatz zu erstellen:

n_samples = 50_000

rng = np.random.RandomState(42)
y = rng.randn(n_samples)
noise = 0.5 * rng.randn(n_samples)
n_categories = 100

kbins = KBinsDiscretizer(
    n_bins=n_categories, encode="ordinal", strategy="uniform", random_state=rng
)
X_informative = kbins.fit_transform((y + noise).reshape(-1, 1))

permuted_categories = rng.permutation(n_categories)
X_informative = permuted_categories[X_informative.astype(np.int32)]

X_shuffled = rng.permutation(X_informative)

X_near_unique_categories = rng.choice(
    int(0.9 * n_samples), size=n_samples, replace=True
).reshape(-1, 1)

X = pd.DataFrame(
    np.concatenate(
        [X_informative, X_shuffled, X_near_unique_categories],
        axis=1,
    ),
    columns=["informative", "shuffled", "near_unique"],
)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

Training eines Ridge-Regressors auf Rohdaten

In diesem Abschnitt werden wir einen Ridge-Regressor auf dem Datensatz mit und ohne Kodierung trainieren und den Einfluss des Zielkodierers (Target Encoder) mit und ohne Intervall-Kreuzvalidierung untersuchen. Zunächst werden wir ein Ridge-Modell auf den Rohmerkmalen trainieren. Führen Sie den folgenden Code aus, um das Ridge-Modell zu trainieren:

ridge = Ridge(alpha=1e-6, solver="lsqr", fit_intercept=False)

raw_model = ridge.fit(X_train, y_train)
print("Raw Model score on training set: ", raw_model.score(X_train, y_train))
print("Raw Model score on test set: ", raw_model.score(X_test, y_test))

Training eines Ridge-Regressors mit Kreuzvalidierung

Als Nächstes werden wir eine Pipeline (Pipeline) mit dem TargetEncoder und dem Ridge-Modell erstellen. Die Pipeline verwendet TargetEncoder.fit_transform, das Kreuzvalidierung nutzt. Führen Sie den folgenden Code aus, um das Ridge-Modell mit Kreuzvalidierung zu trainieren:

model_with_cv = make_pipeline(TargetEncoder(random_state=0), ridge)
model_with_cv.fit(X_train, y_train)
print("Model with CV on training set: ", model_with_cv.score(X_train, y_train))
print("Model with CV on test set: ", model_with_cv.score(X_test, y_test))

Auswerten der Koeffizienten des linearen Modells mit Kreuzvalidierung

Die Koeffizienten des linearen Modells zeigen, dass der Großteil des Gewichts auf dem Merkmal in Spaltenindex 0 liegt, welches das informative Merkmal ist. Führen Sie den folgenden Code aus, um die Koeffizienten des linearen Modells mit Kreuzvalidierung auszuwerten:

coefs_cv = pd.Series(
    model_with_cv[-1].coef_, index=model_with_cv[-1].feature_names_in_
).sort_values()
_ = coefs_cv.plot(kind="barh")

Training eines Ridge-Regressors ohne Kreuzvalidierung

Während TargetEncoder.fit_transform Intervall-Kreuzvalidierung verwendet, führt TargetEncoder.transform selbst keine Kreuzvalidierung durch. Es nutzt die Aggregation des gesamten Trainingssatzes, um die kategorischen Merkmale zu transformieren. Somit können wir TargetEncoder.fit gefolgt von TargetEncoder.transform verwenden, um die Kreuzvalidierung zu deaktivieren. Diese Kodierung wird dann an das Ridge-Modell übergeben. Führen Sie den folgenden Code aus, um das Ridge-Modell ohne Kreuzvalidierung zu trainieren:

target_encoder = TargetEncoder(random_state=0)
target_encoder.fit(X_train, y_train)
X_train_no_cv_encoding = target_encoder.transform(X_train)
X_test_no_cv_encoding = target_encoder.transform(X_test)

model_no_cv = ridge.fit(X_train_no_cv_encoding, y_train)
print(
    "Model without CV on training set: ",
    model_no_cv.score(X_train_no_cv_encoding, y_train),
)
print(
    "Model without CV on test set: ", model_no_cv.score(X_test_no_cv_encoding, y_test)
)

Auswerten der Koeffizienten des linearen Modells ohne Kreuzvalidierung

Das Ridge-Modell überanpasst sich (Overfitting), weil es im Vergleich zum informativen Merkmal mehr Gewicht auf das Merkmal mit extrem hoher Kardinalität legt. Führen Sie den folgenden Code aus, um die Koeffizienten des linearen Modells ohne Kreuzvalidierung auszuwerten:

coefs_no_cv = pd.Series(
    model_no_cv.coef_, index=model_no_cv.feature_names_in_
).sort_values()
_ = coefs_no_cv.plot(kind="barh")

Zusammenfassung

In diesem Lab haben wir gelernt, wie man die TargetEncoder-Klasse aus Scikit-learn verwendet, um kategorische Daten in numerische Daten zu transformieren, die als Eingabe für maschinelle Lernalgorithmen verwendet werden können. Wir haben auch gelernt, wie wichtig die Intervall-Kreuzvalidierung ist, um Überanpassung (Overfitting) zu vermeiden. Wir haben ein Ridge-Modell auf den Rohdaten trainiert und seine Leistung bewertet. Wir haben auch ein Ridge-Modell mit Kreuzvalidierung trainiert und die Koeffizienten des linearen Modells ausgewertet. Schließlich haben wir ein Ridge-Modell ohne Kreuzvalidierung trainiert und die Koeffizienten des linearen Modells ausgewertet.