7. Adaboost原理以及代码实现

您所在的位置:网站首页 adaboost算法用例 7. Adaboost原理以及代码实现

7. Adaboost原理以及代码实现

2023-03-26 05:46| 来源: 网络整理| 查看: 265

完整的实验代码在我的github上 QYHcrossover/ML-numpy: 机器学习算法numpy实现 (github.com) 欢迎star⭐

当你需要从一个弱分类器中得到强分类器的时候,Adaboost算法是一个很好的选择。Adaboost 是一种集成学习算法,主要用于二分类问题。它通过对多个分类器的集成来提高分类性能。Adaboost 会对数据集进行多次训练,并将每次训练得到的分类器加权组合,最终形成一个强分类器。

Adaboost 原理

Adaboost 的核心思想是将若干个弱分类器组合成一个强分类器。弱分类器是指分类准确率略高于随机猜测的分类器,例如决策树的深度较浅、逻辑回归的迭代次数较少等。 Adaboost 算法的关键在于为每个弱分类器分配一个权重,用于计算最终分类器的输出。

Adaboost 算法的具体流程如下:

初始化训练数据集的权重向量 w_1 = (w_{1,1},w_{1,2},...,w_{1,N}),其中 N 表示训练数据集的大小,w_{1,i} 表示第 i 个样本的权重,通常初始值为 1/N。对于 m=1,2,...,M,进行以下步骤:使用当前权重向量 w_m 训练一个弱分类器 h_m(x)。计算弱分类器 h_m(x) 的误差率 \epsilon_m,其中 \epsilon_m 定义为分类器 h_m(x) 在当前权重向量下,被误分类的样本的权重之和,即 \epsilon_m=\sum_{i=1}^{N}w_{m,i}I(y_i \neq h_m(x_i)),其中 I 为指示函数,当 y_i \neq h_m(x_i) 时为 1,否则为 0。计算弱分类器 h_m(x) 的权重 \alpha_m,其中 \alpha_m 定义为 \alpha_m = \frac{1}{2}ln(\frac{1-\epsilon_m}{\epsilon_m})。更新权重向量 w_{m+1},其中 w_{m+1,i} = \frac{w_{m,i}}{Z_m}exp(-\alpha_m y_i h_m(x_i)),其中 Z_m 是规范化因子,使得 w_{m+1} 成为一个概率分布,即 Z_m=\sum_{i=1}^{N}w_{m,i}exp(-\alpha_m y_i h_m(x_i))。

得到最终的分类器 H(x)=\text{sign}(\sum_{m=1}^{M}\alpha_m h_m(x))。

Adaboost算法的原理是基于这样一个事实:虽然弱分类器可能不能正确地分类训练数据,但是通过组合它们,我们可以得到一个更强的分类器。在每次迭代中,Adaboost将更多的关注放在上一次分类错误的样本上,以便下一次迭代时它们被正确分类的概率更高。通过这种方式,Adaboost算法不断地优化分类器,使其在分类训练数据时的准确性不断提高。

Adaboost代码实现

下面是使用Python实现Adaboost算法的代码。我们将使用乳腺癌数据集来演示Adaboost算法的应用。在此代码中,我们定义了一个MyAdaboost类,其中包含fit和predict方法,用于训练和预测Adaboost模型。在fit方法中,我们使用best_split方法找到最佳划分点,并使用G方法构造弱分类器的决策函数g(X)。在predict方法中,我们计算加权的弱分类器的预测结果,并返回最终预测标签。最后,我们使用score方法计算测试数据集上的分类准确度。

# 构建Adaboost类 class MyAdaboost: def __init__(self,n_estimators): self.n_estimators = n_estimators self.clfs = [lambda x:0 for i in range(self.n_estimators)] self.alphas = [0 for i in range(self.n_estimators)] self.weights = None # 构造弱分类器的决策函数g(X) def _G(self,fi,fv,direct): assert direct in ["positive","nagetive"] def _g(X): if direct == "positive": predict = (X[:,fi] value assign 0 else -1 predict[predict == 0] = 1 return predict return _g #选择最佳的划分点,即求出fi和fv def _best_split(self,X,y,w): best_err = 1e10 best_fi = None best_fv = None best_direct = None for fi in range(X.shape[1]): series = X[:,fi] for fv in np.sort(series): predict = np.zeros_like(series,dtype=np.int32) # direct = postive predict[series fv] = 1 err = np.sum((predict != y)* 1 * w) # print("err = {} ,fi={},fv={},direct={}".format(err,fi,fv,"postive")) if err


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3