计算机系统应用教程网站

网站首页 > 技术文章 正文

机器学习AdaBoost算法指南 boost算法机器学习比较

btikc 2024-09-27 01:06:25 技术文章 16 ℃ 0 评论

AdaBoost算法指南

引言

AdaBoost算法于1997年由Freund和Schapire提出,革命性地改变了集成建模。自诞生以来,AdaBoost已成为解决二元分类问题的广泛采用的技术。这个强大的算法通过将众多弱学习者转化为稳健的强学习者,从而提高预测准确性。

Ada Boosting 算法背后的原理是我们首先在训练数据集上构建一个模型,然后构建第二个模型来纠正第一个模型中存在的错误。这个过程将持续进行,直到错误被最小化,并且数据集被正确预测。Ada Boosting 算法的工作方式类似,它将多个模型(弱学习器)结合起来以达到最终输出(强学习器)。在本文中,您将学习到机器学习中的 Adaboost 算法,以及关于自适应增强和 Adaboost 分类器的各种主题。因此,在本教程中,您将全面理解 Adaboost 算法。

在本文中,您将了解什么是AdaBoost、AdaBoosting是如何工作的、机器学习中的AdaBoost算法以及AdaBoost分类器。AdaBoost,全称为自适应增强,是一种集成学习技术,通过结合多个弱学习者来创建一个强分类器,从而提高机器学习模型的准确性。

学习目标

  • 了解AdaBoost算法是什么以及它如何工作。
  • 要理解什么是树桩。
  • 了解提升算法如何帮助提高机器学习模型的准确性。

目录

  1. 什么是 AdaBoost 算法?
  2. 理解AdaBoost算法的工作原理
  3. 步骤 1:分配权重
  4. 步骤 2: 分类样本
  5. 步骤 3: 计算影响
  6. 步骤 4:计算 TE 和性能
  7. 步骤 5: 减少错误
  8. 第6步:新数据集
  9. 步骤 7:重复前面的步骤
  10. Adaboost的Python实现
  11. 从头开始构建AdaBoost
  12. 使用 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背后的数学原理。
  • 我们了解到弱学习器是如何作为估计器被使用以提高准确性的。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表