2015-08-25 25 views
11

Próbuję dostroić klasyfikator AdaBoost ("ABT"), używając parametru DecisionTreeClassifier ("DTC") jako parametru base_estimator. Chciałbym nastroić parametry zarówno ABT, jak i DTC jednocześnie, ale nie jestem pewien, jak to osiągnąć - potok nie powinien działać, ponieważ nie "wyprowadzam" wyjścia DTC do ABT. Pomysł polegałby na powtórzeniu parametrów hipertekstowych dla ABT i DTC w estymatorze GridSearchCV.Używanie GridSearchCV z AdaBoost i DecisionTreeClassifier

Jak poprawnie określić parametry strojenia?

Próbowałem następujące, które wygenerowały błąd poniżej.

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

Odpowiedz

10

Istnieje kilka rzeczy źle w kodzie Wysłany:

  1. Kluczami słownika param_grid muszą być łańcuchami. Powinieneś dostać NameError.
  2. Kluczem "abc__n_estimators" powinno być po prostu "n_estimators": prawdopodobnie mieszacie to ze składnią pipeline. Tutaj nic nie mówi Pythonowi, że ciąg "abc" reprezentuje twój AdaBoostClassifier.
  3. None (i nie none) nie jest prawidłową wartością dla n_estimators. Domyślna wartość (prawdopodobnie to, co masz na myśli) to 50.

Oto kod z tymi poprawkami. Aby ustawić parametry estymatora drzewa, możesz użyć składni "__", która umożliwia dostęp do zagnieżdżonych parametrów.

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

Również 1 lub 2 estymatory nie mają większego sensu dla AdaBoost. Ale domyślam się, że to nie jest prawdziwy kod, który używasz.

Mam nadzieję, że to pomoże.

+0

Punkty 1. i 3. były błędami transkrypcji, moje złe! Wypróbuję Twoją sugestię dotyczącą składni, określając parametr param_grid i zgłoś się ponownie. Ale jeśli rozumiem to poprawnie, mogę użyć wyrażenia "__" w wielu kontekstach? Rozumiem twój punkt widzenia na temat liczby estymatorów, kodowałem to pierwszy, aby sprawdzić, czy zadziałało ... Więcej wkrótce. – GPB

+0

@ GPB Składnia "__" służy również do określania parametrów dla (ewentualnie zagnieżdżonych) obiektów w potokach. – ldirer

+0

@ldirer Czy możesz wyjaśnić, w jaki sposób twój kod dostraja parametry AdaBoost? Czy nie musimy wykonać drugiego wyszukiwania w sieci z siatką parametrów dla klasyfikatora AdaBoost? – user2738815