Почему AdaBoost не работает с DecisionTree?

Я использую sklearn 0.19.1 с DecisionTree и AdaBoost.

У меня есть классификатор DecisionTree, который работает нормально:

clf = tree.DecisionTreeClassifier()

train_split_perc = 10000
test_split_perc = pdf.shape[0] - train_split_perc

train_pdf_x = pdf[:train_split_perc]
train_pdf_y = YY[:train_split_perc]

test_pdf_x = pdf[-test_split_perc:]
test_pdf_y = YY[-test_split_perc:]

clf.fit(train_pdf_x, train_pdf_y)

pred2 = clf.predict(test_pdf_x)

Но при попытке добавить AdaBoost он выдает ошибку в функции прогнозирования:

treeclf = tree.DecisionTreeClassifier(max_depth=3)
adaclf = AdaBoostClassifier(base_estimator=treeclf, n_estimators=500, learning_rate=0.5)

train_split_perc = 10000
test_split_perc = pdf.shape[0] - train_split_perc

train_pdf_x = pdf[:train_split_perc]
train_pdf_y = YY[:train_split_perc]

test_pdf_x = pdf[-test_split_perc:]
test_pdf_y = YY[-test_split_perc:]

adaclf.fit(train_pdf_x, train_pdf_y)

pred2 = adaclf.predict(test_pdf_x)

В частности, ошибка говорит:

ValueError: bad input shape (236821, 6)

Набор данных, на который он указывает, train_pdf_y потому что он имеет форму (236821, 6) и я не понимаю почему.

Даже из описания AdaBoostClassifier в документах я могу понять, что фактическим классификатором, который использует данные, является DecisionTree:

Классификатор AdaBoost 1 - это метаоценщик, который начинается с подгонки классификатора к исходному набору данных, а затем подгоняет дополнительные копии классификатора к тому же набору данных, но там, где веса неправильно классифицированных экземпляров корректируются таким образом, чтобы последующие классификаторы больше фокусировались на сложных случаях.

Но все же я получаю эту ошибку.

В примерах кода, которые я нашел, даже на веб-сайте sklearn с тем, как использовать AdaBoost, я не могу понять, что я делаю неправильно.

Любая помощь приветствуется.

1 ответ

Решение

Похоже, вы пытаетесь выполнить задачу классификации Multi-Output, учитывая форму y в противном случае не имеет смысла, что вы кормите и n-мерный y в adaclf.fit(train_pdf_x, train_pdf_y),

Таким образом, если предположить, что это так, то проблема в том, что на самом деле DecisionTreeClassifier Scikit-Learn поддерживает проблемы с несколькими выходами, это y входы с формой [n_samples, n_outputs], Однако это не относится к AdaBoostClassifier, учитывая, что из документации метки должны быть:

y: массив в виде shape = [n_samples]

Другие вопросы по тегам