web-dev-qa-db-fra.com

XGBoost XGBClassifier Valeurs par défaut dans Python

J'essaie d'utiliser le classifieur XGBoosts pour classer certaines données binaires. Quand je fais la chose la plus simple et utilise simplement les valeurs par défaut (comme suit)

clf = xgb.XGBClassifier()
metLearn=CalibratedClassifierCV(clf, method='isotonic', cv=2)
metLearn.fit(train, trainTarget)
testPredictions = metLearn.predict(test)

J'obtiens des résultats de classement assez bons.

Ma prochaine étape a été d'essayer de régler mes paramètres. Devinette du guide des paramètres à ... https://github.com/dmlc/xgboost/blob/master/doc/parameter.md Je voulais commencer à partir des paramètres par défaut et travailler à partir de là. .

# setup parameters for xgboost
param = {}
param['booster'] = 'gbtree'
param['objective'] = 'binary:logistic'
param["eval_metric"] = "error"
param['eta'] = 0.3
param['gamma'] = 0
param['max_depth'] = 6
param['min_child_weight']=1
param['max_delta_step'] = 0
param['subsample']= 1
param['colsample_bytree']=1
param['silent'] = 1
param['seed'] = 0
param['base_score'] = 0.5

clf = xgb.XGBClassifier(params)
metLearn=CalibratedClassifierCV(clf, method='isotonic', cv=2)
metLearn.fit(train, trainTarget)
testPredictions = metLearn.predict(test)

Le résultat est que tout devrait être l'une des conditions et non l'autre.

curieusement si je mets

params={}

que je m'attendais à me donner les mêmes valeurs par défaut que de ne pas alimenter de paramètres, la même chose se produit

Alors, est-ce que quelqu'un sait quelles sont les valeurs par défaut pour XGBclassifier? afin que je puisse commencer à accorder?

22
Chris Arthur

Ce n'est pas ainsi que vous définissez les paramètres dans xgboost. Vous voudrez soit passer votre grille de paramètres dans votre fonction d’entraînement, telle que train de xgboost ou GridSearchCV de sklearn, soit utiliser la méthode set_params De votre XGBClassifier. Une autre chose à noter est que si vous utilisez le wrapper de xgboost pour apprendre à apprendre (c'est-à-dire: les classes XGBClassifier() ou XGBRegressor()), les noms de paramètres utilisés sont les mêmes que ceux utilisés dans le GBM de Sklearn. classe (ex: eta -> learning_rate). Je ne vois pas où la documentation exacte de l'encapsuleur Sklearn est masquée, mais le code de ces classes est ici: https://github.com/dmlc/xgboost/blob/master/python-package/xgboost /sklearn.py

Pour votre information, voici comment définir les paramètres d'objet de modèle directement.

>>> grid = {'max_depth':10}
>>> 
>>> clf = XGBClassifier()
>>> clf.max_depth
3
>>> clf.set_params(**grid)
XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1,
       gamma=0, learning_rate=0.1, max_delta_step=0, max_depth=10,
       min_child_weight=1, missing=None, n_estimators=100, nthread=-1,
       objective='binary:logistic', reg_alpha=0, reg_lambda=1,
       scale_pos_weight=1, seed=0, silent=True, subsample=1)
>>> clf.max_depth
10

EDIT: Je suppose que vous pouvez définir des paramètres pour la création de modèles, ce n’est tout simplement pas génial de le faire, car la plupart des gens effectuent une recherche par grille selon certains moyens. Cependant, si vous le faites, vous devrez soit les lister en tant que paramètres complets, soit utiliser ** kwargs. Par exemple:

>>> XGBClassifier(max_depth=10)
XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1,
       gamma=0, learning_rate=0.1, max_delta_step=0, max_depth=10,
       min_child_weight=1, missing=None, n_estimators=100, nthread=-1,
       objective='binary:logistic', reg_alpha=0, reg_lambda=1,
       scale_pos_weight=1, seed=0, silent=True, subsample=1)
>>> XGBClassifier(**grid)
XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1,
       gamma=0, learning_rate=0.1, max_delta_step=0, max_depth=10,
       min_child_weight=1, missing=None, n_estimators=100, nthread=-1,
       objective='binary:logistic', reg_alpha=0, reg_lambda=1,
       scale_pos_weight=1, seed=0, silent=True, subsample=1)

En utilisant un dictionnaire comme entrée sans ** kwargs, ce paramètre sera littéralement votre dictionnaire:

>>> XGBClassifier(grid)
XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1,
       gamma=0, learning_rate=0.1, max_delta_step=0,
       max_depth={'max_depth': 10}, min_child_weight=1, missing=None,
       n_estimators=100, nthread=-1, objective='binary:logistic',
       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=0, silent=True,
       subsample=1)
24
David

Les valeurs par défaut pour XGBClassifier sont les suivantes:

  • max_depth = 3
  • rate_apprentissage = 0.1
  • n_estimators = 100
  • silencieux = vrai
  • objectif = 'binaire: logistique'
  • booster = 'gbtree'
  • n_jobs = 1
  • nthread = Aucun
  • gamma = 0
  • min_child_weight = 1
  • max_delta_step = 0
  • sous-échantillon = 1
  • colsample_bytree = 1
  • colsample_bylevel = 1
  • reg_alpha = 0
  • reg_lambda = 1
  • scale_pos_weight = 1
  • score de base = 0.5
  • random_state = 0
  • graine = aucune
  • manquant = aucun

Lien vers la documentation XGBClassifier avec les valeurs par défaut de la classe: https://xgboost.readthedocs.io/en/latest/python/python_api.html#xgboost.XGBClassifier

7
Jake Zidow

Pour commencer, on dirait qu'il vous manque un s pour votre variable param.

Vous avez écrit param en haut:

param = {}
param['booster'] = 'gbtree'
param['objective'] = 'binary:logistic'
  .
  .
  .

... mais utilisez param s plus bas pour former le modèle:

clf = xgb.XGBClassifier(params)  <-- different variable!

Était-ce juste une faute de frappe dans votre exemple?

2
luoshao23