Direkt zum Inhalt
HeimAnleitungenPython

XGBoost in Python verwenden Tutorial

Entdecke die Leistungsfähigkeit von XGBoost, einem der beliebtesten Frameworks für maschinelles Lernen unter Datenwissenschaftlern, mit diesem Schritt-für-Schritt-Tutorial in Python.
Aktualisierte 11. Sept. 2024  · 16 Min. lesen

XGBoost ist eines der beliebtesten Frameworks für maschinelles Lernen unter Datenwissenschaftlern. Laut der Kaggle State of Data Science Survey 2021 gaben fast 50 % der Befragten an, dass sie XGBoost verwenden, womit es nur noch hinter TensorFlow und Sklearn liegt.

Umfrage zum Stand der Datenwissenschaft Kaggle

https://www.kaggle.com/kaggle-survey-2021

Dieses XGBoost-Tutorial stellt die wichtigsten Aspekte dieses beliebten Python-Frameworks vor und zeigt dir, wie du es für deine eigenen Machine-Learning-Projekte nutzen kannst.

In diesem Video aus unserem Kurs erfährst du mehr über die Verwendung von XGBoost in Python.

Was du in diesem Python XGBoost Tutorial lernen wirst

In diesem Lernprogramm werden wir die wichtigsten Aspekte von XGBoost behandeln, darunter:

  • Installation
  • XGBoost DMatrix class
  • XGBoost Regression
  • Ziel- und Verlustfunktionen in XGBoost
  • Aufbau von Schulungs- und Evaluierungsschleifen
  • Kreuzvalidierung bei XGBoost
  • Aufbau eines XGBoost-Klassifikators
  • Wechseln zwischen Sklearn und den nativen APIs von XGBoost

Lass uns loslegen!

Führe den Code aus diesem Tutorial online aus und bearbeite ihn

Code ausführen

XGBoost Installation

Du kannst XGBoost wie jede andere Bibliothek über pip installieren. Bei dieser Installationsmethode wird auch die NVIDIA-GPU deines Computers unterstützt. Wenn du die reine CPU-Version installieren willst, kannst du conda-forge verwenden:

$ pip install --user xgboost

# CPU only

$ conda install -c conda-forge py-xgboost-cpu

# Use NVIDIA GPU

$ conda install -c conda-forge py-xgboost-gpu

Es wird empfohlen, XGBoost in einer virtuellen Umgebung zu installieren, um deine Basisumgebung nicht zu belasten.

Wir empfehlen, die Beispiele im Tutorial mit einem GPU-fähigen Rechner durchzugehen. Wenn du keins hast, kannst du dir Alternativen wie DataLab oder Google Colab ansehen.

Wenn du dich für Colab entscheidest, ist dort die alte Version von XGBoost installiert. Du solltest also pip install --upgrade xgboost anrufen, um die neueste Version zu erhalten.

Laden und Erkunden der Daten

Wir werden während des gesamten Tutorials mit dem Diamonds-Datensatz arbeiten. Sie ist in die Seaborn-Bibliothek integriert. Alternativ kannst du sie auch bei Kaggle herunterladen. Mit einer schönen Kombination aus numerischen und kategorialen Merkmalen und über 50k Beobachtungen können wir alle Vorteile von XGBoost bequem präsentieren.

import seaborn as sns

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import warnings


warnings.filterwarnings("ignore")


diamonds = sns.load_dataset("diamonds")

diamonds.head()

Diamanten-Datensatz mit 9 Merkmalen und einem Ziel

>>> diamonds.shape
(53940, 10)

In einem typischen Projekt würdest du viel mehr Zeit damit verbringen wollen, den Datensatz zu erforschen und seine Merkmale zu visualisieren. Aber da diese Daten in Seaborn integriert sind, sind sie relativ sauber.

Wir schauen uns also nur die 5-stellige Zusammenfassung der numerischen und kategorialen Merkmale an und legen los. Du kannst dir ein paar Minuten Zeit nehmen, um dich mit dem Datensatz vertraut zu machen.

diamonds.describe()

5-Nummern-Zusammenfassung

