【算法】决策树模型 & 集成算法模型GBDT

一、决策树模型

决策树算法是一种归纳分类算法,它通过对训练集的学习,挖掘有用的规则,对新数据集进行预测。它属于有监督、非参数学习算法,对每个输入使用该分类区域的训练数据得到对应的局部模型。决策树模型的基本算法是贪心算法,以自顶向下递归的方式构建决策树。
可以用一下集中方法构建决策树。

1. ID3算法

ID3算法的核心思想是最大化信息熵增益。所谓最大化信息熵增益,即每次进行下一次分裂时,计算出所有类别对应当前特征的熵,选择能够十的信息熵增益最大的那一个特征类别进行下一次的分裂。假设在数据D中有 k个类别,其中第i个类别数据在总数据中占有率为p_i,则熵的计算公式为:
请添加图片描述
由于初始数据可以划分的类别不止一项,于是我们需要对已经划分为D类别的数据再次分类,假设此次的类别为A,则类别A对数据集D划分的条件熵为:
请添加图片描述
二者的差值即信息熵增益:
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
在这里插入图片描述

2. C4.5算法

尽管ID3算法能够帮助决策下次分裂特征,但其本身存在一个问题:一般会优先选择有较多属性值的类别,因为属性值多的类别相对于属性值少的类别有相对较大的信息熵增益。

C4.5算法使用增益率作为选择分支的准则,同时引入分裂信息来惩罚取值较多多的分类。其定义为:
请添加图片描述
请添加图片描述
该公式表述的是,每一个类别i所占比重为权重的熵值和代表当前特征D_i的惩罚值。这样,类别数量越多,特征D在样本内部越不趋近于稳定,越不容易被选为当前的分类节点。
以上述例子为例,
请添加图片描述

3. CART算法

CART假设决策树是二叉树,内部节点特征的取值为“是”和“否”。这样的决策树等价于递归的二分每个特征,将输入空间(即特征空间)划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在给定的输入条件下确定输出的条件概率分布。

CART算法由以下两步组成:

  1. 决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大。
  2. 决策树剪枝:通过验证数据集对已生成的树进行剪枝并选择最优子树,这时以损失函数最小最为剪枝的标准。
A. CART树生成

CART决策树的生成是递归的构建二叉决策树的过程。CART决策树既可以用于分类,也可以用于回归。对于分类而言,CART以基尼系数最小化准则进行特征选择,生成二叉决策树。请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述

请添加图片描述
请添加图片描述
之后在依次计算剩下两种分组的GINI系数增加值。

综上: 虽然在原始数据中只有4个分类,但是在计算GINI系数增加值时,需要计算(3+1+1+3)中分组可能。(即A1和A4有三个分类,即有三种划分情况;A2和A3只有两个分类,即有一种划分情况)。

按照这种计算方式依次计算,每次都选取GINI系数增加最大的划分可能,直至数据没有在划分的可能或者数据已经完全分开。

值得注意的是,当数据是连续型时,我们将数据从小到大排列,去相邻两个取值的均值作为划分点。例如,数据为(60,70,80,90),我们分别取65,75,85作为划分点,并且计算划分之后的GINI增加值。

B. CART树剪枝

剪枝方法的本质是在树模型庞大的叶子结点中,挑选对于模型整体影响过量或不重要的部分,将其乃至之后可能出现的分类整体从模型中删除。删除节点的好处在于:提高了对于同类问题的泛化能力,同时由于剪去了部分中间的树叶节点,提高了训练速度。在树模型中,常见的剪枝方式为预剪枝和后剪枝。

预剪枝就是在生成决策树的同时进行剪枝。正常决策树的生成是只要有信息增益就要进行分支。预剪枝就是设定一个阈值,只有在信息增益大于这个阈值的时候(也即是在分类后的信息混乱程度减小程度大于一定标准的时候)才进行分类。如果在信息增益过小的情况下,即使存在信息增益的现象,也不会对其进行分支。预剪枝的思想比较简单,但在实际应用中,预剪枝的表现并不是很好。所以,目前我们基本都是使用后剪枝方法。

后剪枝就是在决策树构造完成后进行剪枝。剪枝的过程是对拥有相同父节点的一组节点进行检查,如果将其合并,熵增小于某一阈值,那么这一组节点可以合并一个节点。如果将其合并后熵增大于这个阈值,那么说明将其分枝是合理的。后剪枝就是删除一些子树,然后用其叶节点代替。这个叶节点代表的子集不一定都是“纯”的。那么,这个叶子节点所标识的类别通过大多数原则确定。大多数原则就是指这个叶节点所代表的子集中大多数的类别来表示这个叶节点。

