首页 > 解决方案 > 为什么 AdaBoost 不适用于决策树?

问题描述

我将 sklearn 0.19.1 与 DecisionTree 和 AdaBoost 一起使用。

我有一个运行良好的决策树分类器:

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 时,它会在 predict 函数上引发错误:

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 的描述中,我可以理解使用数据的实际分类器是决策树:

AdaBoost 1分类器是一种元估计器,它首先在原始数据集上拟合分类器,然后在同一数据集上拟合分类器的其他副本,但调整错误分类实例的权重,以便后续分类器更多地关注困难案例

但我仍然收到此错误。

我找到的代码示例中,即使在 sklearn 的网站上,我也无法理解我做错了什么。

任何帮助表示赞赏。

标签: pythonmachine-learningscikit-learndecision-treeadaboost

解决方案


看起来您正在尝试执行一个多输出分类问题,给定 的形状y,否则您正在喂食和 n 维的 是没有意义yadaclf.fit(train_pdf_x, train_pdf_y)

所以假设是这种情况,问题在于 Scikit-Learn 的DecisionTreeClassifier确实支持多输出问题,即y具有 shape 的输入[n_samples, n_outputs]但是,对于AdaBoostClassifier而言,情况并非如此,因为根据文档,标签必须是:

y : 类似数组的形状 = [n_samples]


推荐阅读