diamonds.describe(exclude=np.number)

5-Nummern-Zusammenfassung 2

Wie man eine XGBoost-DMatrix erstellt

Nachdem du mit der Erkundung fertig bist, besteht der erste Schritt in jedem Projekt darin, das Problem des maschinellen Lernens zu formulieren und die Merkmale und Zielfelder auf der Grundlage des Datensatzes zu extrahieren.

In diesem Lernprogramm werden wir zunächst versuchen, die Preise von Diamanten anhand ihrer physikalischen Maße vorherzusagen, unser Ziel ist also die Preisspalte.

Wir isolieren also die Merkmale in X und das Ziel in y:

from sklearn.model_selection import train_test_split

# Extract feature and target arrays
X, y = diamonds.drop('price', axis=1), diamonds[['price']]

Der Datensatz hat drei kategoriale Spalten. Normalerweise würdest du sie mit Ordinal- oder One-Hot-Codierung kodieren, aber XGBoost kann intern auch mit kategorialen Werten umgehen.

Um diese Funktion zu aktivieren, musst du die kategorischen Spalten in den Pandas category Datentyp umwandeln (standardmäßig werden sie als Textspalten behandelt):

# Extract text features
cats = X.select_dtypes(exclude=np.number).columns.tolist()

# Convert to Pandas category
for col in cats:
   X[col] = X[col].astype('category')

Wenn du jetzt das Attribut dtypes ausdruckst, siehst du, dass wir drei category Merkmale haben:

>>> X.dtypes
carat       float64
cut        category
color      category
clarity    category
depth       float64
table       float64
x           float64
y           float64
z           float64
dtype: object

Teilen wir die Daten in Trainings- und Testmengen auf (0,25 Testgröße):

# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)

Jetzt kommt der wichtige Teil: XGBoost verfügt über eine eigene Klasse zum Speichern von Datensätzen namens DMatrix. Es ist eine hochoptimierte Klasse für Speicher und Geschwindigkeit. Deshalb ist die Konvertierung von Datensätzen in dieses Format eine Voraussetzung für die native XGBoost-API:

import xgboost as xgb

# Create regression matrices
dtrain_reg = xgb.DMatrix(X_train, y_train, enable_categorical=True)
dtest_reg = xgb.DMatrix(X_test, y_test, enable_categorical=True)

Die Klasse akzeptiert sowohl die Trainingsmerkmale als auch die Labels. Um die automatische Kodierung der Pandas-Kategoriespalten zu aktivieren, setzen wir auch enable_categorical auf True.

Hinweis:

Warum verwenden wir die native API von XGBoost und nicht die Scikit-learn-API? Auch wenn es anfangs vielleicht bequemer ist, die Sklearn-API zu verwenden, wirst du später feststellen, dass die native API von XGBoost einige hervorragende Funktionen enthält, die die erstere nicht unterstützt. Gewöhn dich also besser von Anfang an daran. In einem Abschnitt am Ende zeigen wir jedoch, wie du mit einer einzigen Codezeile zwischen den APIs wechseln kannst, auch nachdem du Modelle trainiert hast.

Python XGBoost Regression

Nachdem du die DMatrizen erstellt hast, solltest du einen Wert für den Parameter objective wählen. Sie teilt XGBoost mit, welches maschinelle Lernproblem du zu lösen versuchst und welche Metriken oder Verlustfunktionen zur Lösung dieses Problems verwendet werden sollen.

Für die Vorhersage von Diamantenpreisen, die ein Regressionsproblem ist, kannst du zum Beispiel das gemeinsame Ziel reg:squarederror verwenden. In der Regel enthält der Name des Ziels auch den Namen der Verlustfunktion für das Problem. Bei der Regression wird üblicherweise der mittlere quadratische Fehler (Root Mean Squared Error) verwendet, der die Quadratwurzel aus der Summe der Unterschiede zwischen den tatsächlichen und den vorhergesagten Werten minimiert. Hier siehst du, wie die Metrik aussehen würde, wenn sie in NumPy implementiert wäre:

import numpy as np

