Question

Je suis un débutant à XGBoost si le pardon de mon ignorance. Voici le code python:

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

sortie est la suivante:

[ 24.126194  24.126194]

Comme vous pouvez voir les données d'entrée est tout simplement une ligne droite. Donc la sortie je pense est [40,50]. Qu'est-ce que je fais mal ici?

Était-ce utile?

La solution

Il semble que les utilisations XGBoost que les apprenants de base par défaut arbres de régression . travail XGBoost (ou un dégradé stimulant en général) en combinant plusieurs de ces apprenants de base. Les arbres de régression ne peut pas extrapoler les tendances dans les données de formation, de sorte que toute entrée 3 ci-dessus ou en dessous de 1 ne sera pas correctement prédit dans votre cas. Votre modèle est formé pour prédire les résultats pour les entrées dans l'intervalle [1,3], une entrée supérieure à 3 auront la même sortie que 3, et une entrée inférieure à 1 sera donné le même résultat que 1.

En outre, les arbres de régression ne vois pas vraiment vos données en tant que ligne droite comme ils sont des modèles non paramétriques, ce qui signifie qu'ils peuvent adapter théoriquement une forme qui est plus compliqué qu'une ligne droite. En gros, un arbre de régression fonctionne en affectant vos nouvelles données d'entrée à certains des points de données de formation, il a vu lors de la formation, et de produire la sortie sur cette base.

Ceci est en contraste avec régresseurs paramétriques (comme régression linéaire ) qui ont l'air en fait les meilleurs paramètres d'un hyperplan (ligne droite dans votre cas) pour répondre à vos données. La régression linéaire fait voir vos données en ligne droite avec une pente et une interception.

Vous pouvez changer l'apprenant de base de votre modèle XGBoost à un GLM (modèle linéaire généralisé) en ajoutant "booster":"gblinear" à votre modèle 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

En général, pour debug pourquoi votre modèle XGBoost se comporte d'une manière particulière, voir les paramètres du modèle:

gbm.get_dump()

Si votre apprenant de base est un modèle linéaire, la sortie get_dump est:

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

Dans votre code ci-dessus, puisque vous les apprenants de base de l'arbre, la sortie sera:

['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']

Astuce: je préfère utiliser les classes xgb.XGBRegressor ou xgb.XGBClassifier, car ils suivent le science-kit apprendre API. Et parce que la science-kit apprendre a tant d'implémentations de l'algorithme d'apprentissage de la machine, en utilisant XGB comme une bibliothèque supplémentaire ne perturbe pas mon flux de travail que lorsque j'utilise l'interface science-kit de XGBoost.

Licencié sous: CC-BY-SA avec attribution
scroll top