python - 为什么 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 的网站上,我也无法理解我做错了什么。
任何帮助表示赞赏。
解决方案
看起来您正在尝试执行一个多输出分类问题,给定 的形状y
,否则您正在喂食和 n 维的 是没有意义y
的adaclf.fit(train_pdf_x, train_pdf_y)
。
所以假设是这种情况,问题在于 Scikit-Learn 的DecisionTreeClassifier确实支持多输出问题,即y
具有 shape 的输入[n_samples, n_outputs]
。但是,对于AdaBoostClassifier而言,情况并非如此,因为根据文档,标签必须是:
y : 类似数组的形状 = [n_samples]
推荐阅读
- excel - 我需要在 excel 中为 5 行创建一个随机数据集(避免重复)
- go - 什么时候需要 ssh.KeyboardInteractive?
- python - 在python中缩进函数调用的正确方法
- boost - 未随 Homebrew 安装的 Boost 库:无效选项:--c++11
- node.js - 我试图根据以下 Dockerfile 构建这个 docker 映像,直到发生这种情况
- typescript - 从属性和选项的 JS 对象动态创建接口
- php - 如何在 Woocommerce 4.7 中为每个类别页面显示不同的顶部横幅?
- select - 订阅两次相同价值的期权
- javascript - 如何检测按下了哪个按钮
- webrtc - WebRTC 获取刷新关键帧的统计指标