美文网首页
ML 监督学习 集成学习 Boosting

ML 监督学习 集成学习 Boosting

作者: XinY_VV | 来源:发表于2020-03-26 08:00 被阅读0次

    集成学习是用多个弱分类器构成一个强分类器,其哲学思想是“三个臭皮匠赛过诸葛亮”。一般的弱分类器可以由决策树,神经网络,贝叶斯分类器,K-近邻等构成。

    弱学习器:泛华性能略优于随机猜测的学习器​
    集成学习通常可获得比单一学习器显著优越的泛华性能

    为什么要集成

    如果每个个体学习器都互相独立,集成模型会工作的很好
    但是每个个体学习器都在同一个训练集上训练,可能会犯同一种错误,导致集成的准确率下降​。
    得到多样的分类器的方法之一:用完全不同的算法,提高集成的正确率​。

    1.模型选择

    假设各弱分类器间具有一定差异性(如不同的算法,不同参数),这会导致生成的分类决策边界不同。将它们结合后能得到更合理的边界,减少整体错误,实现更好的分类效果。

    1. 数据集过大或过小

    数据集较大时,可以分为不同的子集,分别进行训练,然后再合成分类器。
    数据集过小时,可使用自举技术(bootstrapping),从原样本集有放回的抽取m个子集,训练m个分类器,进行集成。

    集成学习通过投票来预测类别

    硬投票分类器
    创建一个更好的分类器的方法整合每一个分类器的预测然后经过投票去预测分类这种分类器叫做硬投票分类器

    软投票分类器
    如果分类器能够估计分为每一类的概率---有predict_proba()方法那么可以对每个分类器的概率取平均,再预测具有最高类概率的类​必须要确保所有分类器都可以估计类的概率

    要获得好的集成,个体学习器应“好而不同"---准确性和多样性
    1.每个弱分类器的错误率不能高于0.5
    2.弱分类器之间的性能要有较大的差别

    集成学习方法

    个体学习器之间存在强依赖性关系,必须串行生成的序列化方法

    Boosting

    一族可将弱学习器提升为强学习器的算法
    a.先从初始数据集训练出一个基学习器
    b.根据基学习器的表现对训练样本分布进行调整
    c.基于调整后的样本分布来训练下一个基学习器
    d.重复以上步骤,直到基学习器数目达到事先指定的值N
    e.最后将N个基学习器进行加权结合​​​​​​

    Boosting算法在训练的每一轮都要检查当前基分类器是否比随机猜测好
    否则抛弃当前基学习器,学习过程停止,则可能未达到N​​​,那么可根据当前分布重新对训练样本进行采样,再重新训练出基学习器,使之达到N​

    Boosting算法中代表性算法

    AdaBoost(自适应增强)

    Gradient Boosting + Exponential Loss + Binary base classifier

    https://youtu.be/k4G2VCuOMMg

    基于数据集多重抽样的分类器,Adaboost是一种迭代算法,算法本身是通过改变数据权值分布来实现。

    a. 给训练数据集中的每一个样本赋予权重,权重初始化相等值,这些权重形成向量D。一般初始化所有训练样例的权重为1 / N,其中N是样例数
    b.在训练集上训练出弱分类器并计算该分类器的错误率
    c.同一数据集上再次训练分类器,调整样本的权重,将第一次分对的样本权重降低,第一次分错的样本权重提高
    d.最后给每一个分类器分配一个权重值α,α = 0.5*ln((1-错误率)/错误率)
    e.计算出alpha值后,可以对权重向量D进行更新,以使得正确分类的样本权重降低而错分样本的权重升高。
    f.Adaboost算法会不断地重复训练和调整权重,直到训练错误率为0或者弱分类器的数目达到指定的值。

    标准AdaBoost只适用于二分类
    Scikit-learn中对应为AdaBoostClassifier类,如果要多分类,则可以设置参数algorithm=”SAMME”,​如果分类器可以预测概率(有predict_proba()),则设置参数algorithm=”SAMME.R” R代表REAL如果AdaBoost集成过拟合,可以减少基分类器的数量或对基分类器使用更强的正则化​

    GBDT 积跬步以至千里

    GB:梯度迭代 Gradient Boosting
    通过迭代多棵树来共同决策。

    DT:回归树 Regression Decision Tree

    1.先用初始数据集来学习一颗决策树,可得到每一片叶子的预测值。以及预测之后的残差(真实值-预测值)
    2.然后下一次迭代的决策树就基于上一次决策树的残差数据来学习,得到的结果是上一轮残差的预测值,以及本轮残差
    3.不断迭代,直到最后一轮的残差为0或者非常小
    4.把所用轮次的模型预测值累加起来就是最终的预测值

    GDBT Boosting参数

    loss:损失函数,对于分类模型,有对数似然函数“deviance”和指数损失函数“exponential” 选择指数损失函数就是Adaboost算法
    n_estimators:默认100,最大的弱学习器的个数/弱学习器的最大迭代次数
    learning_rate:默认0.1

    例子
    ###1.投票分类器---由几个不同的分类器组成
    from sklearn.datasets import load_iris, make_moons
    from sklearn.model_selection import cross_val_score, train_test_split
    from sklearn.preprocessing import StandardScaler,LabelEncoder
    from sklearn.metrics import accuracy_score
    from sklearn.ensemble import RandomForestClassifier,VotingClassifier
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.linear_model import LogisticRegression
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.svm import SVC
    import warnings
    warnings.filterwarnings("ignore")
    
    
    #创建一个半月形的数据集,数据集划分
    x, y = make_moons(n_samples=1000, noise=0.25, random_state=0)
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)
    
    #构建模型
    lr=LogisticRegression()
    rf=RandomForestClassifier()
    svm1=SVC()
    svm2=SVC(probability=True)#SVC默认probability=False,改为True,将使用交叉验证
    voting_hard=VotingClassifier(estimators=[('lr',lr),('rf',rf),('svm',svm1)],voting='hard')
    voting_soft=VotingClassifier(estimators=[('lr',lr),('rf',rf),('svm',svm2)],voting='soft')
    voting_hard.fit(x_train,y_train)
    voting_soft.fit(x_train,y_train)
    #如果用KNN,LogisticRegression最好标准化特征StandardScaler
    
    
    #训练模型并进行预测
    print('hard voting')
    for mla in (lr,rf,svm1,voting_hard):
        mla.fit(x_train,y_train)
        y_pred1=mla.predict(x_test)
        print(mla.__class__.__name__, accuracy_score(y_test, y_pred1))
        
    print('-'*10)
    print('soft voting')
    for mlas in (lr,rf,svm2,voting_hard):
        mlas.fit(x_train,y_train)
        y_pred2=mlas.predict(x_test)
        print(mlas.__class__.__name__, accuracy_score(y_test, y_pred2))
    
    ###2.AdaBoostClassifier
    from sklearn.ensemble import AdaBoostClassifier
    ada=AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm="SAMME.R",learning_rate=0.5)
    ada.fit(x_train,y_train)
    y_pred3=ada.predict(x_test)
    print('-'*10)
    print('AdaBoost',accuracy_score(y_test,y_pred3))
    #当然对于回归也有AdaBoostRegressor
    
    
    from sklearn.datasets import load_iris
    from sklearn.ensemble import GradientBoostingClassifier
    from sklearn.model_selection import GridSearchCV
    
    iris=load_iris()
    x=iris.data
    y=iris.target
    
    from sklearn import model_selection
    X_train,X_test,y_train,y_test=model_selection.train_test_split(x,y,test_size=0.3,random_state=20)
    
    gbdt=GradientBoostingClassifier()
    gbdt.fit(X_train,y_train)
    
    print(gbdt.score(X_test,y_test))
    
    print(gbdt.feature_importances_)
    
    parameters={'n_estimators':[50,80,100],
                'learning_rate':[0.01,0.1,0.2,0.5,1]}
    
    gbdt=GradientBoostingClassifier()
    grid_search=GridSearchCV(gbdt,parameters,scoring='accuracy',cv=5)
    grid_search.fit(x,y)
    
    print(grid_search.best_estimator_)
    print(grid_search.best_score_)
    print(grid_search.best_params_)
    
    总结
    Conclusion

    相关文章

      网友评论

          本文标题:ML 监督学习 集成学习 Boosting

          本文链接:https://www.haomeiwen.com/subject/lthfuhtx.html