精华内容
下载资源
问答
  • 目录梯度提升分类树二分类原理 梯度提升分类树二分类原理 import numpy as np from sklearn.ensemble import GradientBoostingClassifier from sklearn import tree import matplotlib.pyplot as plt xi=np.arange...

    梯度提升分类树二分类原理

    在这里插入图片描述

    import numpy as np
    from sklearn.ensemble import GradientBoostingClassifier
    from sklearn import tree
    import matplotlib.pyplot as plt
    xi=np.arange(1,11)
    yi=np.array([0,0,0,1,1]*2)
    gbdt=GradientBoostingClassifier(n_estimators=3,max_depth=1)
    gbdt.fit(xi.reshape(-1,1),yi)
    print(gbdt.estimators_.shape)
    _=tree.plot_tree(gbdt[0,0],filled=True)
    plt.show()
    print('均方误差:',np.var(yi))
    # 第一颗决策树的构建
    # 计算F0的值
    F0=np.log(4/6)
    print('F0=',F0)
    # 计算残差,概率,负梯度
    yi_1=yi-1/(1+np.exp(-F0))
    print('yi_1=',yi_1)
    # 计算每个裂分点的mse
    mse1=[]
    for i in range(1,11):
        if i==10:
            mse1.append(np.var(yi_1))
        else:
            mse1.append((np.var(yi_1[:i])*i+np.var(yi_1[i:])*(10-i))/10)
    mse1=np.asarray(mse1)
    print(np.round(mse1,4))
    
    # 两个分支,计算左面分支的gamma预测值
    gamma1=yi_1[:8].sum()/(((yi[:8]-yi_1[:8])*(1-yi[:8]+yi_1[:8])).sum())
    gamma1=np.round(gamma1,3)
    print('gamma1=',gamma1)
    #右面分支的gamma预测值
    gamma2=yi_1[8:].sum()/(((yi[8:]-yi_1[8:])*(1-yi[8:]+yi_1[8:])).sum())
    gamma2=np.round(gamma2,3)
    print('gamma2=',gamma2)
    
    # 第一棵树,数据预测的值
    y_1=[-0.625]*8+[2.5]*2
    y_1=np.asarray(y_1)
    print(gbdt[0,0].predict(xi.reshape(-1,1)))
    
    # 用F0更新F1,学习率 learning_rate=0.1
    F1=F0+y_1*0.1
    F1=F1.round(4)
    print('F1=',F1)
    
    # 拟合第二棵树
    # 计算残差,概率,负梯度
    yi_2=yi-1/(1+np.exp(-F1))
    print('yi_2=',yi_2)
    # 计算每个裂分点的mse
    mse2=[]
    for i in range(1,11):
        if i==10:
            mse2.append(np.var(yi_2))
        else:
            mse2.append((np.var(yi_2[:i])*i+np.var(yi_2[i:])*(10-i))/10)
    mse2=np.asarray(mse2)
    print(np.round(mse2,4))
    
    # 两个分支,计算左面分支的gamma预测值
    gamma1_1=yi_2[:8].sum()/(((yi[:8]-yi_2[:8])*(1-yi[:8]+yi_2[:8])).sum())
    gamma1_1=np.round(gamma1_1,3)
    print('gamma1_1=',gamma1_1)
    #右面分支的gamma预测值
    gamma2_1=yi_2[8:].sum()/(((yi[8:]-yi_2[8:])*(1-yi[8:]+yi_2[8:])).sum())
    gamma2_1=np.round(gamma2_1,3)
    print('gamma2_1=',gamma2_1)
    _=tree.plot_tree(gbdt[1,0],filled=True)
    plt.show()
    
    (3, 1)
    均方误差: 0.24
    F0= -0.40546510810816444
    yi_1= [-0.4 -0.4 -0.4  0.6  0.6 -0.4 -0.4 -0.4  0.6  0.6]
    [0.2222 0.2    0.1714 0.225  0.24   0.2333 0.2095 0.15   0.2    0.24  ]
    gamma1= -0.625
    gamma2= 2.5
    [-0.625 -0.625 -0.625 -0.625 -0.625 -0.625 -0.625 -0.625  2.5    2.5  ]
    F1= [-0.468  -0.468  -0.468  -0.468  -0.468  -0.468  -0.468  -0.468  -0.1555
     -0.1555]
    yi_2= [-0.38508973 -0.38508973 -0.38508973  0.61491027  0.61491027 -0.38508973
     -0.38508973 -0.38508973  0.53879686  0.53879686]
    [0.2062 0.1856 0.1592 0.2105 0.2224 0.2187 0.1998 0.15   0.1904 0.2227]
    gamma1_1= -0.57
    gamma2_1= 2.168

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    参考文章https://blog.csdn.net/On_theway10/article/details/83576715?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158830485819725256722728%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.57662%2522%257D&request_id=158830485819725256722728&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-1

    展开全文
  • plt.figure(figsize=(9,6)) _ = tree.plot_tree(gbdt[0,0],filled=True)
  • python 决策集成-梯度提升回归分类实操 基础概念 集成 集成是合并多个机器学习模型来构建更强大模型的方法。在机器学习算法中有许多模型属于这一类,但已证明有两种集成模型对大量分类和回归的数据集都是有效...

    python 决策树集成-梯度提升回归树之分类实操

    基础概念

    集成

    集成是合并多个机器学习模型来构建更强大模型的方法。在机器学习算法中有许多模型属于这一类,但已证明有两种集成模型对大量分类和回归的数据集都是有效的,二者都以决策树为基础,分别是随机森林(random forest)梯度提升决策树(gradiet boosted decision tree)

    之前已经讲解过了随机森林(决策树集成-随机森林之分类实操),这次讲解梯度提升决策树。在了解梯度提升决策树之前,建议先去看一下我的另外两篇讲解决策树的文章决策树算法之讲解实操(上)决策树算法之讲解实操(下),重复的东西,我这里就不在赘述了。

    思想简介

    在之前的一篇文章决策树算法之讲解实操(上)中我们提到过,决策树的一个主要缺点在于经常对训练数据过拟合。那么除了随机森林之外,梯度提升回归树就是解决这个问题的另一种方法。

    梯度提升回归树是通过合并多个决策树来构建一个更为强大的模型。虽然名字中含有"回归",但是这个模型既可以用于回归也可以用于分类。与随机森林的方法不同,梯度提升采用连续的方式构造树,每颗树都试图纠正前一棵树的错误.默认情况下,梯度提升回归树中没有随机化,而是用到了强预剪枝。梯度提升树通常使用深度很小(1到5之间)的树,这样模型占用的内存更少,预测速度也更快.

    梯度提升树背后的主要思想是合并许多简单的模型(在这个语境中叫做弱学习器),比如深度较小的树.每棵树只能对部分数据作出好的预测,因此,添加的树越来越多,可以不断迭代,提高性能.

    梯度提升树经常是机器学习竞赛的优胜者,并广泛应用于业界.与随机森林相比,它通常对参数的设置更为敏感,但如果参数设置正确的话,模型精度会更高.

    实操建模

    数据是一份红酒质量分类的数据集,通过各个维度来判断红酒质量,之前在决策树算法之讲解实操(上)中已经讲解使用过了,这里就不多在赘述了,我们直接建模,代码如下所示:

    import pandas as pd
    import numpy as np
    import winreg
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import GradientBoostingClassifier#梯度提升回归树
    from sklearn.metrics import accuracy_score
    ###################
    real_address = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',)
    file_address=winreg.QueryValueEx(real_address, "Desktop")[0]
    file_address+='\\'
    file_origin=file_address+"\\源数据-分析\\winequality-red.csv"###https://www.kaggle.com/uciml/red-wine-quality-cortez-et-al-2009
    red_wine=pd.read_csv(file_origin)
    #设立桌面绝对路径,读取源数据文件,这样将数据直接下载到桌面上就可以了,省得还要去找
    ###################
    train=red_wine.drop(["quality"],axis=1)
    X_train,X_test,y_train,y_test=train_test_split(train,red_wine["quality"],random_state=1)
    ###考虑到接下来可能需要进行其他的操作,所以定了一个随机种子,保证接下来的train和test是同一组数
    gbcf=GradientBoostingClassifier(random_state=1)
    gbcf.fit(X_train,y_train)
    print("梯度提升回归树训练模型评分:"+str(accuracy_score(y_train,gbcf.predict(X_train))))
    print("梯度提升回归树待测模型评分:"+str(accuracy_score(y_test,gbcf.predict(X_test))))
    

    结果如下所示:
    在这里插入图片描述

    下面是之前的文章中单棵决策树建立的模型结果:
    在这里插入图片描述
    二者相比可以看出,梯度提升树的模型精度要比单棵树的要好一点,过拟合现象也比之前要减轻很多。
    接下来我们了解一下梯度提升树的主要模型参数。

    模型参数

    在梯度提升回归树中,我们主要会用到三个模型参数n_estimators(树的个数),max_depth(树的深度),learning_rate(学习率),至于其它的参数,一般情况下直接默认就好。

    max_depth:用于降低每棵树的复杂度.一般来说,梯度提升模型的max_depth通常设置得很小,一般不超过5.
    接下来我们来调节这个参数,提高模型精度,代码及结果如下所示:

    result_1=pd.DataFrame(columns=["决策树深度(max_depth)","梯度提升回归树待测模型评分"])
    for i in range(1,5):
        gbcf=GradientBoostingClassifier(max_depth=i,random_state=1)
        gbcf.fit(X_train,y_train)
        result_1=result_1.append([{"决策树深度(max_depth)":i,"梯度提升回归树待测模型评分":accuracy_score(y_test,gbcf.predict(X_test))}])
    result_1[result_1["梯度提升回归树待测模型评分"]==result_1["梯度提升回归树待测模型评分"].max()]
    

    在这里插入图片描述

    可以看到当我们设定参数max_depth为4的时候,模型精度可以达到66.5%左右,较之前的结果提高了一些。

    梯度提升树模型的另外两个主要参数包括树的数量n_estimators学习率learn_rate,后者用于控制每棵树对前一棵树的错误纠正程度.这两个参数高度相关,因为learning_rate越低,就需要更多的树来构建具有相似复杂度的模型.随机森林的n_estimators值总是越大越好,但是梯度提升不同,增大n_estimators会导致模型更加复杂,进而可能导致过拟合.通常的做法是根据时间和内存的预算选择合适的n_estimators,然后对不同的learning_rate进行遍历.

    这两个参数的调节代码及结果如下所示:

    result_2=pd.DataFrame(columns=["集成树的个数(n_estimators)","梯度提升回归树待测模型评分"])
    for i in range(1,500,10):
        gbcf=GradientBoostingClassifier(max_depth=4,n_estimators=i,random_state=1)
        gbcf.fit(X_train,y_train)
        result_2=result_2.append([{"集成树的个数(n_estimators)":i,"梯度提升回归树待测模型评分":accuracy_score(y_test,gbcf.predict(X_test))}])
    result_2[result_2["梯度提升回归树待测模型评分"]==result_2["梯度提升回归树待测模型评分"].max()]
    

    在这里插入图片描述
    n_estimators的调节结果如上图所示,那么接下来我们在上面的参数基础上继续调节学习率:

    result_3=pd.DataFrame(columns=["学习率(learning_rate)","梯度提升回归树待测模型评分"])
    for i in range(1,10):
        m=i/10
        gbcf=GradientBoostingClassifier(max_depth=4,n_estimators=161,learning_rate=m,random_state=1)
        gbcf.fit(X_train,y_train)
        result_3=result_3.append([{"学习率(learning_rate)":m,"梯度提升回归树待测模型评分":accuracy_score(y_test,gbcf.predict(X_test))}])
    result_3[result_3["梯度提升回归树待测模型评分"]==result_3["梯度提升回归树待测模型评分"].max()]
    

    在这里插入图片描述
    接下来,我们还可以对学习率的参数调节进行进一步的区间划分,代码及结果如下所示:

    result_4=pd.DataFrame(columns=["学习率(learning_rate)","梯度提升回归树待测模型评分"])
    for i in range(1,20):
        m=i/100
        gbcf=GradientBoostingClassifier(max_depth=4,n_estimators=161,learning_rate=m,random_state=1)
        gbcf.fit(X_train,y_train)
        result_4=result_4.append([{"学习率(learning_rate)":m,"梯度提升回归树待测模型评分":accuracy_score(y_test,gbcf.predict(X_test))}])
    result_4[result_4["梯度提升回归树待测模型评分"]==result_4["梯度提升回归树待测模型评分"].max()]
    

    在这里插入图片描述
    至此,这个模型的参数就调节完毕了.
    (ps:为了提高模型精度,参数是可以进行更近一步的调节,不过剩下的就需要朋友们自行探索了)

    分析特征重要性

    与随机森林类似,梯度提升树也可以给出特征重要性,代码及结果如下:

    from sklearn.ensemble import RandomForestClassifier
    import seaborn as sns
    import matplotlib.pyplot as plt
    plt.style.use("fivethirtyeight")
    sns.set_style({'font.sans-serif':['SimHei','Arial']})
    %matplotlib inline
    gbcf=GradientBoostingClassifier(max_depth=4,random_state=1)###梯度提升回归树
    forest=RandomForestClassifier(max_depth=4,random_state=1)###随机森林分类器
    gbcf_prediction=gbcf.fit(X_train,y_train)
    forest_prediction=forest.fit(X_train,y_train)
    fig= plt.subplots(figsize=(20,15))
    fig1 = plt.subplot(211)
    plt.title('梯度提升回归树特征重要性',fontsize=20)
    plt.bar(train.columns,gbcf_prediction.feature_importances_,0.4,color="blue")
    plt.legend()
    fig2=plt.subplot(212)
    plt.title('随机森林特征重要性',fontsize=20)
    plt.bar(train.columns,forest_prediction.feature_importances_,0.4,color="green")
    plt.legend()
    plt.xticks(fontsize=13)
    

    在这里插入图片描述

    如上图所示,在保证树的深度参数(max_depth)相同的情况下,梯度提升树的特征重要性与随机森林的特征重要性有些相似,实际上在某些数据集中,梯度提升树可能会完全忽略某些特征.

    优缺点

    梯度提升决策树是监督学习中最强大也是最常用的模型之一.其主要缺点是需要仔细调参,而且训练的时间可能会比较长.与其他基于树的模型类似,这一算法不需要对数据进行缩放就可以表现得很好,而且也适用于二元特征与连续特征同时存在的数据集.但它也通常不适用于高维稀疏数据.

    由于梯度提升和随机森林两种方法在类似的数据上表现的都很好,因此一种常用的方法就是先尝试随机森林,它的鲁棒性很好.如果随机森林效果很好,但预测时间太长,或者机器学习模型精度小数点后第二位的提高也很重要,那么切换成梯度提升通常会有用.

    有很多地方做的不是很好,欢迎网友来提出建议,也希望可以遇到些朋友来一起交流讨论。

    展开全文
  • 2019-01-14修改部分文字内容,增强理解  ...梯度提升分类树算法 1.GBDT概念 以决策树为基学习器的集成学习算法具有预测精度高的优势,树的集成算法主要有随机森林和GBDT。随机森林具有很好的抗过...

    2019-01-14修改部分文字内容,增强理解 

    2019-01-17修改章节4.提升树算法与负梯度拟合,章节5.梯度提升回归树算法,更改公式、加注释使其更加容易理解

                        增加章节2.GBDT优缺点,6.梯度提升分类树算法

    1.GBDT概念

    以决策树为基学习器的集成学习算法具有预测精度高的优势,树的集成算法主要有随机森林和GBDT。随机森林具有很好的抗过拟合特性,且决策树个数对预测偏差的影响较小,调参较为容易。GBDT(或MART、GTB、GBRT)梯度提升决策树是一种迭代决策树算法(多用于回归,也可用于分类),GBDT由多颗决策树组成,所有决策树结论累加起来做最终分类预测,是集成学习boosting家族中的一员。GBDT中的树都是回归树(非分类树),GBDT用来做回归预测,调整后也可用作分类,GBDT可发现多种有区分性的特征及特征组合

    基于树的集成学习算法在模型训练结束后,可输出模型使用特征变量的相对重要度,理解哪些因素对预测有关键影响,在生物信息学、神经系统科学领域很重要

    2.GBDT优缺点

    优点:

    1)可灵活处理各种类型数据,包括连续型和离散型

    2)在相对少的调参时间下,预测准确率也比较高。相对SVM

    3)使用一些健壮损失函数,对异常值的鲁棒性非常强。比如Huber损失函数和Quantile分位数损失函数

    缺点:

    1)由于弱学习器间存在依赖关系,难以并行训练数据。不过可通过自采样的SGBT来达到部分并行

    3.CART回归树算法

    回归树的整体流程近似于分类树,但回归树的每个节点都有一个预测值(该节点所有样本目标变量的平均值,节点趋同方差最小),分枝时穷举每个feature的每个阈值找最优分割点(衡量标准不再是熵值/信息增益/基尼系数等,是最小化平方误差),通过最小化平方误差能找到最可靠的分枝依据,分枝直到每个叶节点上目标变量均相同或达到预设终止条件(如叶节点个数)

    最小二乘回归树生成算法:

    输入:训练数据集D

    输出:回归树f(x)

    在训练数据集D的输入空间中,递归的将每个区域划分为两个子区域并决定每个子区域输出,构建二叉回归树

    4.提升树算法与负梯度拟合

    提升树是迭代多颗回归树进行共同决策,当采用误差损失函数时,每一颗回归树学习的是之前所有树的结论与残差,拟合得到一个当前的残差(真实值-预测值)回归树。提升树是整个迭代过程中生成回归树的累加

    范例:训练一个提升树预测年龄,训练集是4个人,A,B,C,D年龄分别是14,16,24,26。样本中有购物金额、上网时长、经常到百度知道提问等特征。提升树的过程如下:

    其中预测值是回归树所有值累加

     5.梯度提升决策树算法 

    损失函数表

    Huber损失函数是均方差和绝对值损失函数(前两种)的折中产物,对于Huber损失函数和分位数损失函数,主要用于健壮回归,可减少异常点对损失函数影响

    损失函数表中的绝对值损失函数和Huber损失函数,每一步的优化不容易(损失函数的定义较为复杂),故Friedman提出梯度提升算法,每次建立模型都是在之前建立模型损失函数的梯度下降方向,利用最速下降的近似方法(即损失函数(一般是拟合程度+正则项)的负梯度在当前模型中的值)作为回归问题提升树算法的残差近似值,来进一步拟合一个回归树

    6.梯度提升分类树算法

    GBDT分类算法的样本输出不是连续值,而是离散类别。可用两个方法解决,一是指数损失函数,此时GBDT退化为Adaboost算法;二是对数似然损失函数,用类别的预测概率值与真实概率值的差来拟合损失,针对对数损失函数,有二元分类和多元分类的区别

    7.梯度提升决策树深度

    推荐GBDT树深度6(而决策树或随机森林需要将树深度设为15或更高)

    boosting主要关注偏差,因此能基于泛化能力较弱的基学习器构建预测能力很强的集成。bagging主要关注方差,因此bagging在不剪枝决策树、神经网络的基学习器上效用更为明显。就机器学习而言,泛化误差可分为两部分,偏差(bias,预测值与真实值间的偏差程度,反映模型本身拟合能力)和方差(同等规模训练集的变动导致学习能力变化,variance,反映数据扰动的影响)

    在训练模型时,泛化误差的两个部分都要考虑:

    bagging:由于会并行训练很多不同分类器,目的是降低方差(variance),因为采用相互独立的基分类器较多,故每个基分类器目标是如何降低偏差(bias),所以采用深度很深甚至不剪枝决策树

    boosting:每一步都在上轮基础上更加拟合原数据,故可保证偏差(bias),所以对每个基分类器就在于如何选择variance更小的分类器,即更简单分类器(深度很浅决策树)

    8.boosted tree优势

    1.使用不同类型自变量数据时,不需要做特征归一化/标准化/最大最小化

    2.可输出特征变量的相对重要程度,作为特征选择方法

    3.模型可解释性好

    4.对数据字段缺失不敏感

    5.能自动做多组特征变量间的interaction,具有良好的非线性性

    6.容易平衡运行时效率和精度,如使用boosted tree做的在线预测模型在机器资源紧张时可截断参与预测的决策树数量从而提高预测效率

    9.特征重要度

    Friedman在GBM论文中提出的方法:特征j的全局重要度是通过j在单颗树中的重要度取平均值来衡量:

    #feature_importances_属性的计算方法
    def feature_importances_(self):
        total_sum = np.zeros((self.n_features,),dtype=np.float64)
        for tree in self.estimators_:
            total_sum += tree.feature_importances_ 
        importances = total_sum / len(self.estimators_)
        return importances
    #self.estimators_是算法构建出的决策树数组,tree.feature_importances_ 是单棵树的特征重要度向量

    10.GBDT-Python

    1.GBDT分类

    每一棵树拟合当前模型损失函数的负梯度,构建新的树加入当前模型中形成新模型,下一棵树拟合新模型损失函数的负梯度

    from sklearn.ensemble import GradientBoostingClassifier
    
    GradientBoostingClassifier(criterion='friedman_mse', init=None, learning_rate=0.1, loss='deviance', max_depth=3, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=100, presort='auto', random_state=None, subsample=1.0, verbose=0, warm_start=False)
    
    gbc = GradientBoostingClassifier()
    gbc.fit(x_train,y_train)
    
    y_pred_5=gbc.predict(X_test_new)
    #probability of 1
    y_pred_6=gbc.predict_proba(X_test_new)[:,1]
    y_pred_6=gbc.predict_proba(X_test_new)[:,0]

    2.GBDT回归

    每一棵树拟合当前整个模型的残差,构建新树加入到当前模型中形成新模型,下一棵树拟合新模型残差

    from sklearn import ensemble
    clf = ensemble.GradientBoostingRegressor()
    gbdt_model = clf.fit(X_train, y_train)
    y_upper = gbdt_model.predict(x_test)

    11.GBDT+LR

    1.GBDT构建新特征思想

    特征决定模型性能上限。用已有特征训练GBDT模型,然后用GBDT模型学习到的树构建新特征,并将这些新特征加入到原特征中一起训练模型。新特征向量长度等于GBDT模型所有回归树叶节点个数和

    上图是混合模型结构,已有输入特征通过增强决策树进行转换,每个单独决策树的输出被视为稀疏线性分类器的输入特征(增强决策树被证明是非常强大的特征转换)。上图有两棵树(左树有三个叶子节点,右树有两个)最终特征即五维向量。对于输入x,假设落在左树第一个节点,编码[1,0,0],落在右树第二个节点则编码[0,1],所以整体的编码为[1,0,0,0,1],这类编码作为特征,输入到线性分类模型(LR or FM)中进行分类

    2.GBDT与LR融合方案

    CTR预估是互联网计算广告、推荐、搜索业务中的核心环节,给定一个用户、一个匹配到的候选商品、一个环境,预测该用户购买商品的可能性有多大。其中用的最多模型是LR广义线性模型(映射后的函数值即CTR预估值),LR线性模型容易并行化,但学习能力有限,需要大量特征工程预先分析出有效特征、特征组合,从而间接增强LR模型的非线性学习能力

    在CTR预估中若为每个AD ID(广告ID)建GBDT树,相当于挖掘区分每个广告的特征。而对曝光不充分的样本(长尾样本部分),无法单独建树。综合方案为使用GBDT对非ID和ID分别建一类树

    非ID类树:不以细粒度的ID建树(此类树作为base树),即以所有ID一起构建GBDT。即便曝光少的广告、广告主仍可以通过此类树得到有区分性的特征、特征组合

    ID类树:以细粒度的ID建一类树(每个ID单独构建GBDT)用于发现曝光充分训练样本充足ID对应有区分性的特征、特征组合。以如下图为例,当一条样本x进来后,遍历两类树到叶子节点,得到特征作为LR模型输入

    GBDT映射得到的特征空间维度:GBDT树有多少叶节点(一个叶节点对应一种有区分性特征、特征组合)通过GBDT得到的特征空间就有多大。通过GBDT转换得到的特征空间较低,假如Base树、ID树各N颗,特征空间维度最高为(N+N*广告数+N*广告主数+N*广告类目数)*叶节点个数。其中广告数、广告主数、广告类目数都是有限的(只有曝光度高的),同时参考Kaggle竞赛中树的数目N最多30,叶节点个数小于10,估算通过GBDT映射得到的特征空间维度并不高

    通过实验发现GBDT+LR在曝光充分广告上确实有效果,但整体效果需要权衡优化各类树的使用。同时也可考虑将GBDT生成特征与LR原有特征结合起来使用

    12.GBDT运用正则化技巧-调参

    gbc=GradientBoostingClassifier(init=None,learning_rate=0.1,loss='deviance',max_depth=3,max_features=None,max_leaf_nodes=None,min_samples_leaf=1,min_samples_split=2,min_weight_fraction_leaf=0.0,n_estimators=100,random_state=None,subsample=1.0,verbose=0,warm_start=False)
    
    #learning_rate:学习速率
    #loss:损失函数,ls最小二乘法,deviance
    #max_depth:每棵树深度(通常4-6)
    #n_estimators:回归树数量
    #max_features:在找到最佳分隔节点前对所有特征取样(需要有充足特征>30个)

    展开全文
  • 原理: 决策生成算法: 是递归地生成决策,它往往分类精细,对训练数据集分类准确,但是对未知数据集却没有那么准确,有比较...梯度提升决策按照一定的次序搭建多个分类模型。模型之间彼此存在依赖关系。后续加入
  • 1. 梯度提升决策概述 梯度提升决策(Gradient Boosting Decision Tree,GBDT)是以决策为基学习器的一种Boosting算法,它在每一轮迭代中建立一个决策,使当前模型的残差在梯度方向上减少;然后将该决策与...

    1. 梯度提升决策树概述

    梯度提升决策树(Gradient Boosting Decision Tree,GBDT)是以决策树为基学习器的一种Boosting算法,它在每一轮迭代中建立一个决策树,使当前模型的残差在梯度方向上减少;然后将该决策树与当前模型进行线性组合得到新模型;不断重复,直到决策树数目达到指定的值,得到最终的强学习器。

    上一篇博客【机器学习】集成学习——Boosting与AdaBoost原理详解与公式推导对AdaBoost算法做了总结,GBDT与AdaBoost的主要区别有:

    1. 迭代策略不同:AdaBoost在每一轮迭代中都要更新样本分布;GBDT迭代学习上一轮得到的加法模型与真实值之间的残差,它并不显式改变样本分布,而是利用残差变相地增大错误样本的权重。

    2. 组合策略不同:AdaBoost中误差率越低的基学习器在最终模型中所占比重越高,而GBDT每棵树的权值都相等。

    3. 基学习器限定不同:AdaBoost的基学习器不限,使用最广泛的是决策树和神经网络;而GBDT的基学习器限定为决策树,且是回归树。

    4. 损失函数不同:AdaBoost分类算法的损失函数限定为指数损失,而GBDT可以是指数损失函数和对数似然函数。

    2. 提升树

    在介绍梯度提升决策树之前,我们首先来介绍提升树。

    介绍了提升方法本身是采用加法模型和前向分步算法的一种方法,而提升树(Boosting Tree)是以决策树为基学习器的一种提升方法,对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。

    提升树模型可以表示为决策树的加法模型:

                                            H_ { T } ( x ) = \sum _ { t = 1 } ^ { T } h \left( x ; \Theta _ { t } \right)                         (1)

    其中,h \left( x ; \Theta _ { t } \right)表示第t棵决策树;\Theta _ { t }是的参数;T是决策树个数。

    根据前向分步算法,第t步将要得到的提升树模型为:

                                            H _ { t } ( x ) = H_ { t - 1 } ( x ) + h \left( x ; \Theta _ { t } \right)                         (2)

    其中,H _ { t } ( x )为当前模型。那么第Ť轮迭代的目标是得到能最小化{H_t} \ left(x \ right)的损失函数的第t棵决策树h \left( x ; \Theta _ { t } \right)的参数,即:

                                    \hat { \Theta } _ { t } = \arg \min _ { \Theta _ { t } } \sum _ { i = 1 } ^ { m } L \left( y _ { i } , H _ { t - 1 } \left( x _ { i } \right) + h \left( x _ { i } ; \Theta _ { t } \right) \right)                         (3)

    对于二类分类问题,只要把AdaBoost中的基分类器限定为二类分类树即可。可以说这时的提升树是AdaBoost的特殊情况。

    对于回归问题,当采用平方误差损失函数( y - H ) ^ { 2 }时,第t次迭代的损失是:

                                    \begin{array}{l} L\left( {y,{H_t}(x)} \right) = L\left( {y,{H_{t - 1}}(x) + h\left( {x;{\Theta _t}} \right)} \right)\\ {\rm{ = }}{\left[ {y - {H_{t - 1}}(x) - h\left( {x;{\Theta _t}} \right)} \right]^2}\\ {\rm{ = }}{\left[ {{r_t} - h\left( {x;{\Theta _t}} \right)} \right]^2} \end{array}                         (4)

    h\left( {x;{\Theta _t}} \right){\rm{ = }}y - {H_{t - 1}}(x){\rm{ = }}{r_t}时,损失最小。也就是说,第t次迭代的优化目标是拟合当前模型的残差。

    3. 梯度提升决策树原理

    在提升方法中,每次迭代的优化问题可以分为两部分:一、求叶结点区域;二、给定叶结点区域,求区域内最优拟合值。

    对于第二个问题,它是一个简单的“定位”估计,最优解很容易得到;但对于第一个问题,当损失函数不是平方误差和指数损失,而是一般损失函数时,求解区域是困难的,最小化损失函数问题的简单、快速求解算法是不存在的。

    针对这一问题,梯度提升决策树利用最速下降法来近似求解加法模型中的每一颗决策树,具体来说,就是在每次迭代中,使新建的决策树都沿损失函数减少最快的方向——负梯度方向减少损失函数

    当前模型的负梯度为:

                                    r_{ti} = - \left[ \frac { \partial L \left( y , H \left( x _ { i } \right) \right) } { \partial H \left( x _ { i } \right) } \right] _ { H ( x ) = H_ { t - 1 } ( x ) }                         (5)

    当损失函数是平方误差时,当前模型的负梯度就等于残差,沿负梯度方向减少损失函数就相当于拟合残差。

    但当损失函数不是平方误差时,负梯度就是残差的近似值,称为“广义残差或伪残差”。例如,当损失函数是绝对误差时,负梯度是残差的符号函数,因此在每次迭代时,决策树将拟合当前残差的符号。

    总之,GBDT利用广义残差来拟合每一轮迭代中的回归树。

    一些广泛应用的损失函数的梯度如下表:

    GBDT常用损失函数列表
    GBDT常用损失函数列表

    4. GBDT回归算法 

    下面介绍GBDT回归算法,也可以当做GBDT的通用算法。必须声明的是,无论是GBDT分类算法还是回归算法,弱学习器都是回归树,这是由残差本质决定的。


    输入:训练集D = \left\{ \left( x _ { i } , y _ { i } \right) \right\} _ { i = 1 } ^ { m },其中x _ { i } \in \chi \subseteq R ^ { d}y _ { i } \in \mathcal { Y } \subseteq \mathbf { R };损失函数L

    过程:

            (1)初始化模型H _ { 0 } ( x ),估计使损失函数最小化的常数值\gamma,初始模型是只有一个根结点的树。

                                   {H_0}(x) = \mathop {\arg \min }\limits_\gamma \sum\limits_{i = 1}^m L \left( {{y_i},\gamma } \right)

            (2)对迭代轮次{t = 1,2,\ ldots,T}

                    (a)对样本i = 1,2 , \cdots , m,计算当前模型的广义残差:

                                    r _ { t i } = - \left[ \frac { \partial L \left( y _ { y } , H \left( x _ { i } \right) \right) } { \partial H \left( x _ { i } \right) } \right] _ { H ( x ) = H_ { t - 1 } ( x ) }                        

                    (b)利用\left( {{x_i},{r_{ti}}} \right),i = 1,2, \ldots ,m拟合一棵回归树,得到第t棵树的叶结点区域{R_{tj}},j = 1,2, \cdots ,J

                    (c)对每个叶结点区域{R_{tj}},j = 1,2, \cdots ,J,计算能使区域{R_{tj}}损失函数最小化的最佳预测值{\gamma _{tj}}

                                    \gamma _ { t j } = \arg \min _ { \gamma } \sum _ { x _ { i } \in R _ { t j } } L \left( y _ { i } , H _ { t - 1 } \left( x _ { i } \right) + \gamma \right)

                    (d)得到本轮迭代最佳拟合回归树:

                                    h _ { t } ( x) = \sum _ { j = 1 } ^ { J } \gamma _ { t j } I \left( x \in R _ { t j } \right)

                    (e)更新本轮迭代的加法模型:

                                    H _ { t } ( x ) = H _ { t - 1 } ( x ) + h _ { t } ( x)= H _ { t - 1 } ( x ) + \sum _ { j = 1 } ^ { J } \gamma _ { t j } I \left( x \in R _ { t j } \right)

            (3)得到最终的强学习器:

                                    H ( x ) = H _ { T } ( x ) = \sum _ { t = 1 } ^ { T } \sum _ { j = 1 } ^ { J } \gamma _ { t j } I \left( x \in R _ { t j } \right)

    输出:回归树H ( x )


    5. 二元GBDT分类算法

    在分类任务中,由于样本输出是离散值,无法从输出类别拟合残差,因此使用类别的预测概率值和真实概率值的差来当做残差。

    GBDT分类算法的损失函数可以取指数损失函数和对数似然函数,如果选择指数损失函数,则GBDT退化为AdaBoost。因此我们这里只讨论对数似然损失函数。

    二元分类的对数似然损失函数是:

                                    L ( y ,H ( x ) ) = \log ( 1 + \exp ( - 2y H( x ) ) )                         (6)

    负梯度为:

                    {r_{ti}} = - {\left[ {\frac{{\partial L\left( {y,H\left( {{x_i}} \right)} \right))}}{{\partial H\left( {{x_i}} \right)}}} \right]_{H(x) = {H_{t - 1}}(x)}} = \frac{{2{y_i}}}{{1 + \exp \left( {2{y_i}{H_{t - 1}}\left( {{x_i}} \right)} \right)}}        (7)

    利用\left( {{x_i},{r_{ti}}} \right),i = 1,2, \ldots ,m拟合一棵回归树,得到第t棵树的叶结点区域{R_{tj}},j = 1,2, \cdots ,J

    每个叶结点区域{R_{tj}},j = 1,2, \cdots ,J的最佳预测值{\gamma _{tj}}为:

                    {\gamma _{tj}} = \underbrace {\arg \min }_\gamma \sum\limits_{{x_i} \in {R_{tj}}} {\log } \left( {1 + \exp \left( { - {2y_i}\left( {{H_{t - 1}}\left( {{x_i}} \right) + \gamma } \right)} \right)} \right)        (8)

    由于上式比较难优化,我们用近似值代替:

                                    {\gamma _{tj}} = \frac{{\sum\limits_{x \in {R_{tj}}} {{r_{ti}}} }}{{\sum\limits_{x \in {R_{tj}}} {\left| {{r_{ti}}} \right|} (2 - |{r_{ti}}|)}}                         (9)

    除了负梯度计算和叶子节点最佳预测值计算不同,其他都与回归算法一致。

    得到最终的模型H ( x ) = H _ { T } ( x ) = \sum _ { t = 1 } ^ { T } \sum _ { j = 1 } ^ { J } \gamma _ { t j } I \left( x \in R _ { t j } \right)后,用来进行概率估计得到:

                                    P ( y = 1 | x ) = p = \frac { e ^ { 2H ( x ) } } { 1 + e ^ { 2 H ( x ) } } = \frac { 1 } { 1 + e ^ { - 2 H ( x ) } }                         (10)

                                    P ( y = - 1 | x ) = 1 - p = \frac { 1 } { 1 + e ^ { 2 H ( x ) } }                         (11)

    6. GBDT优缺点

    优点:

    1. 可以灵活处理混合型数据(异构特征);

    2. 强大的预测能力;

    3. 在输出空间中对异常点的鲁棒性(通过具有鲁棒性的损失函数实现,如Huber损失函数和分位数损失函数)。

    缺点:

    1. 在更大规模的数据集或复杂度更高的模型上的可扩展性差;

    2. 由于提升算法的有序性,因此很难做到并行。

    参考文献:

    1. 《统计学习方法》第八章提升方法——李航

    2. 《统计学习基础》第十章提升和加法树——Trevor Hastie等

    3. 论文《Greedy Function Approximation: A Gradient Boosting Machine》——Jerome H. Friedman

    4. 梯度提升树(GBDT)原理小结

    5. GBDT原理详解

    6. Scikit-learn 0.19.x 中文文档 Gradient Tree Boosting(梯度树提升)

     

     

    展开全文
  • 梯度提升回归(GBDT)

    千次阅读 2020-02-21 23:46:14
    虽然名字中有“回归”,但是该方法既能用于回归问题,也能用于分类问题,与随机森林不同的是,梯度提升回归(GBDT)采用连续的方式构造,每棵都在试图修正前一棵的错误。默认情况下,梯度提升回归没有随机...
  • python3 学习使用随机森林分类梯度提升决策树分类 的api,并将他们和单一决策预测结果做出对比 附上我的git,欢迎大家来参考我其他分类器的代码:https://github.com/linyi0604/MachineLearning 首先,了解...
  •  (1)对于分类问题:决策树是二叉分类树  (2)对于回归问题:决策树是二叉回归树 提升树模型:决策树作为基本分类器的加法模型: M为决策树的数量,θm第m个决策树的参数,hm(x;θm)表示第m个决策树分类器 注意:θm还有一...
  • 梯度提升决策算法(GBDT)作者:江尘([受电子邮件保护])GBDT是Jerome H. Friedman的梯度提升决策算法的高性能且功能齐全的C ++实现。 ([受电子邮件保护])GBDT是Jerome H. Friedman的“梯度增强决策算法”...
  • 梯度提升树

    2020-06-20 22:08:11
    梯度提升树也是建在决策的基础上的。 分10份,每份中是3棵,每棵都是多分类问题 梯度提升树原理 导包 导入数据 声明 使用回归研究其原理 第二棵决策 以下数据为残差 第二颗,根据梯度提升,...
  • 梯度提升是一种用于回归和分类问题的机器学习技术,其产生的预测模型是弱预测模型的集成,如采用典型的决策作为弱预测模型,这时则得到了所谓的梯度提升树(GBDT)。GBDT是在传统机器学习算法里面是对真实分布拟合...
  • 梯度提升决策(Gradient Boosting Decision Tree,GBDT) 集成学习的系列博客: 集成学习(ensemble learning)基础知识 随机森林(random forest) AdaBoost算法(一)——基础知识篇 AdaBoost算法(二)——...
  • GBDT:梯度提升决策

    2019-09-04 15:05:30
    转载:GBDT:梯度提升决策 综述 GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策算法,该算法由多棵决策组成,所有的结论累加起来做最终答案。...
  • GBDT梯度提升回归

    2019-10-19 18:36:24
    为啥用负梯度的值而不用提升里的方法算残差呢,是因为当前损失函数是平方损失和指数损失函数时每步优化都很简单,但是对于一般损失函数而言,每一步的优化并不是那么容易,所以提出了梯度提升作为残差的近似值来...
  • 04-06 梯度提升树

    2020-03-03 09:21:58
    文章目录梯度提升树梯度提升树学习目标梯度提升树详解梯度提升树和提升回归梯度提升树流程输入输出流程梯度提升树优缺点优点缺点小结 梯度提升树   梯度提升树(gradien boosting decision tree,GBDT)在工业上...
  • 本文紧接上文的随机森林分类器模型,实践的同样是分类算法模型,随机森林模型和GBDT模型是机器学习领域里面非常重要的两种集成学习模型,两种模型虽然均采用了集成策略来进一步提升分类器模型的性能,但是本质上是...
  • Python机器学习及实践(一、分类学习——决策 随机森林 梯度提升决策) 决策树分类简介 集成模型分类简介 代码及注释 输入: #决策 随机森林 梯度提升决策 import pandas as pd titanic=pd.read_csv('...
  • 一、梯度提升算法 梯度提升的概念 提升算法的思想 F(x)为预测函数 L(y,F(x))=1/2(y-F(x))2为平方误差 L(y.F(x))=|y=F(x)|为绝对值误差 F*(x)为使得所有样本平方误差的均值最小的F(x) 提升算法的思路: ...
  • 今天学习了梯度提升决策(Gradient Boosting Decision Tree, GBDT),准备写点东西作为记录。后续,我会用python 实现GBDT, 发布到我的Github上,敬请Star。 梯度提升算法是一种通用的学习算法,除了决策,还...
  • 梯度提升决策(GDBT)和随机森林(RF)的异同
  • 梯度提升(Gradient ...梯度提升(梯度增强)是一种用于回归和分类问题的机器学习技术,其产生的预测模型是弱预测模型的集成,如采用典型的决策 作为弱预测模型,这时则为梯度提升树(GBT或GBDT)。像其他提升...
  • 行业分类-物理装置-一种梯度提升树模型的生成方法及系统.zip
  • 梯度提升决策(GBDT)

    2020-06-11 11:00:02
    GBDT(Gradient Boosting Decision Tree),梯度提升决策 Boosting 集成学习经典一类算法,属于个体学习器间存在较强依赖关系的一类,需以串行的序列化生成方法构建。 步骤:先从训练集中训练出一个基学习器,...
  • 1.提升树  以决策树为基函数的提升方法称为提升树。决策树可以分为分类树和回归树。提升树模型可以表示为决策树的加法...特别的,对于二分类问题,我们提升树就是把AdaBoost的基分类器选为二分类树即可。  对...
  • 梯度提升回归是另一种决策集成方法,通过合并多个决策来构建一个更为强大的模型。虽然名字中含有“回归”,但这个模型既可以用于回归也可以用于分类。 与随机森林方法不同,梯度提升采用连续的方式构造,每...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,696
精华内容 5,878
关键字:

梯度提升分类树