集成学习是一种机器学习技术,它通过组合多个单独的模型来创建一个主模型。本文将探讨提升方法,特别是AdaBoost算法的详细解释。
首先,来探讨Bagging和Boosting的区别。以随机森林(Bagging技术)和AdaBoost(Boosting技术)为例,它们都属于集成学习家族。随机森林是一个并行学习过程,而AdaBoost是一个序贯学习过程。在随机森林中,各个模型或决策树是并行且独立构建的。而在AdaBoost中,一个树依赖于前一个树,即如果存在多个模型,每个模型的集成过程是依赖于前一个模型的输出的。
第二个区别是,在随机森林中,所有模型在最终模型中都有相等的权重。而在AdaBoost中,模型并不都有相等的权重,这意味着一些模型在最终模型中的权重会更大,而另一些则更小。
第三个区别是,在随机森林中,每个单独的模型都是一个完全成长的决策树。而在AdaBoost中,树并不是完全成长的,它们只是有一个根节点和两个叶子节点,这在AdaBoost中被称为“桩”(stumps)。
现在通过一个例子来理解AdaBoost是如何工作的。考虑一个简单的数据集,包含年龄、BMI和性别三列。将性别作为目标列,其余作为自变量。AdaBoost首先会给所有记录分配一个初始权重,这些权重的总和等于1。
接下来,AdaBoost作为一个序贯学习过程,会首先拟合第一个模型或基础模型。在AdaBoost中,弱学习器是桩,它们有一个根节点和两个叶子节点。这个桩是如何创建的呢?仍然使用基尼指数或熵指数,前两列是创建根节点的候选列。通过检查这些指数,选择一个条件,然后创建这个桩。
一旦这个桩被创建,接下来就是用这个桩来测试数据的准确性。测试结果可能会显示,这个桩在训练数据上的分类可能会出错。例如,如果第三个记录被前一个模型错误分类,那么在下一个迭代或下一个模型中,这个记录的权重会增加,而为了使整个权重归一化,其他记录的权重会降低。
如果有大约100万条记录,将会有很多记录被弱学习器错误分类,因此这些记录在下一个学习器或下一个ML模型2中的权重会增加。类似地,这个ML模型2也会错误分类一些观察结果。那些观察结果的权重会再次增加,而其他观察结果的权重会降低以归一化。所有模型都是这样创建的,前一个模型的错误分类,下一个模型会尝试正确分类。这就是为什么这种技术被称为提升技术,这个算法被称为AdaBoost。
最终模型是所有这些学习结果的组合,因此这种技术被称为提升技术,这个算法被称为AdaBoost。重要的是理解权重的初始化和基于错误分类的权重调整,创建决策树、创建桩的内部基本概念仍然相同,如基尼指数、熵指数等。但不同的是这些权重及其调整。这就是AdaBoost的工作原理。
权重的分配有一个公式。初始权重的分配可以由以下公式给出:
初始权重 = 1/N
其中N表示数据点的总数,即记录的数量。实际影响可以使用以下公式进行分类:
alpha = 影响某个桩在最终决策中的权重
总错误是错误分类数据的总数。样本权重可以使用以下公式更新:
新样本权重 = Euler数 * 旧样本权重
如果记录被正确分类,alpha将是正数;否则将是负数。
首先,将加载所有基本库。
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算法之前,必须避免噪声数据和异常值。