2017-07-04 4 views
0

Je suis en train de former un modèle de XGBoost en utilisant les paramètres ci-dessous:Comment obtenir les params d'un modèle XGBoost sauvé

xgb_params = { 
    'objective': 'binary:logistic', 
    'eval_metric': 'auc', 
    'lambda': 0.8, 
    'alpha': 0.4, 
    'max_depth': 10, 
    'max_delta_step': 1, 
    'verbose': True 
} 

Depuis mes données d'entrée est trop grande pour être complètement chargé dans la mémoire, je adapter la formation progressive:

xgb_clf = xgb.train(xgb_params, input_data, num_boost_round=rounds_per_batch, 
        xgb_model=model_path) 

le code pour la prédiction est

xgb_clf = xgb.XGBClassifier() 
booster = xgb.Booster() 
booster.load_model(model_path) 
xgb_clf._Booster = booster 
raw_probas = xgb_clf.predict_proba(x) 

le résultat semblait bon. Mais quand j'ai essayé d'invoquer xgb_clf.get_xgb_params(), j'ai obtenu un paramètre dans lequel tous les params étaient réglés sur les valeurs par défaut.

Je peux deviner que la cause première est lorsque j'ai initialisé le modèle, je n'ai transmis aucun paramètre. Donc le modèle a été initialisé en utilisant les valeurs par défaut mais quand il a prédit, il a utilisé un booster interne en utilisant des paramètres prédéfinis. Cependant, je me demande s'il existe un moyen, après avoir assigné un modèle de rappel pré-entraîné à un XGBClassifier, de voir les vrais paramètres utilisés pour former le booster, mais pas ceux qui sont utilisés pour initialiser le booster. classificateur.

Merci à tous.

Répondre

0

Vous semblez mélanger l'API sklearn avec l'API fonctionnelle dans votre code, si vous respectez l'un ou l'autre, vous devriez obtenir les paramètres pour persister dans le pickle. Voici un exemple utilisant l'API sklearn.

import pickle 
import numpy as np 
import xgboost as xgb 
from sklearn.datasets import load_digits 


digits = load_digits(2) 
y = digits['target'] 
X = digits['data'] 

xgb_params = { 
    'objective': 'binary:logistic', 
    'reg_lambda': 0.8, 
    'reg_alpha': 0.4, 
    'max_depth': 10, 
    'max_delta_step': 1, 
} 
clf = xgb.XGBClassifier(**xgb_params) 
clf.fit(X, y, eval_metric='auc', verbose=True) 

pickle.dump(clf, open("xgb_temp.pkl", "wb")) 
clf2 = pickle.load(open("xgb_temp.pkl", "rb")) 

assert np.allclose(clf.predict(X), clf2.predict(X)) 
print(clf2.get_xgb_params()) 

qui produit

{'base_score': 0.5, 
'colsample_bylevel': 1, 
'colsample_bytree': 1, 
'gamma': 0, 
'learning_rate': 0.1, 
'max_delta_step': 1, 
'max_depth': 10, 
'min_child_weight': 1, 
'missing': nan, 
'n_estimators': 100, 
'objective': 'binary:logistic', 
'reg_alpha': 0.4, 
'reg_lambda': 0.8, 
'scale_pos_weight': 1, 
'seed': 0, 
'silent': 1, 
'subsample': 1} 
+0

Merci pour votre réponse. J'avais l'habitude d'utiliser joblib.dump de sklearn auparavant et cela a fonctionné. Mais je n'ai pas réussi à trouver un moyen d'ajuster le modèle de façon incrémentale en utilisant sklearn API. Par conséquent, pourriez-vous s'il vous plaît me faire savoir comment le faire? (Le besoin d'ajuster le modèle de façon incrémentale est beaucoup plus important) –