Почему AdaBoost не работает с DecisionTree? - PullRequest
0 голосов
/ 14 января 2019

Я использую 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 Ответ

0 голосов
/ 14 января 2019

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

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

y : массивоподобная форма = [n_samples]

...