美文网首页
AdaBoostDemo,GBDT

AdaBoostDemo,GBDT

作者: yanghedada | 来源:发表于2018-09-07 11:49 被阅读28次

    AdaBoostDemo

    
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.ensemble import AdaBoostClassifier
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.datasets import make_gaussian_quantiles
    
    #用make_gaussian_quantiles生成多组多维正态分布的数据
    #这里生成2维正态分布,设定样本数1000,协方差2
    x1,y1=make_gaussian_quantiles(cov=2., n_samples=200, n_features=2, n_classes=2, shuffle=True, random_state=1)
    #为了增加样本分布的复杂度,再生成一个数据分布
    x2,y2=make_gaussian_quantiles(mean=(3,3), cov=1.5, n_samples=300, n_features=2, n_classes=2, shuffle=True, random_state=1)
    #合并
    X=np.vstack((x1,x2))
    y=np.hstack((y1,1-y2))
    #plt.scatter(X[:,0],X[:,1],c=Y)
    #plt.show()
    
    #设定弱分类器CART
    weakClassifier=DecisionTreeClassifier(max_depth=1)
    
    #构建模型。
    clf=AdaBoostClassifier(base_estimator=weakClassifier,algorithm='SAMME',n_estimators=300,learning_rate=0.8)
    clf.fit(X, y)
    
    #绘制分类效果
    x1_min=X[:,0].min()-1
    x1_max=X[:,0].max()+1
    x2_min=X[:,1].min()-1
    x2_max=X[:,1].max()+1
    x1_,x2_=np.meshgrid(np.arange(x1_min,x1_max,0.02),np.arange(x2_min,x2_max,0.02))
    
    y_=clf.predict(np.c_[x1_.ravel(),x2_.ravel()])
    y_=y_.reshape(x1_.shape)
    plt.contourf(x1_,x2_,y_,cmap=plt.cm.Paired)
    plt.scatter(X[:,0],X[:,1],c=y)
    plt.show()
    

    AdaBoostFirstTry

    '''
    在scikit-learn库中,有AdaBoostRegression(回归)和AdaBoostClassifier(分类)两个
    在对和AdaBoostClassifier进行调参时,主要是对两部分进行调参:1)AdaBoost框架调参;2)弱分类器调参
    '''
    
    #导包
    from sklearn.model_selection import cross_val_score
    from sklearn.datasets import load_iris
    from sklearn.ensemble import AdaBoostClassifier  
    
    #载入数据,sklearn中自带的iris数据集
    iris=load_iris()
    
    '''
    AdaBoostClassifier参数解释
    base_estimator:弱分类器,默认是CART分类树:DecisionTressClassifier
    algorithm:在scikit-learn实现了两种AdaBoost分类算法,即SAMME和SAMME.R,
               SAMME就是原理篇介绍到的AdaBoost算法,指Discrete AdaBoost
               SAMME.R指Real AdaBoost,返回值不再是离散的类型,而是一个表示概率的实数值,算法流程见后文
                                两者的主要区别是弱分类器权重的度量,SAMME使用了分类效果作为弱分类器权重,SAMME.R使用了预测概率作为弱分类器权重。
               SAMME.R的迭代一般比SAMME快,默认算法是SAMME.R。因此,base_estimator必须使用支持概率预测的分类器。
    loss:这个只在回归中用到,不解释了
    n_estimator:最大迭代次数,默认50。在实际调参过程中,常常将n_estimator和学习率learning_rate一起考虑
    learning_rate:每个弱分类器的权重缩减系数v。f_k(x)=f_{k-1}*a_k*G_k(x)。较小的v意味着更多的迭代次数,默认是1,也就是v不发挥作用。
    另外的弱分类器的调参,弱分类器不同则参数不同,这里不详细叙述
    '''
    #构建模型
    clf=AdaBoostClassifier(n_estimators=100)  #弱分类器个数设为100
    scores=cross_val_score(clf,iris.data,iris.target)
    print(scores.mean())
    

    GBDT

    '''
    GBDT有分类和回归,回归是GradientBoostingRegressor
    示例给出的是分类
    GradientBoostingClassifier支持二分类和多分类。
    '''
    
    from sklearn.datasets import make_hastie_10_2
    from sklearn.ensemble import GradientBoostingClassifier
    from sklearn.grid_search import GridSearchCV
    
    #取样本
    X,y=make_hastie_10_2(random_state=42)
    
    
    
        
    '''
    调参:
    loss:损失函数。有deviance和exponential两种。deviance是采用对数似然,exponential是指数损失,后者相当于AdaBoost。
    n_estimators:最大弱学习器个数,默认是100,调参时要注意过拟合或欠拟合,一般和learning_rate一起考虑。
    learning_rate:步长,即每个弱学习器的权重缩减系数,默认为0.1,取值范围0-1,当取值为1时,相当于权重不缩减。较小的learning_rate相当于更多的迭代次数。
    subsample:子采样,默认为1,取值范围(0,1],当取值为1时,相当于没有采样。小于1时,即进行采样,按比例采样得到的样本去构建弱学习器。这样做可以防止过拟合,但是值不能太低,会造成高方差。
    init:初始化弱学习器。不使用的话就是第一轮迭代构建的弱学习器.如果没有先验的话就可以不用管
    由于GBDT使用CART回归决策树。以下参数用于调优弱学习器,主要都是为了防止过拟合
    max_feature:树分裂时考虑的最大特征数,默认为None,也就是考虑所有特征。可以取值有:log2,auto,sqrt
    max_depth:CART最大深度,默认为None
    min_sample_split:划分节点时需要保留的样本数。当某节点的样本数小于某个值时,就当做叶子节点,不允许再分裂。默认是2
    min_sample_leaf:叶子节点最少样本数。如果某个叶子节点数量少于某个值,会同它的兄弟节点一起被剪枝。默认是1
    min_weight_fraction_leaf:叶子节点最小的样本权重和。如果小于某个值,会同它的兄弟节点一起被剪枝。一般用于权重变化的样本。默认是0
    min_leaf_nodes:最大叶子节点数
    '''
    
    #确定调优参数
    parameters = {
                   'n_estimators':[50,100,150],
                   'learning_rate':[0.5,1,1.5],
                   'max_depth':[1,2,3]
                   }
        
    #构建模型,调优,确定十折交叉验证
    estimator=GradientBoostingClassifier(random_state=42)
    best_clf=GridSearchCV(estimator=estimator, param_grid=parameters, cv=10).fit(X, y)
    print(best_clf.best_params_,best_clf.best_score_  )
    
    

    相关文章

      网友评论

          本文标题:AdaBoostDemo,GBDT

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