CART的剪枝主题剋氛围两部分,即子树序列的生成以及交叉验证。

  1. 子树序列的生成:找到一个中间节点,并将后续的所有子节点与叶子结点退回到这个中间节点,这样当前的中间节点就成为一个新的叶子结点,当前新的模型就是原始树模型的一个新的子树模型。而由所有叶子结点由下至上的生成所有子树模型即原始树模型的子树序列。
  2. 交叉验证:依赖所有子树模型的表面误差增益率(即误差的增加速率),选取多个节点组成的子树与交叉验证集合进行验证,选取误差最小的子树作为最优树的结果输出。

在这里插入图片描述
α表示当前节点剪枝后,对整体模型误差的影响。设α从0增加至正无穷,记做α(i),若α(i)>α(t),则当前节点t可剪枝。
请添加图片描述
请添加图片描述

二、集成算法模型GBDT

梯度提升决策树(Gradient Boosting Decision Tree, GBDT)是一种Boosting算法,Boosting算法的核心思想是:利用前一轮迭代的误差更新训练集的权重,矫正前一轮迭代被错误分类的样本,下一轮迭代会将重心放在上一轮分错的样本上。

GBDT可以看作是由M棵树组成的加法模型,即:
请添加图片描述
虽然GBDT也是一个加法模型,却是通过不断迭代拟合样本真实值与当前分类器的残差来逼近真实值,即
F m ( x ) = F m − 1 ( x ) + α m h m ( x ) F_m(x) =F_{m-1}(x) + \alpha _mh_m(x) Fm(x)=Fm1(x)+αmhm(x)
根据机器学习的思想, h m ( x ) h_m(x) hm(x)优化目标是缩小 F m − 1 ( x ) + a m h m F_{m-1}(x) + a_mh_m Fm1(x)+amhm y i y_i yi之间的差距,即
h m ( x i ) = a r g m i n h ∑ i = 1 n L ( y i , F m − 1 ( x i ) + h ( x i ) ) h_m(x_i)=\underset{h}{argmin}\sum_{i=1}^{n}L(y_i, F_{m-1}(x_i)+h(x_i)) hm(xi)=hargmini=1nL(yi,Fm1(xi)+h(xi))

GBDT算法主要过程如下:

  1. 建立第一个决策树,预测值为 f 0 ( x ) f_0(x) f0(x),初始值为0
  2. 通过选择分裂特征和分裂点,将数据集分为左右两个子节点。计算左右两个节点内数据集 N L N_L NL N R N_R NR的均值,并将其作为预测值 y i y_i yi(我理解的不一定是两个,要是三层的话,可能是四五个,然后分别计算均值作为预测值)
  3. 计算残差: r m , i = y i , − f m − 1 ( x i ) + h ( x i ) , i = 1 , 2 , 3 , . . . , N r_{m,i}=y_i,-f_{m-1}(x_i)+h(x_i), i=1,2,3,...,N rm,i=yi,fm1(xi)+h(xi),i=1,2,3,...,N
  4. 计算损失误差,当误差小于阈值时完成迭代
  5. 从而得到一棵回归树,残差将作为下一步迭代的目标值
  6. 迭代更新预测结果。

在分类树中,一般通过信息熵增益或者信息熵增益率等属性来选择分裂特征和分裂点。在回归树中,一般选择分类增益最大即分类后误差最小的点作为当前的分裂点。

参考资料

  1. 智能搜索和推荐系统 原理、算法与应用 机械工业出版社 刘宇/赵宏宇/刘书斌/孙明珠 著
  2. 分类算法 – 决策树ID3算法
  3. 分类算法 – 决策树C4.5算法
  4. 分类算法 – 决策数CART算法
  5. 决策树的剪枝:REP/PEP/CCP算法
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GBDT(Gradient Boosting Decision Tree)是一种集成学习算法,它通过迭代地训练决策树来提高分类性能。下面是一个简单的示例代码,演示如何使用Python中的sklearn库实现GBDT分类模型。 首先,我们需要导入必要的库: ```python from sklearn.datasets import load_iris from sklearn.ensemble import GradientBoostingClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score ``` 接着,我们使用鸢尾花数据集作为示例数据: ```python data = load_iris() X = data['data'] y = data['target'] ``` 然后,我们将数据划分为训练集和测试集: ```python X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 现在,我们可以定义一个GBDT分类器并拟合训练数据: ```python clf = GradientBoostingClassifier() clf.fit(X_train, y_train) ``` 最后,我们可以使用测试数据评估模型的性能: ```python y_pred = clf.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy) ``` 完整的代码如下: ```python from sklearn.datasets import load_iris from sklearn.ensemble import GradientBoostingClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score data = load_iris() X = data['data'] y = data['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) clf = GradientBoostingClassifier() clf.fit(X_train, y_train) y_pred = clf.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy) ``` 这个示例演示了如何使用sklearn库实现GBDT分类模型。请注意,这只是一个简单的示例,实际应用中可能需要进行更多的数据预处理和参数调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值