mse = np.mean((actual - predicted) ** 2)
rmse = np.sqrt(mse)

Wir werden die Klassifizierungsziele später im Lernprogramm kennenlernen.

Ein Hinweis auf den Unterschied zwischen einer Verlustfunktion und einer Leistungsmetrik: Eine Verlustfunktion wird von maschinellen Lernmodellen verwendet, um die Unterschiede zwischen den tatsächlichen Werten (Ground Truth) und den Modellvorhersagen zu minimieren. Auf der anderen Seite wählt der Ingenieur für maschinelles Lernen eine Metrik (oder mehrere Metriken), um die Ähnlichkeit zwischen der Grundwahrheit und den Modellvorhersagen zu messen.

Kurz gesagt: Eine Verlustfunktion sollte minimiert werden, während eine Metrik maximiert werden sollte. Beim Training wird eine Verlustfunktion verwendet, um dem Modell zu zeigen, wo es sich verbessern muss. Bei der Bewertung wird eine Metrik verwendet, um die Gesamtleistung zu messen.

Ausbildung

Die gewählte Zielfunktion und alle anderen Hyperparameter von XGBoost sollten in einem Wörterbuch angegeben werden, das vereinbarungsgemäß params genannt wird:

# Define hyperparameters
params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}

In diesem anfänglichen params setzen wir auch tree_method auf gpu_hist, was die GPU-Beschleunigung aktiviert. Wenn du keinen Grafikprozessor hast, kannst du den Parameter weglassen oder ihn auf hist setzen.

Jetzt setzen wir einen weiteren Parameter namens num_boost_round, der für die Anzahl der Boosting-Runden steht. Intern minimiert XGBoost die Verlustfunktion RMSE in kleinen inkrementellen Runden (mehr dazu später). Dieser Parameter gibt die Anzahl dieser Runden an.

Die ideale Anzahl von Runden wird durch die Abstimmung der Hyperparameter gefunden. Für den Moment setzen wir ihn einfach auf 100:

# Define hyperparameters
params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}

n = 100
model = xgb.train(
   params=params,
   dtrain=dtrain_reg,
   num_boost_round=n,
)

Wenn XGBoost auf einer GPU läuft, ist es rasend schnell. Wenn du mit dem obigen Code keine Fehlermeldung erhalten hast, war das Training erfolgreich!

Bewertung

Während der Boosting-Runden hat das Modellobjekt alle Muster der Trainingsmenge gelernt, die es lernen kann. Jetzt müssen wir seine Leistung messen, indem wir ihn an ungesehenen Daten testen. Hier kommt unsere dtest_reg DMatrix ins Spiel:

from sklearn.metrics import mean_squared_error

preds = model.predict(dtest_reg)

Dieser Schritt des Prozesses wird als Modellbewertung (oder Inferenz) bezeichnet. Sobald du mit Predict Vorhersagen erstellt hast, übergibst du sie in der Funktion mean_squared_error von Sklearn, um sie mit y_test zu vergleichen:

rmse = mean_squared_error(y_test, preds, squared=False)

print(f"RMSE of the base model: {rmse:.3f}")
RMSE of the base model: 543.203

Wir haben einen Basiswert von ~543$, was der Leistung eines Basismodells mit Standardparametern entspricht. Es gibt zwei Möglichkeiten, sie zu verbessern - durch Kreuzvalidierung und Hyperparameter-Tuning. Aber vorher wollen wir uns noch eine schnellere Methode ansehen, um die XGBoost-Modelle zu bewerten.

Verwendung von Validierungssets beim Training

Das Training eines maschinellen Lernmodells ist wie der Start einer Rakete ins All. Bis zum Start kannst du alles über das Modell steuern, aber sobald es startet, kannst du nur noch abwarten, bis es fertig ist.

Aber das Problem mit unserem derzeitigen Trainingsverfahren ist, dass wir nicht einmal beobachten können, wohin das Modell geht. Um dieses Problem zu lösen, werden wir Evaluierungsarrays verwenden, die es uns ermöglichen, die Leistung des Modells zu sehen, wie sie über die Boosting-Runden hinweg schrittweise verbessert wird.

