BoostingClassifier

写在前面

前面博客写过 bagging 算法的实现方式,并且提到集成算法的其他三类模型组合方式,此文主要简述Boosting 中Adaboost / GBDT 的实现方式.

算法主要特点

Boosting:

  • 顺序集合:尝试添加在之前模型缺失的地方做得很好的新模型
  • 旨在减少偏差,而不是方差
  • 适合低方差高偏差模型
  • 基于树的方法的示例是梯度提升

图例描述
这里写图片描述


接下来进入主题

1. Adaboost 算法:

WIKI百科:
AdaBoost,即Adaptive Boosting,译为自适应增强,其1995年由Freund和Schapire提出的。AdaBoost算法是提升方法(Boosting)的一种,那什么是提升方法呢?提升方法是一种将弱学习算法提升为强学习算法的一种统计学习方法,在分类问题中,它通过反复修改训练样本的权值分布,构建一系列基本分类器(弱分类器),并将这些基本分类器线性组合起来,构建一个强分类器,以提高分类性能。而AdaBoost算法便是提升方法中的代表性算法,另外一个是提升树方法(Boosting Tree)。

通俗理解:
即Adaptive boosting,是一种迭代算法。每轮迭代中会在训练集上产生一个新的分类器,然后使用该分类器对所有样本进行分类,以评估每个样本的重要性(informative)。 具体来说,算法会为每个训练样本赋予一个权值。每次用训练完的新分类器标注各个样本,若某个样本点已被分类正确,则将其权值降低;若样本点未被正确分类,则提高其权值。权值越高的样本在下一次训练中所占的比重越大,也就是说越难区分的样本在训练过程中会变得越来越重要。 整个迭代过程直到错误率足够小或达到一定次数为止。


1.1 实现原理:

  • 数学基础
    这里写图片描述

  • 图例描述
    这里写图片描述

  • 实现描述

    1. 初始化样本的权值为1/n。
    2. 基于样本与权值训练弱分类器;
    3. 根据分类器对样本进行判别,如果判别正确,此样本的权值降低,判别错误,降低样本的权值,同时 根据识别率计算出此分类器的权值;
    4. 利用改变权值的样本训练下一个分类器;
    5. 循环得到N个分类器与其对应的权值;
    6. 基于加权的分类器组合成为最终的模型

    adaboost算法模型简单,不容易过拟合,无需调参,优点挺多。但是其实也是需要根据样本类型来使用。


1.2 实例分析:

  1. 实例环境

    sklearn + anconda + jupyter

  2. 实例步骤

    • 数据:可以采用 datasets 的数据,在此作者使用的是自己整理的股票行情
    • 训练、测试数据归一化
    • 参数寻优可以使用GridSearch,在此不作赘述

    参数列表:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是基学习器为KNN的五分类Boosting代码示例(Python实现): ```python import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.neighbors import KNeighborsClassifier # 定义一个Boosting分类器 class BoostingClassifier: def __init__(self, base_estimator, n_estimators): self.base_estimator = base_estimator self.n_estimators = n_estimators self.estimators = [] # 训练模型 def fit(self, X, y): # 初始化权重 sample_size = X.shape[0] weights = np.ones(sample_size) / sample_size for i in range(self.n_estimators): # 基于样本权重抽取样本 indices = np.random.choice(sample_size, sample_size, p=weights) # 训练一个基学习器 estimator = self.base_estimator() estimator.fit(X[indices], y[indices]) # 记录基学习器,并更新样本权重 self.estimators.append(estimator) y_pred = estimator.predict(X) error = np.sum(weights * (y != y_pred)) alpha = np.log((1 - error) / error) / 2 weights = weights * np.exp(-alpha * y * y_pred) # 预测 def predict(self, X): y_pred = np.zeros(X.shape[0]) for estimator in self.estimators: y_pred += estimator.predict(X) * alpha return np.round(y_pred).astype(int) # 生成样本数据 X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_classes=5, random_state=42) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义基学习器 base_estimator = KNeighborsClassifier # 定义Boosting分类器 clf = BoostingClassifier(base_estimator=base_estimator, n_estimators=100) # 训练模型 clf.fit(X_train, y_train) # 预测测试集结果 y_pred = clf.predict(X_test) # 输出模型准确率 print("Accuracy:", accuracy_score(y_test, y_pred)) ``` 在这个例子中,我们使用KNN作为基学习器,并将其传递给Boosting分类器。我们训练了一个100个基学习器的分类器,并在测试集上进行了预测。最后,我们输出了模型的准确率。 同样,这也只是一个简单的示例,你可以根据自己的需求进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奥特曼不秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值