集成学习技术:提升方法与AdaBoost详解

集成学习是一种机器学习技术,它通过组合多个单独的模型来创建一个主模型。本文将探讨提升方法,特别是AdaBoost算法的详细解释。

目录

  • 集成学习中的Bagging与Boosting
  • AdaBoost的数据理解
  • 最终模型
  • 数学解释
  • Python中的实践应用
  • 优缺点
  • 参考资料

1.集成学习中的Bagging与Boosting

首先,来探讨Bagging和Boosting的区别。以随机森林(Bagging技术)和AdaBoost(Boosting技术)为例,它们都属于集成学习家族。随机森林是一个并行学习过程,而AdaBoost是一个序贯学习过程。在随机森林中,各个模型或决策树是并行且独立构建的。而在AdaBoost中,一个树依赖于前一个树,即如果存在多个模型,每个模型的集成过程是依赖于前一个模型的输出的。

第二个区别是,在随机森林中,所有模型在最终模型中都有相等的权重。而在AdaBoost中,模型并不都有相等的权重,这意味着一些模型在最终模型中的权重会更大,而另一些则更小。

第三个区别是,在随机森林中,每个单独的模型都是一个完全成长的决策树。而在AdaBoost中,树并不是完全成长的,它们只是有一个根节点和两个叶子节点,这在AdaBoost中被称为“桩”(stumps)。

2. AdaBoost的数据理解

现在通过一个例子来理解AdaBoost是如何工作的。考虑一个简单的数据集,包含年龄、BMI和性别三列。将性别作为目标列,其余作为自变量。AdaBoost首先会给所有记录分配一个初始权重,这些权重的总和等于1。

接下来,AdaBoost作为一个序贯学习过程,会首先拟合第一个模型或基础模型。在AdaBoost中,弱学习器是桩,它们有一个根节点和两个叶子节点。这个桩是如何创建的呢?仍然使用基尼指数或熵指数,前两列是创建根节点的候选列。通过检查这些指数,选择一个条件,然后创建这个桩。

一旦这个桩被创建,接下来就是用这个桩来测试数据的准确性。测试结果可能会显示,这个桩在训练数据上的分类可能会出错。例如,如果第三个记录被前一个模型错误分类,那么在下一个迭代或下一个模型中,这个记录的权重会增加,而为了使整个权重归一化,其他记录的权重会降低。

3. 最终模型

如果有大约100万条记录,将会有很多记录被弱学习器错误分类,因此这些记录在下一个学习器或下一个ML模型2中的权重会增加。类似地,这个ML模型2也会错误分类一些观察结果。那些观察结果的权重会再次增加,而其他观察结果的权重会降低以归一化。所有模型都是这样创建的,前一个模型的错误分类,下一个模型会尝试正确分类。这就是为什么这种技术被称为提升技术,这个算法被称为AdaBoost。

最终模型是所有这些学习结果的组合,因此这种技术被称为提升技术,这个算法被称为AdaBoost。重要的是理解权重的初始化和基于错误分类的权重调整,创建决策树、创建桩的内部基本概念仍然相同,如基尼指数、熵指数等。但不同的是这些权重及其调整。这就是AdaBoost的工作原理。

4. 数学解释

权重的分配有一个公式。初始权重的分配可以由以下公式给出:

初始权重 = 1/N

其中N表示数据点的总数,即记录的数量。实际影响可以使用以下公式进行分类:

alpha = 影响某个桩在最终决策中的权重

总错误是错误分类数据的总数。样本权重可以使用以下公式更新:

新样本权重 = Euler数 * 旧样本权重

如果记录被正确分类,alpha将是正数;否则将是负数。

5.Python中的实践应用

首先,将加载所有基本库。

import pandas as pd import numpy as np from sklearn.ensemble import AdaBoostClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix, accuracy_score from sklearn.preprocessing import LabelEncoder

这里,使用乳腺癌数据集,该数据集可以从sklearn.datasets获得。它也在Kaggle上可用。

breast_cancer = load_breast_cancer()

让声明自变量和目标变量。

X = pd.DataFrame(breast_cancer.data, columns = breast_cancer.feature_names) y = pd.Categorical.from_codes(breast_cancer.target, breast_cancer.target_names)

目标是分类它是良性还是恶性癌症。所以,让将目标变量编码为0和1。0代表恶性,1代表良性。

encoder = LabelEncoder() binary_encoded_y = pd.Series(encoder.fit_transform(y))

现在将数据集拆分为训练集和测试集。

train_X, test_X, train_y, test_y = train_test_split(X, binary_encoded_y, random_state = 1)

使用AdaBoost分类器。这里,使用决策树作为模型。

classifier = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200) classifier.fit(train_X, train_y) print(classifier)

AdaBoost现在已经拟合好了。将在测试集中预测目标变量。

prediction = classifier.predict(test_X)

让获得混淆矩阵。

confusion_matrix(test_y, prediction)

主对角线元素是正确分类的数据,次对角线元素是错误分类的数据。现在让看看分类的准确性。

accuracy = accuracy_score(test_y, prediction) print('AdaBoost Accuracy: ', accuracy)

准确率是96.50%,这是一个相当好的准确率。

谈到优点,AdaBoost不易过拟合,因为输入参数不是联合优化的。通过使用AdaBoost,可以提高弱分类器的准确性。现在,AdaBoost被用来分类文本和图像,而不仅仅是二元分类问题。

AdaBoost的主要缺点是它需要一个高质量的数据集。在采用AdaBoost算法之前,必须避免噪声数据和异常值。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485