Lass uns zunächst die Parameter neu einstellen:

params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}
n = 100

Als nächstes erstellen wir eine Liste mit zwei Tupeln, die jeweils zwei Elemente enthalten. Das erste Element ist das Array für das auszuwertende Modell und das zweite ist der Name des Arrays.

evals = [(dtrain_reg, "train"), (dtest_reg, "validation")]

Wenn wir dieses Array an den evals Parameter von xgb.train übergeben, sehen wir die Modellleistung nach jeder Boosting-Runde:

evals = [(dtrain_reg, "train"), (dtest_reg, "validation")]

model = xgb.train(
   params=params,
   dtrain=dtrain_reg,
   num_boost_round=n,
   evals=evals,
)

Du solltest eine ähnliche Ausgabe wie die folgende erhalten (hier auf 10 Zeilen gekürzt). Du kannst sehen, wie das Modell die Punktzahl von ~3931$ auf nur 543$ minimiert.

Das Beste ist, dass wir die Leistung des Modells sowohl auf unseren Trainings- als auch auf unseren Validierungssätzen sehen können. In der Regel ist der Trainingsverlust niedriger als der Validierungsverlust, da das Modell das erste bereits gesehen hat.

[0] train-rmse:3985.18329 validation-rmse:3930.52457

[1] train-rmse:2849.72257 validation-rmse:2813.20828
[2] train-rmse:2059.86648 validation-rmse:2036.66330
[3] train-rmse:1519.32314 validation-rmse:1510.02762
[4] train-rmse:1153.68171 validation-rmse:1153.91223
...
[95] train-rmse:381.93902 validation-rmse:543.56526
[96] train-rmse:380.97024 validation-rmse:543.51413
[97] train-rmse:380.75330 validation-rmse:543.36855
[98] train-rmse:379.65918 validation-rmse:543.42558
[99] train-rmse:378.30590 validation-rmse:543.20278

In realen Projekten trainierst du in der Regel Tausende von Boosting-Runden, was bedeutet, dass du so viele Zeilen an Output hast. Um sie zu reduzieren, kannst du den Parameter verbose_eval verwenden, der XGBoost dazu zwingt, alle vebose_eval Runden Leistungsaktualisierungen zu drucken:

params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}
n = 100

evals = [(dtest_reg, "validation"), (dtrain_reg, "train")]


model = xgb.train(
   params=params,
   dtrain=dtrain_reg,
   num_boost_round=n,
   evals=evals,
   verbose_eval=10 # Every ten rounds
)

[OUT]: 

[0] train-rmse:3985.18329 validation-rmse:3930.52457
[10] train-rmse:550.08330 validation-rmse:590.15023
[20] train-rmse:488.51248 validation-rmse:551.73431
[30] train-rmse:463.13288 validation-rmse:547.87843
[40] train-rmse:447.69788 validation-rmse:546.57096
[50] train-rmse:432.91655 validation-rmse:546.22557
[60] train-rmse:421.24046 validation-rmse:546.28601
[70] train-rmse:408.64125 validation-rmse:546.78238
[80] train-rmse:396.41125 validation-rmse:544.69846
[90] train-rmse:386.87996 validation-rmse:543.82192
[99] train-rmse:378.30590 validation-rmse:543.20278

XGBoost Frühstoppen

Du hast sicher schon gemerkt, wie wichtig Boosting-Runden sind. Generell gilt: Je mehr Runden es gibt, desto mehr versucht XGBoost, den Verlust zu minimieren. Das bedeutet aber nicht, dass der Verlust immer geringer wird. Versuchen wir es mit 5000 Boosting-Runden mit der Ausführlichkeit von 500:

params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}
n = 5000

evals = [(dtest_reg, "validation"), (dtrain_reg, "train")]


model = xgb.train(
   params=params,
   dtrain=dtrain_reg,
   num_boost_round=n,
   evals=evals,
   verbose_eval=250
)

[OUT]:

