备注
Go to the end 下载完整的示例代码。或者通过浏览器中的MysterLite或Binder运行此示例
多类AdaBoosted决策树#
此示例展示了boosting如何提高多标签分类问题的预测准确性。它重现了朱等人图1所示的类似实验 [1].
AdaBoost(自适应增强)的核心原则是将弱学习者序列(例如决策树)适应重复重新采样的数据版本。每个样本都带有一个权重,该权重在每个训练步骤后进行调整,以便错误分类的样本将被分配更高的权重。带替换的重新采样过程会考虑分配给每个样本的权重。权重较高的样本在新数据集中被多次选择的机会更大,而权重较低的样本被选择的可能性较小。这确保了算法的后续迭代专注于难以分类的样本。
引用
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
创建数据集#
分类数据集采用十维标准正态分布构建 (\(x\) 在 \(R^{10}\) )并定义由嵌套的同心十维球体分开的三个类别,以便每个类别中大致相等数量的样本( \(\chi^2\) 分配)。
from sklearn.datasets import make_gaussian_quantiles
X, y = make_gaussian_quantiles(
n_samples=2_000, n_features=10, n_classes=3, random_state=1
)
我们将数据集分为2组:70%的样本用于训练,其余30%用于测试。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, train_size=0.7, random_state=42
)
训练这款 AdaBoostClassifier
#
我们训练 AdaBoostClassifier
.估计器利用助推来提高分类准确性。Boosting是一种旨在培训弱学习者(即 estimator
)从前任的错误中吸取教训。
在这里,我们将弱学习者定义为 DecisionTreeClassifier
并将最大树叶数设置为8。在实际设置中,应该调整此参数。我们将其设置为相当低的值,以限制示例的运行时间。
的 SAMME
算法内置到 AdaBoostClassifier
然后使用当前弱学习器做出的正确或不正确的预测来更新用于训练连续弱学习器的样本权重。此外,弱学习器本身的权重是根据其对训练示例进行分类的准确性来计算的。弱学习器的权重决定了其对最终集成预测的影响。
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
weak_learner = DecisionTreeClassifier(max_leaf_nodes=8)
n_estimators = 300
adaboost_clf = AdaBoostClassifier(
estimator=weak_learner,
n_estimators=n_estimators,
random_state=42,
).fit(X_train, y_train)
分析#
收敛 AdaBoostClassifier
#
为了证明增强在提高准确性方面的有效性,我们与两个基线评分进行比较,评估了增强树的误分类误差。第一个基线分数是 misclassification_error
从单个弱学习者获得(即 DecisionTreeClassifier
),作为参考点。第二个基线分数来自 DummyClassifier
,它预测数据集中最普遍的类别。
from sklearn.dummy import DummyClassifier
from sklearn.metrics import accuracy_score
dummy_clf = DummyClassifier()
def misclassification_error(y_true, y_pred):
return 1 - accuracy_score(y_true, y_pred)
weak_learners_misclassification_error = misclassification_error(
y_test, weak_learner.fit(X_train, y_train).predict(X_test)
)
dummy_classifiers_misclassification_error = misclassification_error(
y_test, dummy_clf.fit(X_train, y_train).predict(X_test)
)
print(
"DecisionTreeClassifier's misclassification_error: "
f"{weak_learners_misclassification_error:.3f}"
)
print(
"DummyClassifier's misclassification_error: "
f"{dummy_classifiers_misclassification_error:.3f}"
)
DecisionTreeClassifier's misclassification_error: 0.475
DummyClassifier's misclassification_error: 0.692
训练后, DecisionTreeClassifier
模型中,获得的误差超过了通过猜测最频繁的类标签获得的预期值,因为 DummyClassifier
可以这
现在,我们计算 misclassification_error
,即 1 - accuracy
,添加剂模型的 (DecisionTreeClassifier
)在测试集的每次增强迭代时评估其性能。
我们使用 staged_predict
其迭代次数与匹配估计量的数量一样多(即对应于 n_estimators
).在迭代 n
AdaBoost的预测只使用 n
首先是弱学习者。我们将这些预测与真实预测进行比较 y_test
因此,我们得出了将新的弱学习者添加到链中的好处(或不好处)的结论。
我们绘制了不同阶段的误分类误差:
import matplotlib.pyplot as plt
import pandas as pd
boosting_errors = pd.DataFrame(
{
"Number of trees": range(1, n_estimators + 1),
"AdaBoost": [
misclassification_error(y_test, y_pred)
for y_pred in adaboost_clf.staged_predict(X_test)
],
}
).set_index("Number of trees")
ax = boosting_errors.plot()
ax.set_ylabel("Misclassification error on test set")
ax.set_title("Convergence of AdaBoost algorithm")
plt.plot(
[boosting_errors.index.min(), boosting_errors.index.max()],
[weak_learners_misclassification_error, weak_learners_misclassification_error],
color="tab:orange",
linestyle="dashed",
)
plt.plot(
[boosting_errors.index.min(), boosting_errors.index.max()],
[
dummy_classifiers_misclassification_error,
dummy_classifiers_misclassification_error,
],
color="c",
linestyle="dotted",
)
plt.legend(["AdaBoost", "DecisionTreeClassifier", "DummyClassifier"], loc=1)
plt.show()

