Frage

Ich bin ein Neuling von Xgboost, also verzeihen Sie meine Unwissenheit. Hier ist der Python -Code:

import pandas as pd
import xgboost as xgb

df = pd.DataFrame({'x':[1,2,3], 'y':[10,20,30]})
X_train = df.drop('y',axis=1)
Y_train = df['y']
T_train_xgb = xgb.DMatrix(X_train, Y_train)

params = {"objective": "reg:linear"}
gbm = xgb.train(dtrain=T_train_xgb,params=params)
Y_pred = gbm.predict(xgb.DMatrix(pd.DataFrame({'x':[4,5]})))
print Y_pred

Ausgabe ist:

[ 24.126194  24.126194]

Wie Sie sehen können, sind die Eingabedaten einfach eine gerade Linie. Die Ausgabe, die ich erwarte, ist also [40,50]. Was mache ich hier falsch?

War es hilfreich?

Lösung

Es scheint, dass Xgboost verwendet Regressionsbäume als Basislerner standardmäßig. XGBOOST (oder Gradient -Boosting im Allgemeinen) Arbeit, indem mehrere dieser Grundlerner kombiniert werden. Regressionsbäume können die Muster in den Trainingsdaten nicht extrapolieren, sodass jede Eingabe über 3 oder unter 1 in Ihrem Fall nicht korrekt vorhergesagt wird. Ihr Modell ist geschult, um Ausgänge für Eingänge im Intervall vorherzusagen [1,3], einem Eingang höher als 3 erhält den gleichen Ausgang wie 3 und ein Eingang von weniger als 1 erhält den gleichen Ausgang wie 1.

Darüber hinaus sehen Regressionsbäume Ihre Daten nicht wirklich als gerade Linie Da es sich um nichtparametrische Modelle handelt, können sie theoretisch zu jeder Form passen, die komplizierter ist als eine gerade Linie. Ein Regressionsbaum funktioniert grob, indem Sie Ihren neuen Eingabedaten einigen der Trainingsdatenpunkte zuweisen, die er während des Trainings gesehen hat, und die darauf basierende Ausgabe erzeugt.

Dies steht im Gegensatz zu parametrischen Regressoren (wie lineare Regression), die tatsächlich nach den besten Parametern einer Hyperebene (in Ihrem Fall) suchen, um Ihre Daten anzupassen. Lineare Regression tut Sehen Sie sich Ihre Daten als gerade Linie mit einer Steigung und einem Schnittstellen an.

Sie können den Basislehrenden Ihres Xgboost -Modells durch Hinzufügen in ein GLM (generalisiertes lineares Modell) ändern "booster":"gblinear" zu Ihrem Modell params :

import pandas as pd
import xgboost as xgb

df = pd.DataFrame({'x':[1,2,3], 'y':[10,20,30]})
X_train = df.drop('y',axis=1)
Y_train = df['y']
T_train_xgb = xgb.DMatrix(X_train, Y_train)

params = {"objective": "reg:linear", "booster":"gblinear"}
gbm = xgb.train(dtrain=T_train_xgb,params=params)
Y_pred = gbm.predict(xgb.DMatrix(pd.DataFrame({'x':[4,5]})))
print Y_pred

Um zu debuggen, warum sich Ihr Xgboost -Modell auf eine bestimmte Weise verhält, siehe die Modellparameter:

gbm.get_dump()

Wenn Ihr Basislerner ein lineares Modell ist, lautet die Ausgabe von GET_DUMP:

['bias:\n4.49469\nweight:\n7.85942\n']

In Ihrem obigen Code, da Sie Baumbasislerner sind, wird die Ausgabe sein:

['0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=2.85\n\t\t4:leaf=5.85\n\t2:leaf=8.85\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=1.995\n\t\t4:leaf=4.095\n\t2:leaf=6.195\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=1.3965\n\t\t4:leaf=2.8665\n\t2:leaf=4.3365\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.97755\n\t\t4:leaf=2.00655\n\t2:leaf=3.03555\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.684285\n\t\t4:leaf=1.40458\n\t2:leaf=2.12489\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.478999\n\t\t4:leaf=0.983209\n\t2:leaf=1.48742\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.3353\n\t\t4:leaf=0.688247\n\t2:leaf=1.04119\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.23471\n\t\t4:leaf=0.481773\n\t2:leaf=0.728836\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.164297\n\t\t4:leaf=0.337241\n\t2:leaf=0.510185\n',
 '0:[x<2] yes=1,no=2,missing=1\n\t1:leaf=0.115008\n\t2:[x<3] yes=3,no=4,missing=3\n\t\t3:leaf=0.236069\n\t\t4:leaf=0.357129\n']

Tipp: Ich bevorzuge tatsächlich XGB.xgbregressor oder xgb.xgbClassifier -Klassen, da sie dem folgen Sci-kit lernen API. Und da Sci-Kit Learn so viele Algorithmus-Implementierungen für maschinelles Lernen hat, stört die Verwendung von XGB als zusätzliche Bibliothek meinen Workflow nicht nur, wenn ich die Sci-Kit-Schnittstelle von Xgboost verwende.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top