[0] train-rmse:3985.18329 validation-rmse:3930.52457
[500] train-rmse:195.89184 validation-rmse:555.90367
[1000] train-rmse:122.10746 validation-rmse:563.44888
[1500] train-rmse:84.18238 validation-rmse:567.16974
[2000] train-rmse:61.66682 validation-rmse:569.52584
[2500] train-rmse:46.34923 validation-rmse:571.07632
[3000] train-rmse:37.04591 validation-rmse:571.76912
[3500] train-rmse:29.43356 validation-rmse:572.43196
[4000] train-rmse:24.00607 validation-rmse:572.81287
[4500] train-rmse:20.45021 validation-rmse:572.89062
[4999] train-rmse:17.44305 validation-rmse:573.13200

Wir bekommen den niedrigsten Verlust vor Runde 500. Danach sinkt zwar der Ausbildungsverlust, aber der Validierungsverlust (der, der uns interessiert) steigt weiter an.

Bei einer unnötigen Anzahl von Boosting-Runden beginnt XGBoost, den Datensatz zu überarbeiten und sich zu merken. Das wiederum führt dazu, dass die Validierungsleistung sinkt, weil sich das Modell merkt, anstatt zu generalisieren.

Denke daran, wir wollen die goldene Mitte: ein Modell, das im Training gerade so viele Muster gelernt hat, dass es in der Validierungsmenge die höchste Leistung erbringt. Wie finden wir also die perfekte Anzahl von Boosting-Runden?

Wir werden eine Technik anwenden, die man Frühstopp nennt. Frühzeitiges Aufhören zwingt XGBoost dazu, den Validierungsverlust zu beobachten. Wenn er sich für eine bestimmte Anzahl von Runden nicht mehr verbessert, hört er automatisch mit dem Training auf.

Das bedeutet, dass wir eine beliebig hohe Anzahl von Boosting-Runden festlegen können, solange wir eine vernünftige Anzahl von frühen Stopp-Runden festlegen.

Nehmen wir zum Beispiel 10000 Boosting-Runden und setzen den Parameter early_stopping_rounds auf 50. Auf diese Weise bricht XGBoost das Training automatisch ab, wenn sich der Validierungsverlust in 50 aufeinanderfolgenden Runden nicht verbessert.

n = 10000


model = xgb.train(
   params=params,
   dtrain=dtrain_reg,
   num_boost_round=n,
   evals=evals,
   verbose_eval=50,
   # Activate early stopping
   early_stopping_rounds=50
)

[OUT]: 

[0] train-rmse:3985.18329 validation-rmse:3930.52457
[50] train-rmse:432.91655 validation-rmse:546.22557
[100] train-rmse:377.66173 validation-rmse:542.92457
[150] train-rmse:334.27548 validation-rmse:542.79733
[167] train-rmse:321.04059 validation-rmse:543.35679

Wie du siehst, hörte das Training nach der 167. Runde auf, weil sich der Verlust schon 50 Runden vorher nicht mehr verbesserte.

XGBoost-Kreuzvalidierung

Zu Beginn des Tutorials haben wir 25 % des Datensatzes zum Testen reserviert. Mit der Testmenge können wir die Bedingungen eines Modells in der Produktion simulieren, wo es Vorhersagen für ungesehene Daten erstellen muss.

Aber ein einziger Testsatz reicht nicht aus, um genau zu messen, wie ein Modell in der Produktion abschneiden würde. Wenn wir zum Beispiel die Abstimmung der Hyperparameter nur mit einer einzigen Trainings- und einer einzigen Testmenge durchführen, würde das Wissen über die Testmenge trotzdem "durchsickern". Wie?

Da wir versuchen, den besten Wert eines Hyperparameters zu finden, indem wir die Validierungsleistung des Modells auf der Testmenge vergleichen, erhalten wir am Ende ein Modell, das so konfiguriert ist, dass es nur auf dieser bestimmten Testmenge gut funktioniert. Stattdessen wollen wir ein Modell, das in allen Bereichen gut abschneidet - bei jedem Test, den wir ihm vorlegen.

