zoukankan      html  css  js  c++  java
  • 【笔记】Ada Boosting和Gradient Boosting

    Ada Boosting和Gradient Boosting

    Ada Boosting

    除了先前的集成学习的思路以外,还有一种集成学习的思路boosting,这种思路,也是集成多个模型,但是和bagging不同的是,bagging的模型之间是独立的关系,但是在boosting中,模型之间不是独立的关系,而是一种相互增强的关系

    集成多个模型,每个模型都在尝试增强整体的效果,这种效果就叫做boosting

    其中最为典型的就是Ada boosting,以简单的回归问题为例,首先对原始的数据集(所有点的权值都一样大)进行学习(使用某一种学习方法),学习完以后可以得到模型,基本所有的算法都会犯一些错误,那么就对错误的点(基本没有错误的点以外的点)进行标记,让这些点产生权重的差别(改变权值可以看出是极值的问题),让上一次学习中没有学习到的点的权值增大,减小上次学习中已经学习过的点的权值,这样形成了新的样本数据

    然后再使用学习算法进行学习,由于权值的差距,因此学习的时候可能优先选择上次没有学习的点,然后又可以得到一个模型,同样的,其中也有着没有被学习和被学习了的点,然后重复操作,将两种类型的点进行权值的变化,形成新的样本数据,再次学习,然后再进行上面的操作,依次进行下去

    这样生成的模型都是在弥补上次没有被预测成功地样本点,也就是说每一个模型都在boost上一个模型犯的错误,经过这个过程,也可以生成很多的子模型,但是是基于同样的样本点形成的,不过区别在权重的不一样,最后用这些有差异的子模型进行综合投票,来作为Ada boosting整体的学习结果

    Ada boosting的具体实现

    (在notebook中)

    加载好需要的包,然后使用虚拟数据,设置随机种子为666,然后绘制图像

    import numpy as np
    import matplotlib.pyplot as plt
    
    from sklearn import datasets
    
    X,y = datasets.make_moons(n_samples=500,noise=0.3,random_state=666)
    
    plt.scatter(X[y==0,0],X[y==0,1])
    plt.scatter(X[y==1,0],X[y==1,1])
    

    图像如下

    对数据进行分割

    from sklearn.model_selection import train_test_split
    
    X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42)
    

    调用sklearn中的AdaBoostClassifier类就可以实现Ada boosting,同样的使用决策树算法作为基本的算法,在实例化的时候传入参数,设置算法为决策树算法,在实例化决策树的时候也可以进行传参,这里设置最大深度为2,然后设置集成的分类器数量为500,然后进行训练,计算准确度

    from sklearn.ensemble import AdaBoostClassifier
    from sklearn.tree import DecisionTreeClassifier
    
    ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2),n_estimators=500)
    ada_clf.fit(X_train,y_train)
    ada_clf.score(X_test,y_test)
    

    结果如下

    Gradient Boosting

    另外一个比较常见的boosting算法是gradient boosting,这种算法的思想是,现针对整体的数据集使用某一个算法进行训练,训练出模型后设这个模型为m1,这个模型的对应的产生的错误为e1,然后针对e1训练第二个模型m2,同时得到的错误设置为e2,然后再针对e2训练第三个模型m3,得到的错误称为e3,以此类推,在这其中,m2的作用是可以预测出m1将会犯的错误,m2的输出是就是m1所犯的错误,同理往下,每一个模型都是对前面的模型所犯的错误的补偿,当有一个新的数据,那么最终预测的结果应该就是这些预测模型的总和

    具体实现,只要调用sklearn中的GradientBoostingClassifier类就可以了,传入的参数这里设置为最大深度为2,子模型的数量为30,然后进行训练以后计算出准确度

    from sklearn.ensemble import GradientBoostingClassifier
    
    gb_clf = GradientBoostingClassifier(max_depth=2,n_estimators=30)
    gb_clf.fit(X_train,y_train)
    gb_clf.score(X_test,y_test)
    

    结果如下

    boosting也可以解决回归问题,和bagging一样,只要使用sklearn中的解决回归问题的类就可以了,比如adaboostregressor和GradientBoostingregressor这两个类都可以解决回归问题

    感谢观看,文笔有限,博客不出彩,还请多多见谅
  • 相关阅读:
    BZOJ 1066 [SCOI2007]蜥蜴 (最大流)
    Codeforces 1092 D2 Great Vova Wall (Version 2) (栈)
    BZOJ 1046 [HAOI2007]上升序列(LIS + 贪心)
    牛客练习赛34 D little w and Exchange(归纳)
    BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
    GTMD并查集!
    2018icpc南京现场赛-G Pyramid(打标找规律+逆元)
    drwxr-xr-x 2 root root 4096 06-29 14:30 Test 分段解释
    Linux里面非常重要的目录
    点击 触发 事件 的 jQuery 写法样式
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14347740.html
Copyright © 2011-2022 走看看