机器学习 --ID3/C4.5 以及决策树参数

孤者浪人 提交于 2020-01-31 11:11:29

一. ID3/C4.5

1. ID3算法是决策树一个经典的构造算法,内部使用信息熵和信息增益来进行构建,每次迭代选择信息增益最大的特征属性作为分隔属性;

  1. ID3只支持离散的特征,不支持连续的特征;
  2. ID3算法构建的是多叉树;
  3. 依赖特征属性较多特征,但实际上并不是最优的【产生误导】,因此必须用特征的信息熵进行惩罚/归一化;
  4. 不会进行剪枝操作!

 

2. C4.5,使用信息增益率代替信息增益度:

 

使用信息增益率代替信息增益度。实际上就是对特征属性比较多的特征进行惩罚。

2. 决策树参数详解

2.1 criterion

假设T为给定某一个节点,i代表标签的某一个分类。那么p(i|T)代表标签分类i在节点T上所占的比例。需要特别注意,当选择信息熵entropy时,sklean实际上计算的是基于信息熵的的信息增益,即父节点的信息熵与子节点的信息熵【条件信息熵】之差。

    1 	import numpy as np
    2 	from collections import Counter
    3 	from matplotlib import pyplot as plt
    4 	
    5 	n_unique_list = range(2, 10)
    6 	n_all = 100
    7 	entropy_list = []
    8 	gini_list = []
    9 	
   10 	for n_unique in n_unique_list:
   11 	    test_list = np.random.randint(1, n_unique+1, n_all)
   12 	    stat_dict = Counter(test_list)
   13 	    prob_dict = {k: v/n_all for k, v in stat_dict.items()}
   14 	    prob_list = prob_dict.values()
   15 	
   16 	    entropy = 0
   17 	    gini_ = 0
   18 	    for prob in prob_list:
   19 	        entropy += -1*prob * np.log2(prob)
   20 	        gini_ += np.square(prob)
   21 	
   22 	    entropy_list.append(entropy)
   23 	    gini_list.append(1-gini_)
   24 	
   25 	plt.plot(n_unique_list, entropy_list, 'ro-', label='Entropy')
   26 	plt.plot(n_unique_list, gini_list, 'bo-', label='Gini')
   27 	
   28 	plt.legend()
   29 	plt.grid(True)
   30 	plt.show()

比起基尼系数,信息熵对纯度更加敏感一些【信息熵更大一些】,对不纯度的惩罚更强。但是,在实际应用中,信息熵和基尼系数的效果基本是相同的。 信息熵的计算比基尼系数更慢一点,主要原因是信息熵在计算过程中需要计算对数。

另外,由于信息熵对不纯度更加敏感,所以当信息熵作为不纯度的衡量指标时,决策树的生长会更加的精细,然而对于高维数据或者噪音很多的数据而言,使用信息熵比较容易陷入过拟合,基尼系数在这种情况下更好一些。

参数

criterion

如何影响模型?

确定不纯度的计算方法,帮忙找出最佳节点和最佳分枝,不纯度越低,决策树对训练集的拟合越好

可能的输入有哪些?

不填默认基尼系数,填写gini使用基尼系数,填写entropy使用信息增益

怎样选取参数?

通常就使用基尼系数、数据维度很大,噪音很大时使用基尼系数 维度低,数据比较清晰的时候,信息熵和基尼系数没区别 当决策树的拟合程度不够的时候,使用信息熵 两个都试试,不好就换另外一个

不纯度是基于某一个节点来计算的,也就是在构建决策树时,是靠最优节点的选择来寻找一颗最优的树,但是最优的点击一定能够保证最优的树吗?

实际上这也问了一个问题:贪心算法得到的就一定是全局最优吗?---随机森林算法

2.2. Splitter  / random_state

有两个选项:

 

random

在选择分裂特征时,随机选择特征【这个时候,random_state就有用了】;为什么要随机呢?
1. 在叶子节点达到相同的纯度的情况下,随机选择分割特征所构造的树显然更深更大;

  1. 随机性的作用类似于 随机森林,可以降低模型的过拟合。

best

决策树在选择分裂特征时,会优先选择更加重要的特征,也就是信息增益更大的特征;
可以得到亮点:
特征属性的重要性feature_importance_实际上与信息增益度成正比例。信息增益度越大/重要性越大的特征, 越靠近根节点。

3. 剪枝过程

       如果一个决策树不加任何限制,那么会生长到纯度指标最优或者没有分裂属性为止。 什么时候是纯度指标最优呢?也就是说一个叶子节点中,只含有一种类别的样本。但是这样的树,更容易陷入到过拟合。为了使得模型有更好的泛化能力【降低过拟合】,必须对建好的树进行剪枝。

        剪枝策略对决策树的影响巨大,一个正确的剪枝策略是优化决策树的核心。

        API的参数中提供的剪枝策略有:

策略参数

 

Max_depth

限制树的深度,超过该深度的子树会全部被剪掉,一般从3开始;

Min_samples_leaf

分支会朝着满足min_samples_leaf的分支方向去发展
 

在回归模型中,调整改参数,可以使得模型变得更加光滑,但是如果设置的太小怎会出现过拟合的现象,设置的太大会出现欠拟合,因此使用交叉验证来确定,从5开始,

Min_samples_split

一个节点中必须包含min_samples_split个训练样本,这个节点才允许被分裂

Max_features

限制分支时,考虑的特征数,超过特征数就会被舍弃掉。
max_features 是限制高维度训练数据【特征数据比较多】的过拟合剪枝参数。在不知道特征重要性的情况下,使用该参数会导致模型学习不足

预剪枝依据:

  • 作为叶结点或作为根结点需要含的最少样本个数
  • 决策树的层数
  • 结点的经验熵小于某个阈值才停止

后剪枝算法

后剪枝算法有很多种,这里简要总结如下:

剪枝策略

 

REP(错误率降低剪枝)

 

PEP(悲观剪枝)【这也是C4.5使用的剪枝策略】

把具有最多叶子节点的子树用一个叶子节点代替

后剪枝策略通常要比预剪枝策略保留更多地分支。一般情况下,后剪枝策略的模型欠拟合概率很低,泛化性能也要优于预剪枝决策树。但是后剪枝策略要在决策树完全生成之后才能进行,并且要从下而上地对决策树中的所有非叶子节点进行计算,因此训练时间要比预剪枝决策树和完全 决策树的开销大很多【在工程实现中,不可取】

在sklearn中,决策树的剪枝都是基于预剪枝【设置哪些剪枝参数】,没有后剪枝算法,但是一些大佬已经在讨论在sklearn中加入后剪枝算法 [https://github.com/scikit-learn/scikit-learn/issues/6557]

. 目标权重参数

参数

 

class_weight

防止样本不平衡造成过拟合,给少量的标签给予更多的权重

Min_weight_fraction_leaf

假如给定了样本权重之后,叶子节点的样本数据量不再是简单地计数,而要收到权重的影响。
在没有设置样本权重的情况下,剪枝则会更多地偏向于多数类别的样本。

如果设置了样本权重,那么基于权重的预修剪标准更加容易优化树的结构;
 

因此,在建模之前,进行数据的类别 分布权重进行分析非常 重要。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!