2015-08-25 29 views
11

Sto tentando di ottimizzare un AdaBoost Classifier ("ABT") utilizzando DecisionTypeClassifier ("DTC") come base_estimator. Vorrei regolare entrambi i parametri ABT e DTC contemporaneamente, ma non sono sicuro di come farlo - la pipeline non dovrebbe funzionare, poiché non sto "collegando" l'output di DTC ad ABT. L'idea sarebbe quella di iterare i parametri iper per ABT e DTC nello stimatore GridSearchCV.Utilizzo di GridSearchCV con AdaBoost e DecisionClassifier

Come specificare i parametri di ottimizzazione correttamente?

Ho provato quanto segue, che ha generato un errore di seguito.

[IN] 
from sklearn.tree import DecisionTreeClassifier 
from sklearn.ensemble import AdaBoostClassifier 
from sklearn.grid_search import GridSearchCV 

param_grid = {dtc__criterion : ["gini", "entropy"], 
       dtc__splitter : ["best", "random"], 
       abc__n_estimators: [none, 1, 2] 
      } 


DTC = DecisionTreeClassifier(random_state = 11, max_features = "auto", class_weight = "auto",max_depth = None) 

ABC = AdaBoostClassifier(base_estimator = DTC) 

# run grid search 
grid_search_ABC = GridSearchCV(ABC, param_grid=param_grid, scoring = 'roc_auc') 

[OUT] 
ValueError: Invalid parameter dtc for estimator AdaBoostClassifier(algorithm='SAMME.R', 
     base_estimator=DecisionTreeClassifier(class_weight='auto', criterion='gini', max_depth=None, 
     max_features='auto', max_leaf_nodes=None, min_samples_leaf=1, 
     min_samples_split=2, min_weight_fraction_leaf=0.0, 
     random_state=11, splitter='best'), 
     learning_rate=1.0, n_estimators=50, random_state=11) 

risposta

10

Ci sono diverse cose sbagliate nel codice che avete inviato:

  1. Le chiavi del dizionario param_grid bisogno di essere stringhe. Dovresti ricevere un NameError.
  2. La chiave "abc__n_estimators" dovrebbe essere solo "n_estimators": probabilmente stai mixando questo con la sintassi della pipeline. Qui nulla dice a Python che la stringa "abc" rappresenta il tuo AdaBoostClassifier.
  3. None (e non none) non è un valore valido per n_estimators. Il valore predefinito (probabilmente quello che intendevi) è 50.

Ecco il codice con queste correzioni. Per impostare i parametri dello stimatore Tree è possibile utilizzare la sintassi "__" che consente di accedere ai parametri nidificati.

from sklearn.tree import DecisionTreeClassifier 
from sklearn.ensemble import AdaBoostClassifier 
from sklearn.grid_search import GridSearchCV 

param_grid = {"base_estimator__criterion" : ["gini", "entropy"], 
       "base_estimator__splitter" : ["best", "random"], 
       "n_estimators": [1, 2] 
      } 


DTC = DecisionTreeClassifier(random_state = 11, max_features = "auto", class_weight = "auto",max_depth = None) 

ABC = AdaBoostClassifier(base_estimator = DTC) 

# run grid search 
grid_search_ABC = GridSearchCV(ABC, param_grid=param_grid, scoring = 'roc_auc') 

Inoltre, 1 o 2 stimatori non ha realmente senso per AdaBoost. Ma immagino che questo non sia il codice reale che stai utilizzando.

Spero che questo aiuti.

+0

I punti 1. e 3. erano errori di trascrizione, il mio male! Proverò il tuo suggerimento per la sintassi specificando param_grid e segnalalo. Ma se ho capito bene, posso usare l'espressione "__" in più contesti? Capisco il tuo punto sul numero di stimatori, stavo codificando questo prima per vedere se ha funzionato ... Ancora presto. – GPB

+0

@ GPB La sintassi "__" viene anche utilizzata per specificare i parametri per gli oggetti (possibilmente nidificati) in Pipelines. – ldirer

+0

@ldirer Puoi spiegare come il tuo codice sta modificando i parametri di AdaBoost? Non è necessario eseguire una seconda ricerca della griglia con una griglia di parametri per il classificatore AdaBoost? – user2738815