Entdecken Sie mit diesem Schritt-für-Schritt-Tutorial in Python die Leistungsstärke von XGBoost, einem der unter Datenwissenschaftlern beliebtesten Frameworks für maschinelles Lernen.
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, XGBoost zu verwenden. Damit liegt es nur noch hinter TensorFlow und Sklearn.
Dieses XGBoost-Tutorial stellt die wichtigsten Aspekte dieses beliebten Python-Frameworks vor und zeigt, wie Sie es für Ihre eigenen Machine-Learning-Projekte verwenden können.
Sehen Sie sich dieses Video aus unserem Kurs an und erfahren Sie mehr über die Verwendung von XGBoost in Python .
Was Sie in diesem Python XGBoost-Tutorial lernen werden
In diesem Tutorial behandeln wir die wichtigsten Aspekte von XGBoost, darunter:
- Installation
- XGBoost DMatrix-Klasse
- XGBoost-Regression
- Ziel- und Verlustfunktionen in XGBoost
- Aufbau von Trainings- und Evaluierungsschleifen
- Kreuzvalidierung in XGBoost
- Erstellen eines XGBoost-Klassifikators
- Wechseln zwischen Sklearn und nativen APIs von XGBoost
Lass uns anfangen!
XGBoost-Installation
Sie können XGBoost wie jede andere Bibliothek über pip installieren . Diese Installationsmethode umfasst auch Unterstützung für die NVIDIA-GPU Ihres Computers. Wenn Sie die reine CPU-Version installieren möchten, können Sie conda-forge verwenden:
Es wird empfohlen, XGBoost in einer virtuellen Umgebung zu installieren, um Ihre Basisumgebung nicht zu beeinträchtigen.
Wir empfehlen, die Beispiele im Tutorial auf einem GPU-fähigen Computer durchzuspielen. Wenn Sie keinen haben, können Sie Alternativen wie DataLab oder Google Colab ausprobieren.
Wenn Sie sich für Colab entscheiden, ist dort die alte Version von XGBoost installiert. Sie sollten daher anrufen, pip install –upgrade xgboostum die neueste Version zu erhalten.
Laden und Erkunden der Daten
Wir werden im gesamten Tutorial mit dem Diamonds-Datensatz arbeiten. Er ist in die Seaborn-Bibliothek integriert, alternativ können Sie ihn auch von Kaggle herunterladen . Er bietet eine schöne Kombination aus numerischen und kategorischen Merkmalen und über 50.000 Beobachtungen, sodass wir alle Vorteile von XGBoost bequem demonstrieren können.
In einem typischen realen Projekt würden Sie viel mehr Zeit damit verbringen wollen, den Datensatz zu erkunden und seine Funktionen zu visualisieren. Da diese Daten jedoch in Seaborn integriert sind, sind sie relativ sauber.
Wir werden uns also nur die 5-Zahlen-Zusammenfassung der numerischen und kategorischen Merkmale ansehen und loslegen. Sie können sich einen Moment Zeit nehmen, um sich mit dem Datensatz vertraut zu machen.
So erstellen Sie eine XGBoost DMatrix
Wenn Sie mit der Erkundung fertig sind, besteht der erste Schritt in jedem Projekt darin, das maschinelle Lernproblem zu formulieren und die Feature- und Ziel-Arrays basierend auf dem Datensatz zu extrahieren.
In diesem Tutorial versuchen wir zunächst, den Preis von Diamanten anhand ihrer physikalischen Maße vorherzusagen. Unser Ziel ist also die Preisspalte.
Daher isolieren wir die Merkmale in X und das Ziel in y:
Der Datensatz hat drei kategorische Spalten. Normalerweise würden Sie sie mit Ordinal- oder One-Hot-Kodierung kodieren, aber XGBoost kann intern mit kategorischen Spalten umgehen.
Um diese Funktion zu aktivieren, müssen Sie die kategorischen Spalten in den Pandas- categoryDatentyp umwandeln (standardmäßig werden sie als Textspalten behandelt):
Wenn Sie das Attribut jetzt drucken dtypes, sehen Sie, dass wir drei categoryFunktionen haben:
Teilen wir die Daten in Trainings- und Testsätze auf (Testgröße 0,25):
Nun zum wichtigen Teil: XGBoost verfügt über eine eigene Klasse zum Speichern von Datensätzen namens DMatrix. Es handelt sich um 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:
Die Klasse akzeptiert sowohl die Trainingsfunktionen als auch die Beschriftungen. Um die automatische Kodierung von Pandas-Kategoriespalten zu aktivieren, setzen wir auch enable_categoricalTrue.
Notiz :
Warum verwenden wir die native API von XGBoost und nicht die Scikit-learn-API? Obwohl es zunächst bequemer sein mag, die Sklearn-API zu verwenden, werden Sie später feststellen, dass die native API von XGBoost einige hervorragende Funktionen enthält, die von der ersteren nicht unterstützt werden. Gewöhnen Sie sich also besser gleich von Anfang an daran. Am Ende gibt es jedoch einen Abschnitt, in dem wir zeigen, wie Sie in einer einzigen Codezeile zwischen APIs wechseln können, selbst nachdem Sie Modelle trainiert haben.
Python XGBoost-Regression
Nachdem Sie die DMatrices erstellt haben, sollten Sie einen Wert für den objectiveParameter auswählen. Er teilt XGBoost mit, welches maschinelle Lernproblem Sie lösen möchten und welche Metriken oder Verlustfunktionen zur Lösung dieses Problems verwendet werden sollen.
Um beispielsweise Diamantpreise vorherzusagen, was ein Regressionsproblem ist, können Sie das allgemeine reg:squarederrorZiel verwenden. Normalerweise enthält der Name des Ziels auch den Namen der Verlustfunktion für das Problem. Für die Regression wird häufig der Root Mean Squared Error verwendet, der die Quadratwurzel der quadrierten Summe der Differenzen zwischen tatsächlichen und vorhergesagten Werten minimiert. So würde die Metrik aussehen, wenn sie in NumPy implementiert würde:
Wir werden Klassifizierungsziele später im Tutorial lernen.
Ein Hinweis zum Unterschied zwischen einer Verlustfunktion und einer Leistungsmetrik: Eine Verlustfunktion wird von Machine-Learning-Modellen verwendet, um die Unterschiede zwischen den tatsächlichen (Ground Truth)-Werten und den Modellvorhersagen zu minimieren. Andererseits wird eine Metrik (oder Metriken) vom Machine-Learning-Ingenieur ausgewählt, um die Ähnlichkeit zwischen Ground Truth und Modellvorhersagen zu messen.
Kurz gesagt sollte eine Verlustfunktion minimiert und eine Metrik maximiert werden. Eine Verlustfunktion wird während des Trainings verwendet, um dem Modell Hinweise zu geben, wo es Verbesserungen vornehmen muss. Eine Metrik wird während der Auswertung 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 üblicherweise „params“ genannt werden sollte:
Innerhalb dieses anfänglichen Parameters paramssetzen wir auch tree_methodauf gpu_hist, wodurch die GPU-Beschleunigung aktiviert wird. Wenn Sie keine GPU haben, können Sie den Parameter weglassen oder auf setzen hist.
Nun setzen wir einen weiteren Parameter namens num_boost_round, der für die Anzahl der Boosting-Runden steht . Intern minimiert XGBoost den RMSE der Verlustfunktion in kleinen inkrementellen Runden (mehr dazu später). Dieser Parameter gibt die Anzahl dieser Runden an.
Die ideale Rundenzahl wird durch Hyperparameter-Tuning ermittelt. Für den Moment setzen wir sie einfach auf 100:
Wenn XGBoost auf einer GPU läuft, ist es rasend schnell. Wenn Sie vom obigen Code keine Fehler erhalten, war das Training erfolgreich!
Auswertung
Während der Boosting-Runden hat das Modellobjekt alle möglichen Muster des Trainingssets gelernt. Jetzt müssen wir seine Leistung messen, indem wir es mit unbekannten Daten testen. Hier dtest_regkommt unsere DMatrix ins Spiel:
Dieser Schritt des Prozesses wird als Modellbewertung (oder Inferenz) bezeichnet. Sobald Sie mit „predict“ Vorhersagen generiert haben, übergeben Sie diese an die mean_squared_errorFunktion von Sklearn, um sie mit folgenden Vergleichen zu vergleichen y_test:
Wir haben einen Basiswert von ~543 $, was der Leistung eines Basismodells mit Standardparametern entspricht. Es gibt zwei Möglichkeiten, diesen Wert zu verbessern – durch Kreuzvalidierung und Hyperparameter-Tuning. Aber vorher sehen wir uns eine schnellere Möglichkeit zur Bewertung von XGBoost-Modellen an.
Verwenden von Validierungssätzen während des Trainings
Das Trainieren eines Machine-Learning-Modells ist wie der Start einer Rakete ins All. Bis zum Start können Sie alles am Modell steuern, aber danach können Sie nur noch abwarten, bis es fertig ist.
Das Problem bei unserem aktuellen Trainingsprozess besteht jedoch darin, dass wir nicht einmal beobachten können, wohin sich das Modell entwickelt. Um dieses Problem zu lösen, verwenden wir Bewertungsarrays, mit denen wir die Leistung des Modells sehen können, während es in Boosting-Runden schrittweise verbessert wird.
Lassen Sie uns zunächst die Parameter erneut einrichten:
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.
Wenn wir dieses Array an den evalsParameter von übergeben xgb.train, sehen wir die Modellleistung nach jeder Boosting-Runde:
Sie sollten eine Ausgabe ähnlich der folgenden erhalten (hier auf nur 10 Zeilen gekürzt). Sie können sehen, wie das Modell den Score von satten ~3931 $ auf nur 543 $ minimiert.
Das Beste ist, dass wir die Leistung des Modells sowohl in unseren Trainings- als auch in unseren Validierungssätzen sehen können. Normalerweise ist der Trainingsverlust geringer als der Validierungsverlust, da das Modell ersteren bereits gesehen hat.
[0] Zug-RMSE:3985.18329 Validierung-RMSE:3930.52457
In realen Projekten trainieren Sie normalerweise Tausende von Boosting-Runden, was viele Ausgabezeilen bedeutet. Um diese zu reduzieren, können Sie den verbose_evalParameter verwenden, der XGBoost zwingt, jede Runde Leistungsupdates auszugeben vebose_eval:
Vorzeitiges Stoppen von XGBoost
Inzwischen ist Ihnen sicher klar geworden, wie wichtig Boosting-Runden sind. Generell gilt: Je mehr Runden es gibt, desto mehr versucht XGBoost, den Verlust zu minimieren. Das heißt aber nicht, dass der Verlust immer sinken wird. Versuchen wir es mit 5000 Boosting-Runden mit einer Ausführlichkeit von 500:
Den geringsten Verlust verzeichnen wir vor Runde 500. Danach nimmt der Validierungsverlust (der für uns von Belang ist) weiter zu, obwohl der Trainingsverlust weiter sinkt.
Bei einer unnötigen Anzahl von Boosting-Runden beginnt XGBoost, den Datensatz zu überanzupassen und zu speichern. Dies führt wiederum zu einem Leistungsabfall bei der Validierung, da das Modell speichert, anstatt zu verallgemeinern.
Denken Sie daran, wir wollen die goldene Mitte : ein Modell, das gerade genug Muster im Training gelernt hat, um im Validierungssatz die höchste Leistung zu erzielen. Wie finden wir also die perfekte Anzahl an Boosting-Runden?
Wir verwenden eine Technik namens „ Early Stopping“ . Durch das frühzeitige Stoppen wird XGBoost gezwungen, den Validierungsverlust zu beobachten. Wenn sich die Verbesserung für eine bestimmte Anzahl von Runden nicht mehr einstellt, wird das Training automatisch beendet.
Dies bedeutet, dass wir eine beliebig hohe Anzahl an Boosting-Runden festlegen können, solange wir eine sinnvolle Anzahl an Early-Stopp-Runden festlegen.
Nehmen wir beispielsweise 10.000 Boosting-Runden und setzen den early_stopping_roundsParameter auf 50. Auf diese Weise stoppt XGBoost das Training automatisch, wenn sich der Validierungsverlust 50 Runden in Folge nicht verbessert.
Wie man sieht, wurde das Training nach der 167. Runde abgebrochen, da sich die Abnahme in den 50 Runden davor nicht mehr verbesserte.
XGBoost-Kreuzvalidierung
Zu Beginn des Tutorials haben wir 25 % des Datensatzes für Tests reserviert. Mit dem Testsatz können wir die Bedingungen eines Modells in der Produktion simulieren, wo es Vorhersagen für unbekannte Daten generieren muss.
Aber nur ein einziger Testsatz würde nicht ausreichen, um die Leistung eines Modells in der Produktion genau zu messen. Wenn wir beispielsweise die Hyperparameteroptimierung mit nur einem einzigen Trainings- und einem einzigen Testsatz durchführen, würden dennoch Informationen über den Testsatz „durchsickern“. Wie?
Da wir versuchen, den besten Wert eines Hyperparameters zu finden, indem wir die Validierungsleistung des Modells mit dem Testsatz vergleichen, erhalten wir am Ende ein Modell, das so konfiguriert ist, dass es nur mit diesem bestimmten Testsatz gut funktioniert. Stattdessen möchten wir ein Modell, das auf ganzer Linie gut funktioniert – mit jedem Testsatz, den wir ihm zumuten.
Eine mögliche Problemumgehung besteht darin, die Daten in drei Sätze aufzuteilen. Das Modell wird mit dem ersten Satz trainiert, der zweite Satz wird zur Auswertung und Hyperparameter-Optimierung verwendet und der dritte ist der letzte Satz, mit dem wir das Modell vor der Produktion testen.
Wenn die Datenmenge jedoch begrenzt ist, führt die Aufteilung der Daten in drei Sätze dazu, dass der Trainingssatz spärlich wird, was die Modellleistung beeinträchtigt.
Die Lösung für all diese Probleme ist die Kreuzvalidierung. Bei der Kreuzvalidierung haben wir immer noch zwei Sätze: Training und Test.
Während der Testsatz in der Ecke wartet, teilen wir das Training in 3, 5, 7 oder k Splits bzw. Folds auf. Dann trainieren wir das Modell k- mal. Jedes Mal verwenden wir k-1 Teile für das Training und den letzten k -ten Teil für die Validierung. Dieser Prozess wird als k-fache Kreuzvalidierung bezeichnet:
Oben sehen Sie eine visuelle Darstellung einer 5-fachen Kreuzvalidierung. Nachdem alle Falten abgeschlossen sind, können wir den Mittelwert der Punktzahlen als endgültige, realistischste Leistung des Modells nehmen.
Lassen Sie uns diesen Vorgang im Code mithilfe der cvFunktion von XGB durchführen:
Der einzige Unterschied zur Train-Funktion besteht darin, dass der nfoldParameter hinzugefügt wird, um die Anzahl der Splits anzugeben. Das Ergebnisobjekt ist jetzt ein DataFrame, der die Ergebnisse jeder Faltung enthält:
Es hat die gleiche Anzahl von Zeilen wie die Anzahl der Boosting-Runden. Jede Zeile ist der Durchschnitt aller Splits für diese Runde. Um also das beste Ergebnis zu finden, nehmen wir das Minimum der test-rmse-meanSpalte:
Beachten Sie, dass diese Methode der Kreuzvalidierung verwendet wird, um die tatsächliche Leistung des Modells zu ermitteln. Wenn Sie mit dem Ergebnis zufrieden sind, müssen Sie es vor der Bereitstellung mit den vollständigen Daten erneut trainieren.
XGBoost-Klassifizierung
Zum Erstellen eines XGBoost-Klassifikators müssen Sie nur die Zielfunktion ändern. Der Rest kann gleich bleiben.
Die beiden beliebtesten Klassifizierungsziele sind:
- binary:logistic- binäre Klassifizierung (das Ziel enthält nur zwei Klassen, nämlich Katze oder Hund)
- multi:softprob- Mehrklassenklassifizierung (mehr als zwei Klassen im Ziel, zB Apfel/Orange/Banane)
Die Durchführung einer binären und einer Multi-Class-Klassifizierung in XGBoost ist nahezu identisch, daher entscheiden wir uns für Letzteres. Lassen Sie uns zunächst die Daten für die Aufgabe vorbereiten.
Wir möchten die Schliffqualität von Diamanten anhand ihres Preises und ihrer physikalischen Maße vorhersagen. Daher werden wir die Feature-/Ziel-Arrays entsprechend erstellen:
Der einzige Unterschied besteht darin, dass XGBoost im Ziel nur Zahlen akzeptiert, während wir die Textklassen im Ziel mit OrdinalEncoderSklearn kodieren.
Jetzt erstellen wir die DMatrices …
…und setzen Sie das Ziel auf multi:softprob. Dieses Ziel erfordert auch die von uns festzulegende Anzahl an Klassen:
Während der Kreuzvalidierung bitten wir XGBoost, drei Klassifizierungsmetriken zu beobachten, die die Modellleistung aus drei verschiedenen Blickwinkeln berichten. Hier ist das Ergebnis:
Um den besten AUC-Wert zu ermitteln, nehmen wir das Maximum der Spalte „Test-AUC-Mittelwert“:
Sogar die Standardkonfiguration lieferte uns eine Leistung von 94 %, was großartig ist analog horror.
XGBoost Native im Vergleich zu XGBoost Sklearn
Bisher haben wir die native XGBoost-API verwendet, aber auch die Sklearn-API ist ziemlich beliebt.
Sklearn ist ein umfangreiches Framework mit vielen Algorithmen und Dienstprogrammen für maschinelles Lernen und verfügt über eine API-Syntax, die fast jeder liebt. Daher bietet XGBoost auch die Klassen XGBClassifier und XGBRegressor an, sodass diese in das Sklearn-Ökosystem integriert werden können (unter Verlust einiger Funktionen).
Wenn Sie möglichst nur die Scikit-learn-API verwenden und nur dann zur nativen Version wechseln möchten, wenn Sie Zugriff auf zusätzliche Funktionen benötigen, gibt es eine Möglichkeit.
Nachdem Sie den XGBoost-Klassifikator oder -Regressor trainiert haben, können Sie ihn mit der folgenden get_boosterMethode konvertieren:
Das Modellobjekt verhält sich genau so, wie wir es in diesem Tutorial gesehen haben.
Fazit
Wir haben in diesem XGBoost-Tutorial viele wichtige Themen behandelt, aber es gibt noch so viel zu lernen.
Sie können sich die XGBoost-Parameterseite ansehen . Dort erfahren Sie, wie Sie die Parameter konfigurieren, um die Leistung Ihrer Modelle voll auszuschöpfen.
Wenn Sie nach einer umfassenden Komplettressource zum Erlernen der Bibliothek suchen, sehen Sie sich unseren Kurs „Extreme Gradient Boosting mit XGBoost“ an .