Decision Tree——ID3、C4.5、CART

ID3

决策树关键问题:如何选择特征进行分支
ID3算法思想:选择信息增益最大的属性作为当前的特征对数据集进行分类。

信息熵(Information Entropy):信息的不确定性程度,变量的不确定性越大,熵的值越大;随机变量不确定性的度量叫熵。一个变量X,它可能的取值有n多种,分别是x1,x2,……,xn,每一种取到的概率分别是P1,P2,……,Pn,那么X的熵就定义为
Entropy(X)=H(X)=mi=1pilog(pi) E n t r o p y ( X ) = H ( X ) = − ∑ i = 1 m p i l o g ( p i )
知乎:信息熵是什么?

信息增益(Information Gain): 在一个条件下,信息不确定性减少的程度;信息增益=信息熵 - 条件熵

Gain(D,A)=g(D,A)=H(D)H(D|A) G a i n ( D , A ) = g ( D , A ) = H ( D ) − H ( D | A )
其中a是有V个不同取值的离散特征,使用特征a对样本集D进行划分会产生V个分支.

条件熵:已知随机变量X的条件下随机变量Y的不确定性
H(Y|X)=xXp(x)H(Y|X=x) H ( Y | X ) = ∑ x ∈ X p ( x ) H ( Y | X = x )
通俗理解决策树算法中的信息增益

https://blog.csdn.net/u011327333/article/details/51167952

ID3算法构建决策树存在的问题:

  1. 不能处理连续特征
  2. 用信息增益作为标准容易偏向于取值较多的特征
  3. 缺失值处理的问
  4. 过拟合问题

C4.5

信息增益比(Information Gain Ratio): 信息增益 g(D,A) g ( D , A ) 与训练集D关于特征A的值的熵 HA(D) H A ( D ) 之比:
gR(D,A)=g(D,A)HA(D) g R ( D , A ) = g ( D , A ) H A ( D )

C4.5生成算法与ID3的不同之处:使用信息增益比来选择特征

C4.5算法构建决策树存在的问题:

  1. 由于决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝.->预剪枝后剪枝
  2. C4.5生成的是多叉树,即一个父节点可以有多个节点
  3. C4.5只能用于分类
  4. C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算

https://mp.weixin.qq.com/s/EZY3l73aSAA88o-8zJp3ww

决策树剪枝

决策树学习的损失函数:
Cα(T)=|T|t=1NtHt(T)+α|T| C α ( T ) = ∑ t = 1 | T | N t H t ( T ) + α | T |
使损失函数最小,可动态规划实现。

预剪枝:决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶节点。有欠拟合风险
后剪枝:先从训练集生成一颗完整的决策树,然后自底向上地对非叶节点进行考察,若将该节点对应的子树替换为叶节点能提升决策树的泛化性能,则将该子树减去。训练时间开销大

CART

基尼指数
Gini(D)=1|y|k=1p2k G i n i ( D ) = 1 − ∑ k = 1 | y | p k 2
属性a的基尼指数定义为:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
决策树是一种常见的机器学习算法,其中ID3C4.5和CART是三种常见的决策树分类算法。下面是它们的Python代码介绍: 1. ID3算法代码: ``` def ID3(data, labels): # 计算数据集的信息熵 entropy = calcEntropy(data) # 如果数据集的信息熵为0,则直接返回该数据集的类别 if entropy == 0: return data[0][-1] # 如果特征集为空,则返回数据集中出现次数最多的类别 if len(labels) == 0: return majorityClass(data) # 选择最优划分特征 bestFeature = chooseBestFeature(data, labels) # 根据最优特征生成决策树 decisionTree = {bestFeature: {}} # 从特征集中删除已经使用的特征 labels.remove(bestFeature) # 获取最优特征的所有取值 featureValues = set([example[bestFeature] for example in data]) # 遍历最优特征的所有取值,生成子树 for value in featureValues: subLabels = labels[:] decisionTree[bestFeature][value] = ID3(splitData(data, bestFeature, value), subLabels) return decisionTree ``` 2. C4.5算法代码: ``` def C45(data, labels): # 计算数据集的信息熵 entropy = calcEntropy(data) # 如果数据集的信息熵为0,则直接返回该数据集的类别 if entropy == 0: return data[0][-1] # 如果特征集为空,则返回数据集中出现次数最多的类别 if len(labels) == 0: return majorityClass(data) # 选择最优划分特征 bestFeature = chooseBestFeature(data, labels) # 根据最优特征生成决策树 decisionTree = {bestFeature: {}} # 从特征集中删除已经使用的特征 labels.remove(bestFeature) # 获取最优特征的所有取值 featureValues = set([example[bestFeature] for example in data]) # 遍历最优特征的所有取值,生成子树 for value in featureValues: subLabels = labels[:] # 计算每个取值的信息增益率 subData = splitData(data, bestFeature, value) ratio = calcRatio(subData, entropy) # 如果信息增益率高于平均水平,则生成子树 if ratio >= averageRatio(data, bestFeature): decisionTree[bestFeature][value] = C45(subData, subLabels) # 否则返回数据集中出现次数最多的类别 else: decisionTree[bestFeature][value] = majorityClass(subData) return decisionTree ``` 3. CART算法代码: ``` def CART(data, labels): # 如果数据集中只有一个类别,则直接返回该类别 if len(set([example[-1] for example in data])) == 1: return data[0][-1] # 如果特征集为空,则返回数据集中出现次数最多的类别 if len(labels) == 0: return majorityClass(data) # 选择最优划分特征 bestFeature, bestValue, bestScore = chooseBestSplit(data) # 根据最优特征生成决策树 decisionTree = {bestFeature: {}} # 从特征集中删除已经使用的特征 labels.remove(bestFeature) # 生成左子树和右子树 leftData = [example for example in data if example[bestFeature] <= bestValue] rightData = [example for example in data if example[bestFeature] > bestValue] decisionTree[bestFeature]['left'] = CART(leftData, labels) decisionTree[bestFeature]['right'] = CART(rightData, labels) return decisionTree ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值