决策树算法梳理

本文介绍了决策树算法的基础,包括信息熵、联合熵、条件熵和信息增益等概念。接着详细讲解了ID3、C4.5和CART决策树算法的原理和应用场景,并探讨了回归树的构建方法。此外,文章还讨论了决策树过拟合的原因和防止措施,如剪枝策略。最后,提到了模型评估指标如平均均方误差和拟合优度,并简述了sklearn决策树参数设置与Python绘制决策树的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.信息论基础
信息熵:信息熵是度量样本的集合纯度最常用的一种指标。在信息论和概率统计中,熵是表示随机变量不确定性的度量。
联合熵:两个随机变量X,Y的联合分布,可以形成联合熵Joint Entropy,用H(X,Y)表示。
条件熵:设有随机变量(X, Y),其联合概率分布为在这里插入图片描述
条件熵H(Y|X) 表示在已知随机变量X的条件下随机变量Y的不确定性。随机变量X给定条件下随机变量Y的条件熵H(Y|X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望在这里插入图片描述
信息增益:考虑到不同的分支所包含的样本数不同,给分支节点赋予权重|Dv|/|D||Dv|/|D|,即样本数越多的分支节点影响越大,于是计算出用属性αα对样本集DD进行划分所获得的信息增益。
基尼不纯度:从一个数据集中随机选取子项,度量其被错误的划分到其他组里的概率。
2.决策树的不同分类算法(ID3算法、C4.5、CART分类树)的原理及应用场景
原理:信息增益。在每个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继续这个过程,直到生成的决策树能完美分类训练样例。
应用场景:计算时间是例子个数、特征属性个数、节点个数之积的线性函数
C4.5(ID3的扩展):信息增益率、连续属性处理、决策树剪枝,解决了ID3因分支数量不同造成的不公平
CART:采用基尼系数划分数据
定义:基尼指数(基尼不纯度):表示在样本集合中一个随机选中的样本被分错的概率。
注意: Gini指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之,集合越不纯。
即 基尼指数(基尼不纯度)= 样本被选中的概率 * 样本被分错的概率
3.回归树原理
回归树的每个节点(不一定是叶子节点)都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化均方差即(每个人的年龄-预测年龄)^2 的总和 / N。也就是被预测出错的人数越多,错的越离谱,均方差就越大,通过最小化均方差能够找到最可靠的分枝依据。分枝直到每个叶子节点上人的年龄都唯一或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。
4.决策树防止过拟合手段
产生过拟合数据的原因:
原因1:样本问题
(1)样本里的噪音数据干扰过大,大到模型过分记住了噪音特征,反而忽略了真实的输入输出间的关系;(什么是噪音数据?)

(2)样本抽取错误,包括(但不限于)样本数量太少,抽样方法错误,抽样时没有足够正确考虑业务场景或业务特点,等等导致抽出的样本数据不能有效足够代表业务逻辑或业务场景;

(3)建模时使用了样本中太多无关的输入变量。
原因2:构建决策树的方法问题

在决策树模型搭建中,我们使用的算法对于决策树的生长没有合理的限制和修剪的话,决策树的自由生长有可能每片叶子里只包含单纯的事件数据或非事件数据,可以想象,这种决策树当然可以完美匹配(拟合)训练数据,但是一旦应用到新的业务真实数据时,效果是一塌糊涂。

上面的原因都是现象,但是其本质只有一个,那就是“业务逻辑理解错误造成的”,无论是抽样,还是噪音,还是决策树等等,如果我们对于业务背景和业务知识非常了解,非常透彻的话,一定是可以避免绝大多数过拟合现象产生的。因为在模型从确定需求,到思路讨论,到搭建,到业务应用验证,各个环节都是可以用业务敏感来防止过拟合于未然的。
针对原因1的解决方法:

合理、有效地抽样,用相对能够反映业务逻辑的训练集去产生决策树;

针对原因2的解决方法(主要):

剪枝:提前停止树的增长或者对已经生成的树按照一定的规则进行后剪枝。
5.模型评估
平均均方误差mse
MSE=1n∑(y¯−yi)2=Var(Y)MSE = \frac{1}{n}\sum(\bar{y}-y_i)^2 = Var(Y)
拟合优度Goodness of fit
拟合优度(Goodness of Fit)是指回归直线对观测值的拟合程度。度量拟合优度的统计量是可决系数(亦称确定系数)R^2.
最大值为1。R^2
的值越接近1,说明回归直线对观测值的拟合程度越好;反之,R^2的值越小,说明回归直线对观测值的拟合程度越差。
6.sklearn参数详解,Python绘制决策树
参数详解:

criterion=’gini’, string, optional (default=”gini”),衡量分支好坏的标准

splitter=’best’, string, optional (default=”best”),选择分支的策略

max_depth=None, int or None, optional (default=None),树的最大深度

min_samples_split=2, int, float, optional (default=2),分支时最小样本数

min_samples_leaf=1, int, float, optional (default=1),叶子最少样本

min_weight_fraction_leaf=0.0, float, optional (default=0.),叶子结点的最小权重

max_features=None, int, float, string or None, optional (default=None),生成树时考虑的最多特征点数

random_state=None, int, RandomState instance or None, optional (default=None),打乱样本时所用的随机种子

max_leaf_nodes=None, int or None, optional (default=None),生成树时采用的最大叶子结点

min_impurity_decrease=0.0, float, optional (default=0.),当产生分支时,增加的纯度

min_impurity_split=None, float, (default=1e-7),树停止生长的阈值

class_weight=None, dict, list of dicts, “balanced” or None, default=None,分支权重预设定
  presort=False,bool, optional (default=False),提前对数据排序,加快树的生成
python 绘制决策树:
import sklearn.tree as tree
clf=tree.DecisionTreeRegressor(min_samples_split=50,max_leaf_nodes=15)

clf_fit=clf.fit(x,y)

tree.export_graphviz(clf_fit,out_file=“tree.dot” )

import pydotplus
from IPython.display import Image

dot_data = tree.export_graphviz(clf_fit, out_file=None,
feature_names=feature_names,
class_names=target_names,
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值