集成学习之Adaboost算法详解

发布时间:2024年01月13日

????????Adaptive Boosting(自适应提升)是基于Boosting思想实现的一种集成学习算法,核心思想是提高【在前一步中分类错误的样本权重】来训练一个强分类器,错误的数据会“放大”,正确的数据会“缩小”(上一轮中,分类错误的样本权重会变大,分类正确的样本权重会变小)。Adaboost算法一般用来做二分类,使用的树深度不要过深,否则容易过拟合。

算法推导流程: ? ?

  • 初始化训练样本权重,训练第一个学习器

    • 如果有100个样本,则每个样本权重初始化为:1/100

    • 根据预测结果,找到错误率最小的分裂点,计算、更新样本权重模型权重

  • 根据新的样本权重,训练第二个学习器,直到训练出m个基学习器

    • 根据预测结果,找到错误率最小的分裂点,计算、更新样本权重模型权重

  • m个基学习器的集成预测公式为:

    • H(x) = sign( Σ αi hi (x)),sign是信号函数

    • α为模型权重,输出结果大于0则归为正类,小于0则归为负类

  • 样本权重公式 | 模型权重公式

举例:????????

12345678910
x0123456789
y111-1-1-1111-1
  • 初始化:样本权重初始化为0.1,并构建第一个基学习器:?
12345678910
x0.10.10.10.10.10.10.10.10.10.1
y111-1-1-1111-1
  • 可选的分裂点有:1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5

    • 当以1.5为分裂点时,有5个样本分类错误

    • 当以2.5为分裂点时,有4个样本分类错误

    • 当以3.5为分裂点时,有3个样本分类错误

    • 。。。

    • 当以9.5为分裂点时,有3个样本分类错误

    • 最终:选择以3.5为分裂点,错误率为0.1 * 3 = 0.3错误率为错误样本的权重之和

  • 计算模型权重: 1/2*np.log( (1-0.3)/0.3 ) = 0.4236

  • 更新样本权重:(当前是以3.5为分裂点)

    • 分类正确的样本为:1,2,3,4,5,6,10共七个,则正确样本的变化系数为e-αt ,e-0.4236 = 0.6547

    • 分类错误的样本为:7,8,9共三个,则错误样本的权重变化系数为eαt,e0.4236 = 1.5275

    • 7个正确样本的权重为:0.6547 * 0.1=0.06547 3个错误样本的权重为:1.5275 * 0.1=0.15275

    • 则Zt 为:7 * 0.06547 + 3 * 0.15275 = 0.9165

    • 则正确样本的最终权重为:0.06547÷0.9165=0.07143

    • 则错误样本的最终权重为:0.15275÷0.9165=0.1667

12345678910
x0.0710.0710.0710.0710.0710.0710.16670.1670.1670.071
y111-1-1-1111-1

(迭代训练基学习器中…)共训练了 3 个基学习器,模型权重分别是0.4236,0.6496,0.7515,则:

  • API
  • import pandas as pd
    from sklearn.preprocessing import LabelEncoder   # 类别转化
    from sklearn.model_selection import train_test_split
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import AdaBoostClassifier  # 集成学习--Adaboost算法
    from sklearn.metrics import accuracy_score
    # 1 读数据到内存
    df_wine = pd.read_csv('./data/wine0501.csv')
    # 2 特征处理
    # Adaboost一般做二分类 去掉一类(1,2,3)
    df_wine = df_wine[df_wine['Class label'] != 1]
    # 准备特征值和目标值 Alcohol酒精含量 Hue颜色
    x = df_wine[['Alcohol', 'Hue']].values   
    y = df_wine['Class label']
    # 类别转化 (2,3)=>(0,1)
    y = LabelEncoder().fit_transform(y)
    # 2-5 划分数据
    X_train,X_test,y_train,y_test = train_test_split(x,y,random_state=22,test_size=0.2)
    # 3 实例化单决策树 实例化Adaboost-由500颗树组成
    mytree = DecisionTreeClassifier(criterion='entropy', max_depth=1, random_state=0) myada = AdaBoostClassifier(base_estimator=mytree, n_estimators=500, learning_rate=0.1, random_state=0)
    # 4 单决策树训练和评估
    mytree.fit(X_train, y_train)
    myscore = mytree.score(X_test, y_test)
    # 5 AdaBoost训练和评估
    myada.fit(X_train, y_train)
    myscore = myada.score(X_test, y_test)
    ?
文章来源:https://blog.csdn.net/qq_31754023/article/details/135520082
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。