Почему 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]