网站首页 > 技术文章 正文
AdaBoost算法指南
引言
AdaBoost算法于1997年由Freund和Schapire提出,革命性地改变了集成建模。自诞生以来,AdaBoost已成为解决二元分类问题的广泛采用的技术。这个强大的算法通过将众多弱学习者转化为稳健的强学习者,从而提高预测准确性。
Ada Boosting 算法背后的原理是我们首先在训练数据集上构建一个模型,然后构建第二个模型来纠正第一个模型中存在的错误。这个过程将持续进行,直到错误被最小化,并且数据集被正确预测。Ada Boosting 算法的工作方式类似,它将多个模型(弱学习器)结合起来以达到最终输出(强学习器)。在本文中,您将学习到机器学习中的 Adaboost 算法,以及关于自适应增强和 Adaboost 分类器的各种主题。因此,在本教程中,您将全面理解 Adaboost 算法。
在本文中,您将了解什么是AdaBoost、AdaBoosting是如何工作的、机器学习中的AdaBoost算法以及AdaBoost分类器。AdaBoost,全称为自适应增强,是一种集成学习技术,通过结合多个弱学习者来创建一个强分类器,从而提高机器学习模型的准确性。
学习目标
- 了解AdaBoost算法是什么以及它如何工作。
- 要理解什么是树桩。
- 了解提升算法如何帮助提高机器学习模型的准确性。
目录
- 什么是 AdaBoost 算法?
- 理解AdaBoost算法的工作原理
- 步骤 1:分配权重
- 步骤 2: 分类样本
- 步骤 3: 计算影响
- 步骤 4:计算 TE 和性能
- 步骤 5: 减少错误
- 第6步:新数据集
- 步骤 7:重复前面的步骤
- Adaboost的Python实现
- 从头开始构建AdaBoost
- 使用 Scikit-learn
什么是AdaBoost算法?
有许多机器学习算法可供选择以解决您的问题。预测建模中的一种算法称为AdaBoost。
AdaBoost算法,全称自适应提升(Adaptive Boosting),是在机器学习中作为集成方法使用的提升技术。之所以称为自适应提升,是因为权重会重新分配给每个实例,错误分类的实例将获得更高的权重。
这个算法的作用是构建一个模型,并对所有数据点给予相等的权重。然后,它为错误分类的点分配更高的权重。现在,所有权重更高的点在下一个模型中被赋予更多的重要性。它将持续训练模型,直到获得更低的错误率。
让我们以一个例子来理解这一点,假设你在泰坦尼克号数据集上构建了一个决策树算法,由此你得到了80%的准确率。在这之后,你应用了不同的算法并检查准确率,KNN的准确率为75%,线性回归的准确率为70%。
在同一个数据集上构建不同模型时,我们观察到准确率的变化。然而,通过利用AdaBoost分类器的强大功能,我们可以将这些算法结合起来,以增强最终的预测。通过对不同模型的结果进行平均,Adaboost使我们能够有效地实现更高的准确率并增强预测能力。
如果你想从视觉上理解这一点,我强烈建议你阅读这篇文章。
这里我们将更加关注数学直觉。
还有另一种叫做梯度自适应增强算法的集成学习算法。在该算法中,我们尝试降低错误而不是权重,正如在AdaBoost中所做的。但在本文中,我们将只关注自适应增强的数学直觉。
理解AdaBoost算法的工作原理
让我们通过以下教程了解这个算法的工作原理。
第一步:分配权重
下面显示的图像是我们数据集的实际表示。由于目标列是二元的,这是一个分类问题。首先,这些数据点将被赋予一些权重。最初,所有权重将是相等的。
计算样本权重的公式是:
\ 其中 N 是数据点的总数
这里因为我们有5个数据点,分配的样本权重将为1/5。
第2步:对样本进行分类
我们首先看看“性别”如何分类样本,然后看看变量(年龄,收入)如何分类样本。
我们将为每个特征创建一个决策树桩,然后计算每棵树的基尼指数。基尼指数最低的树将是我们的第一棵树桩。
在我们的数据集中,假设性别的基尼指数最低,因此它将是我们的第一个树桩。
第一步:计算影响力
我们现在将计算这个分类器在对数据点进行分类时的**“发言权”或“重要性”或“影响力”**,使用以下公式:
总错误只是被误分类数据点的所有样本权重的总和。
在我们的数据集中,假设有1个错误输出,因此我们的总错误将是1/5,而alpha(树桩的性能)将是:
注意:总误差将始终介于 0 和 1 之间.
0表示完美的树桩,1表示糟糕的树桩。
从上面的图表中,我们可以看到,当没有错误分类时,我们就没有错误(总错误 = 0),所以“发言权(alpha)”将是一个大数。
当分类器预测一半正确且一半错误时,总错误 = 0.5,分类器的重要性(表达的数量)将为 0。
如果所有的样本都被错误分类,那么错误率将非常高(接近1),因此我们的alpha值将是一个负整数。
步骤 4: 计算 TE 和性能
您可能会想知道计算总误差(TE)和Adaboost小树的性能的意义。原因很简单——更新权重是至关重要的。如果在后续模型中保持相同的权重,输出将与初始模型获得的结果相同。
错误的预测将被赋予更大的权重,而正确的预测的权重将被减少。现在,当我们在更新权重后构建下一个模型时,将更加偏向于权重较高的点。
在找到分类器的重要性和总误差后,我们需要最终更新权重,为此,我们使用以下公式:
当样本正确分类时,假设的数量(alpha)将是负的。
比如说 (alpha) 的数值在样本 被错误分类 时将是 正 的。
有四个分类正确的样本和一个错误的样本。这里,该数据点的 样本权重 为 1/5,而 分类桩的性别重要性 为 0.69。
正确分类样本的新权重为:
对于 错误分类 的样本,更新后的权重将是:
注意
查看我输入值时的 alpha 符号,当数据点被正确分类时,alpha 为负,这会将样本权重从 0.2 降低到 0.1004。当出现 误分类 时,alpha 为正,这将将样本权重从 0.2 增加到 0.3988。
我们知道样本权重的总和必须等于1,但在这里如果我们将所有新的样本权重相加,我们会得到0.8004。为了使这个总和等于1,我们将通过将所有权重除以更新权重的总和0.8004来归一化这些权重。因此,在归一化样本权重后,我们得到了这个数据集,现在总和等于1。
第5步:减少错误
现在,我们需要创建一个新数据集,以查看错误是否减少。为此,我们将删除“样本权重”和“新样本权重”列,然后根据“新样本权重”将我们的数据点划分为多个桶。
第6步:新数据集
我们快完成了。现在,算法所做的是从0-1中选择随机数。由于被错误分类的记录具有更高的样本权重,因此选择这些记录的概率非常高。
假设我们算法选取的5个随机数字是0.38,0.26,0.98,0.40,0.55.
现在我们将查看这些随机数字落在桶中的位置,并根据它来创建下面的新数据集。
这成为我们的新数据集,我们看到被错误分类的数据点由于权重较高被选择了 3 次。
第7步:重复之前的步骤
现在这个作为我们的新数据集,我们需要重复以上所有步骤,即。
- 为所有数据点分配相等的权重。
- 找到对于新采样集合分类效果最好的树桩,通过寻找它们的基尼指数并选择基尼指数最低的一个。
- 计算“发言权数量”和“总误差”以更新先前的样本权重。
- 归一化新的样本权重。
迭代这些步骤,直到达到低训练误差为止。
假设,关于我们的数据集,我们已经以顺序方式构建了 3 棵决策树(DT1, DT2, DT3)。如果我们现在发送我们的测试数据,它将通过所有的决策树,最后,我们将看到哪个类别占多数,并以此为基础,对我们的测试数据集进行预测。
AdaBoost的Python实现
要在Python中实现AdaBoost算法,您可以从头开始构建它或使用像Scikit-Learn这样的库。
从头开始构建AdaBoost
这是一个只使用 NumPy 的 AdaBoost 算法简单实现:
import numpy as np
class DecisionStump:
def __init__(self):
self.polarity = 1
self.feature_idx = None
self.threshold = None
self.alpha = None
def predict(self, X):
n_samples = X.shape[0]
predictions = np.ones(n_samples)
feature_column = X[:, self.feature_idx]
if self.polarity == 1:
predictions[feature_column < self.threshold] = -1
else:
predictions[feature_column > self.threshold] = -1
return predictions
class AdaBoost:
def __init__(self, n_clf=5):
self.n_clf = n_clf
self.clfs = []
def fit(self, X, y):
n_samples, n_features = X.shape
w = np.full(n_samples, (1 / n_samples))
for _ in range(self.n_clf):
clf = DecisionStump()
min_error = float('inf')
for feature_i in range(n_features):
X_column = X[:, feature_i]
thresholds = np.unique(X_column)
for threshold in thresholds:
predictions = np.ones(n_samples)
predictions[X_column < threshold] = -1
error = sum(w[y != predictions])
if error > 0.5:
error = 1 - error
p = -1
else:
p = 1
if error < min_error:
clf.polarity = p
clf.threshold = threshold
clf.feature_idx = feature_i
min_error = error
EPS = 1e-10
# 设置 alpha 值
clf.alpha = 0.5 * np.log((1.0 - min_error + EPS) / (min_error + EPS))
predictions = clf.predict(X)
w *= np.exp(-clf.alpha * y * predictions)
w /= np.sum(w)
self.clfs.append(clf)
def predict(self, X):
clf_preds = [clf.alpha * clf.predict(X) for clf in self.clfs]
y_pred = np.sum(clf_preds, axis=0)
return np.sign(y_pred)
使用 Scikit-learn
如果您更喜欢更简单的方法,可以使用Scikit-learn库,它内置了AdaBoost分类器。以下是具体操作方法:
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
# 加载数据集
data = pd.read_csv("Iris.csv") # 根据需要调整文件路径
X = data.iloc[:, :-1].values # 特征
y = data.iloc[:, -1].values # 目标
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建AdaBoost分类器
abc = AdaBoostClassifier(base_estimator=DecisionTreeClassifier(max_depth=1), n_estimators=50)
# 拟合模型
abc.fit(X_train, y_train)
# 预测和评估
y_pred = abc.predict(X_test)
print("准确率:", accuracy_score(y_test, y_pred))
结论
如果你理解了本文的每一行,那么你最终掌握了这个算法。
我们首先向您介绍了什么是Boosting,以及它的各种类型,以确保您了解Adaboost分类器以及AdaBoost算法的确切位置。然后我们应用了简单的数学,查看了公式的每个部分是如何工作的。
希望你喜欢这篇文章!AdaBoost算法,也称为Ada增强算法,通过结合弱分类器的预测来提高其性能。这种强大的技术,通常被称为Ada提升,显著提高了准确性。
在下一篇文章中,我将解释梯度下降和极限梯度下降算法,这些是增强预测能力的几种更重要的提升技术。
如果你想了解关于从零开始实现AdaBoost分类器机器学习模型的初学者Python实现,请访问这个 完整指南 来自分析维迪亚。这篇文章提到了集成学习中的bagging和ada boosting之间的区别,以及AdaBoost算法的优缺点。
关键要点:
- 在这篇文章中,我们了解了ada boosting是如何工作的。
- 我们理解了adaboost背后的数学原理。
- 我们了解到弱学习器是如何作为估计器被使用以提高准确性的。
猜你喜欢
- 2024-09-27 座舱内感知系统的算法及集成方式 智能座舱测试包含哪些
- 2024-09-27 新技术 | 交流电机无级调速新架构DAAC?,摆脱复杂算法设计
- 2024-09-27 计算机视觉十大算法:深度探索与未来展望 一、引言 ...
- 2024-09-27 机器学习的十大算法:千禧年的智慧之选(上)
- 2024-09-27 机器学习中的集成方法概述 集成方法论
- 2024-09-27 感知算法、规划地图……波士顿动力揭秘Atlas机器人跑酷背后技术
- 2024-09-27 从内核性能到功能集成,PMSM驱控能力又进一步
- 2024-09-27 图卷积网络集成多组学数据分类新算法——MOGONET
- 2024-09-27 集成方法和深度集成方法 集成方法有哪些
- 2024-09-27 机器学习之集成学习算法 集成算法优缺点
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)