Eine mögliche Abhilfe ist die Aufteilung der Daten in drei Sätze. Das Modell wird mit der ersten Menge trainiert, die zweite Menge wird für die Bewertung und die Abstimmung der Hyperparameter verwendet und die dritte Menge ist die letzte, mit der wir das Modell vor der Produktion testen.

Aber wenn die Daten begrenzt sind, führt die Aufteilung der Daten in drei Sätze dazu, dass die Trainingsmenge dünn wird, was die Leistung des Modells beeinträchtigt.

Die Lösung für all diese Probleme ist die Kreuzvalidierung. Bei der Kreuzvalidierung haben wir immer noch zwei Sets: Training und Test.

Während die Testmenge in der Ecke wartet, teilen wir das Training in 3, 5, 7 oder k Splits oder Foldings auf. Dann trainieren wir das Modell k-mal. Jedes Mal verwenden wir k-1 Teile zum Training und den letzten k-tenTeil zur Validierung. Dieser Prozess wird als k-fache Kreuzvalidierung bezeichnet:

Kreuzvalidierung

Quelle: https://scikit-learn.org/stable/modules/cross_validation.html

Oben siehst du eine visuelle Darstellung einer 5-fachen Kreuzvalidierung. Nachdem alle Faltungen durchgeführt wurden, können wir den Mittelwert der Punktzahlen als die endgültige, realistischste Leistung des Modells betrachten.

Führen wir diesen Vorgang im Code mit der Funktion cv von XGB durch:

params = {"objective": "reg:squarederror", "tree_method": "gpu_hist"}
n = 1000

results = xgb.cv(
   params, dtrain_reg,
   num_boost_round=n,
   nfold=5,
   early_stopping_rounds=20
)

Der einzige Unterschied zur Zugfunktion ist das Hinzufügen des Parameters nfold, um die Anzahl der Splits anzugeben. Das Ergebnisobjekt ist jetzt ein DataFrame, der die Ergebnisse der einzelnen Falten enthält:

results.head()

CV-Ergebnisse

Sie hat die gleiche Anzahl an Reihen wie die Anzahl der Boosting-Runden. Jede Zeile ist der Durchschnitt aller Splits für diese Runde. Um also die beste Punktzahl zu finden, nehmen wir das Minimum der Spalte test-rmse-mean:

best_rmse = results['test-rmse-mean'].min()

best_rmse
550.8959336674216

Beachte, dass diese Methode der Kreuzvalidierung verwendet wird, um die wahre Leistung des Modells zu sehen. Wenn du mit dem Ergebnis zufrieden bist, musst du es vor dem Einsatz erneut mit den vollständigen Daten trainieren.

XGBoost-Klassifizierung

Der Aufbau eines XGBoost-Klassifikators ist so einfach wie das Ändern der Zielfunktion; der Rest kann gleich bleiben.

Die beiden beliebtesten Klassifizierungsziele sind:

  • binary:logistic - Binäre Klassifizierung (das Ziel enthält nur zwei Klassen, z. B. Katze oder Hund)
  • multi:softprob - Mehrklassen-Klassifizierung (mehr als zwei Klassen im Ziel, z. B. Apfel/Orange/Banane)

Die binäre und die Mehrklassen-Klassifizierung in XGBoost sind fast identisch, also entscheiden wir uns für Letzteres. Lass uns zuerst die Daten für die Aufgabe vorbereiten.

Wir wollen die Schliffqualität von Diamanten anhand ihres Preises und ihrer physischen Maße vorhersagen. Wir werden also die Feature-/Ziel-Arrays entsprechend aufbauen:

from sklearn.preprocessing import OrdinalEncoder

X, y = diamonds.drop("cut", axis=1), diamonds[['cut']]

# Encode y to numeric
y_encoded = OrdinalEncoder().fit_transform(y)

# Extract text features
cats = X.select_dtypes(exclude=np.number).columns.tolist()

# Convert to pd.Categorical
for col in cats:
   X[col] = X[col].astype('category')

# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, random_state=1, stratify=y_encoded)

Der einzige Unterschied besteht darin, dass XGBoost nur Zahlen im Ziel akzeptiert, während wir die Textklassen im Ziel mit OrdinalEncoder von Sklearn kodieren.