该图显示了每次增强迭代后测试集中的分类错误。我们看到,经过50次迭代后,增强树的误差收敛到0.3左右的误差,这表明与单个树相比,准确性明显更高,如图中的虚线所示。
错误分类错误会引起不安,因为 SAMME
算法使用弱学习器的离散输出来训练增强模型。
的收敛性 AdaBoostClassifier
主要受学习率的影响(即 learning_rate
)、使用的弱学习者数量 (n_estimators
),以及弱学习者的表现力(例如 max_leaf_nodes
).
弱学习者的错误和权重#
如前所述,AdaBoost是一个向前的阶段添加剂模型。我们现在重点了解弱学习者的属性权重与其统计表现之间的关系。
我们使用的是 AdaBoostClassifier
的属性 estimator_errors_
和 estimator_weights_
来调查这个链接。
weak_learners_info = pd.DataFrame(
{
"Number of trees": range(1, n_estimators + 1),
"Errors": adaboost_clf.estimator_errors_,
"Weights": adaboost_clf.estimator_weights_,
}
).set_index("Number of trees")
axs = weak_learners_info.plot(
subplots=True, layout=(1, 2), figsize=(10, 4), legend=False, color="tab:blue"
)
axs[0, 0].set_ylabel("Train error")
axs[0, 0].set_title("Weak learner's training error")
axs[0, 1].set_ylabel("Weight")
axs[0, 1].set_title("Weak learner's weight")
fig = axs[0, 0].get_figure()
fig.suptitle("Weak learner's errors and weights for the AdaBoostClassifier")
fig.tight_layout()

在左边的图中,我们显示了每个弱学习者在每次boosting迭代时在重新加权的训练集上的加权误差。在右边的图中,我们显示了与每个弱学习器相关联的权重,这些权重后来用于对最终的加性模型进行预测。
我们看到弱学习器的误差是权重的倒数。这意味着我们的添加性模型将更加信任弱学习者,该学习者通过增加其对最终决策的影响而犯下更小的错误(在训练集上)。事实上,这正是AdaBoost中每次迭代后更新基本估计器权重的公式。
数学细节#
与在阶段训练的弱学习者相关的体重 \(m\) 与其错误分类错误呈负相关,因此:
哪里 \(\alpha^{(m)}\) 和 \(err^{(m)}\) 是重量和误差 \(m\) 分别是弱学习者,和 \(K\) 是分类问题中的类数。
Another interesting observation boils down to the fact that the first weak learners of the model make fewer errors than later weak learners of the boosting chain.
这一观察背后的直觉是这样的:由于样本重新加权,后来的分类器被迫尝试对更困难或有噪的样本进行分类,并忽略已经分类良好的样本。因此,训练集的总体误差将会增加。这就是为什么弱学习者的权重是为了平衡表现较差的弱学习者。
Total running time of the script: (0分3.777秒)
相关实例
Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>
_