Возможно ли установить base_estimator как OneVsRestClassifier (DecisionTreeClassifier()) для Adaboost?

#python #machine-learning #scikit-learn #grid-search #adaboost

#python #машинное обучение #scikit-узнать #поиск по сетке #adaboost

Вопрос:

Я пытаюсь построить модель Adaboost на наборе данных с мультиклассовыми метками для возрастной группы и этнической группы.

Поскольку я планирую получить ROC и AUC, поэтому я бинаризовал целевые переменные как yb_train2 для возрастной группы и yb_train3 для этнической группы. Затем я попробовал one-vs-rest в модели дерева решений, которая отлично работает.

но теперь я понятия не имею, как указать параметры в поиске по сетке, я попробовал следующий код и получил синтаксическую ошибку:

 abc = AdaBoostClassifier(base_estimator= (OneVsRestClassifier(DecisionTreeClassifier()))


param_grid = dict(base_estimator__estimator__criterion = ["gini", "entropy"],
                  base_estimator__estimator__splitter = ["best", "random"],
                  n_estimators = [1, 2],
                  learning_rate =  [0.0001,0.001,0.01,0.1,1]
                  )

grid = GridSearchCV(abc,param_grid)

grid.fit(X_train,yb_train2)
print ('best score: {:}').format(grid.best_score_ ), ('with parameter: {:}').format(grid.best_params_)

grid.fit(X_train,yb_train3)
print ('best score: {:}').format(grid.best_score_ ), ('with parameter:{:}').format(grid.best_params_)
  

введите описание изображения здесь
Может ли кто-нибудь дать несколько предложений в подобной ситуации? Спасибо:)

Ответ №1:

Вы пропустили закрытие одной из скобок.

 from sklearn.ensemble import AdaBoostClassifier
from sklearn.multiclass import OneVsRestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV

abc = AdaBoostClassifier(base_estimator= (OneVsRestClassifier(DecisionTreeClassifier())))

param_grid = dict(base_estimator__estimator__criterion = ["gini", "entropy"],
                  base_estimator__estimator__splitter = ["best", "random"],
                  n_estimators = [1, 2],
                  learning_rate =  [0.0001,0.001,0.01,0.1,1]
                  )

grid = GridSearchCV(abc,param_grid)      
  

Это может помочь вам преодолеть синтаксическую ошибку.

Но DecisionTreeClassifier по умолчанию являются многоклассовыми классификаторами, поэтому я бы посоветовал не использовать поверх него оболочку OneVsRestClassifier.

Комментарии:

1. Спасибо, братан, это исправлено. но по-прежнему не удается ввести двоичные многоклассовые данные. он вернет ‘ValueError: неверная форма ввода (72, 5)’ после того, как я подгоню сетку к своим данным, которые имеют 5 классов. Должен ли я использовать OneRestClassifer (Adaboost()) вместо того, чтобы выносить Adaboost() за скобки? но как я могу указать параметры для каждого? БОЖЕ!! это ооочень сложно.. но в любом случае, спасибо за помощь с исправлением.

2. Я хочу сказать, что вам не нужно выполнять бинаризацию данных мультикласса. Вы можете напрямую передать это в DecisionTreeClassifier или Adaboost

3. Потому что я использую ROC в качестве классификационных показателей для всех моих моделей, поскольку ROC нуждается в бинаризации данных, поэтому я пытаюсь решить эту проблему

4. @Venkatachalam Когда мы используем другой классификатор в качестве базового оценщика для AdaBoost, нам тогда не нужно использовать собственные параметры AdaBoost n_estimators и learning_rate? ? Каково соглашение?

5. Я думаю, что вам все еще нужно предоставить n_estimate и learning_rate, которые работают на разных итерациях в Adaboost.