Jetzt erstellen wir die DMatrizen...

# Create classification matrices
dtrain_clf = xgb.DMatrix(X_train, y_train, enable_categorical=True)
dtest_clf = xgb.DMatrix(X_test, y_test, enable_categorical=True)

...und setze das Ziel auf multi:softprob. Für dieses Ziel muss auch die Anzahl der Klassen von uns festgelegt werden:

params = {"objective": "multi:softprob", "tree_method": "gpu_hist", "num_class": 5}
n = 1000

results = xgb.cv(
   params, dtrain_clf,
   num_boost_round=n,
   nfold=5,
   metrics=["mlogloss", "auc", "merror"],
)

Während der Kreuzvalidierung bitten wir XGBoost, drei Klassifizierungsmetriken zu beobachten, die die Leistung des Modells aus drei verschiedenen Blickwinkeln darstellen. Hier ist das Ergebnis:

results.keys()

Index(['train-mlogloss-mean', 'train-mlogloss-std', 'train-auc-mean',

      'train-auc-std', 'train-merror-mean', 'train-merror-std',

      'test-mlogloss-mean', 'test-mlogloss-std', 'test-auc-mean',

      'test-auc-std', 'test-merror-mean', 'test-merror-std'],

     dtype='object')

Um den besten AUC-Wert zu ermitteln, nehmen wir das Maximum der Spalte test-auc-mean:

>>> results['test-auc-mean'].max()
0.9402233623451636

Schon die Standardkonfiguration brachte uns 94% Leistung, was großartig ist.

XGBoost Native vs. XGBoost Sklearn

Bisher haben wir die native XGBoost-API verwendet, aber auch die Sklearn-API ist sehr beliebt.

Sklearn ist ein umfangreiches Framework mit vielen Algorithmen und Hilfsprogrammen für maschinelles Lernen und hat eine API-Syntax, die von fast jedem geliebt wird. Deshalb bietet XGBoost auch die Klassen XGBClassifier und XGBRegressor an, damit sie in das Sklearn-Ökosystem integriert werden können (mit dem Verlust eines Teils der Funktionalität).

Wenn du nur die Scikit-learn-API verwenden möchtest, wann immer es möglich ist, und nur dann zur nativen API wechselst, wenn du Zugang zu zusätzlichen Funktionen brauchst, gibt es einen Weg.

Nachdem du den XGBoost-Klassifikator oder -Regressor trainiert hast, kannst du ihn mit der Methode get_booster umwandeln:

import xgboost as xgb

# Train a model using the scikit-learn API
xgb_classifier = xgb.XGBClassifier(n_estimators=100, objective='binary:logistic', tree_method='hist', eta=0.1, max_depth=3, enable_categorical=True)
xgb_classifier.fit(X_train, y_train)

# Convert the model to a native API model
model = xgb_classifier.get_booster()

Das Modellobjekt verhält sich genau so, wie wir es in diesem Lernprogramm gesehen haben.

Fazit

Wir haben in diesem XGBoost-Tutorial viele wichtige Themen behandelt, aber es gibt noch so viele Dinge zu lernen.

Auf der Seite mit den XGBoost-Parametern erfährst du, wie du die Parameter konfigurieren kannst, um das Letzte aus deinen Modellen herauszuholen.

Wenn du auf der Suche nach einer umfassenden, allumfassenden Ressource bist, um die Bibliothek zu erlernen, schau dir unseren Kurs Extreme Gradient Boosting With XGBoost an.

Werde ein ML-Wissenschaftler

Beherrsche Python, um ein Wissenschaftler für maschinelles Lernen zu werden
Themen

Erfahre mehr über Python und XGBoost

Zertifizierung verfügbar

Course

Einführung in die Datenwissenschaft in Python

4 hr
457.6K
Tauche ein in die Datenwissenschaft mit Python und lerne, wie du deine Daten effektiv analysieren und visualisieren kannst. Du brauchst keine Programmierkenntnisse oder Erfahrungen.
See DetailsRight Arrow
Start Course
Mehr anzeigenRight Arrow