2016-01-08 15 views
10

Sto tentando di utilizzare il classificatore XGBoosts per classificare alcuni dati binari. Quando faccio la cosa più semplice e basta usare le impostazioni di default (come segue)XGBoost XGBClassifier Valori predefiniti in Python

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

ottengo ragionevolmente buoni risultati di classificazione.

Il mio prossimo passo era provare a sintonizzare i miei parametri. Indovinare dalla guida parametri a ... https://github.com/dmlc/xgboost/blob/master/doc/parameter.md Ho voluto iniziare dal default e lavorare da 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) 

Il risultato è tutto ciò che viene previsto per essere una delle condizioni e non il contrario.

curiosamente se ho impostato

params={} 

che mi aspettavo di darmi le stesse impostazioni predefinite per non nutrire alcun parametro, ottengo la stessa cosa che accade

Così Qualcuno sa che le impostazioni predefinite per XGBclassifier è ? in modo che possa iniziare la sintonizzazione?

+0

Questa domanda incontra un comportamento simile ma nessuna risposta è stata data http://stackoverflow.com/questions/33470477/xgboost-prodict-method-returns-the-same-predicted-value-for-all-all-all-all- righe –

risposta

15

Non è così che si impostano i parametri in xgboost. O vuoi passare la griglia param nella tua funzione di allenamento, come ad esempio xgboost's train o sklearn's GridSearchCV, oppure vorresti usare il metodo set_params di XGBClassifier. Un'altra cosa da notare è che se stai usando il wrapper di xgboost su sklearn (cioè: le classi XGBClassifier() o XGBRegressor()) i nomi dei parametri utilizzati sono gli stessi usati nella classe GBM di sklearn (es: eta -> learning_rate). Non vedo dove è nascosta la documentazione esatta per il wrapper sklearn, ma il codice per queste classi è qui: https://github.com/dmlc/xgboost/blob/master/python-package/xgboost/sklearn.py

Per il tuo riferimento, ecco come impostare direttamente i parametri dell'oggetto modello.

>>> 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: Suppongo è possibile impostare i parametri di creazione del modello, semplicemente non è super tipico a farlo dal momento che cerca la maggior parte delle persone di griglia in alcuni mezzi. Tuttavia, se lo fai, dovresti elencarli come parametri completi o usare ** kwargs. Per esempio:

>>> 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) 

utilizzando un dizionario come input senza ** kwargs imposterà il parametro di essere letteralmente il dizionario:

>>> 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) 
+0

Per quanto vorrei fosse vero, non è possibile passare una griglia di parametri nella funzione treno di xgboost - i valori del dizionario dei parametri non possono essere elenchi –

0

In un primo momento, penso che si perde una 's' per la vostra variabile. Si utilizza param in alto ma si utilizza params durante l'allenamento del modello. E poi ...

Problemi correlati