一. ID3/C4.5
1. ID3算法是决策树一个经典的构造算法,内部使用信息熵和信息增益来进行构建,每次迭代选择信息增益最大的特征属性作为分隔属性;
- ID3只支持离散的特征,不支持连续的特征;
- ID3算法构建的是多叉树;
- 依赖特征属性较多特征,但实际上并不是最优的【产生误导】,因此必须用特征的信息熵进行惩罚/归一化;
- 不会进行剪枝操作!
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就有用了】;为什么要随机呢?
|
best |
决策树在选择分裂特征时,会优先选择更加重要的特征,也就是信息增益更大的特征; |
3. 剪枝过程
如果一个决策树不加任何限制,那么会生长到纯度指标最优或者没有分裂属性为止。 什么时候是纯度指标最优呢?也就是说一个叶子节点中,只含有一种类别的样本。但是这样的树,更容易陷入到过拟合。为了使得模型有更好的泛化能力【降低过拟合】,必须对建好的树进行剪枝。
剪枝策略对决策树的影响巨大,一个正确的剪枝策略是优化决策树的核心。
API的参数中提供的剪枝策略有:
策略参数 |
|
Max_depth |
限制树的深度,超过该深度的子树会全部被剪掉,一般从3开始; |
Min_samples_leaf |
分支会朝着满足min_samples_leaf的分支方向去发展 在回归模型中,调整改参数,可以使得模型变得更加光滑,但是如果设置的太小怎会出现过拟合的现象,设置的太大会出现欠拟合,因此使用交叉验证来确定,从5开始, |
Min_samples_split |
一个节点中必须包含min_samples_split个训练样本,这个节点才允许被分裂 |
Max_features |
限制分支时,考虑的特征数,超过特征数就会被舍弃掉。 |
预剪枝依据:
- 作为叶结点或作为根结点需要含的最少样本个数
- 决策树的层数
- 结点的经验熵小于某个阈值才停止
后剪枝算法
后剪枝算法有很多种,这里简要总结如下:
剪枝策略 |
|
REP(错误率降低剪枝) |
|
PEP(悲观剪枝)【这也是C4.5使用的剪枝策略】 |
把具有最多叶子节点的子树用一个叶子节点代替 |
后剪枝策略通常要比预剪枝策略保留更多地分支。一般情况下,后剪枝策略的模型欠拟合概率很低,泛化性能也要优于预剪枝决策树。但是后剪枝策略要在决策树完全生成之后才能进行,并且要从下而上地对决策树中的所有非叶子节点进行计算,因此训练时间要比预剪枝决策树和完全 决策树的开销大很多【在工程实现中,不可取】
在sklearn中,决策树的剪枝都是基于预剪枝【设置哪些剪枝参数】,没有后剪枝算法,但是一些大佬已经在讨论在sklearn中加入后剪枝算法 [https://github.com/scikit-learn/scikit-learn/issues/6557]
. 目标权重参数
参数 |
|
class_weight |
防止样本不平衡造成过拟合,给少量的标签给予更多的权重 |
Min_weight_fraction_leaf |
假如给定了样本权重之后,叶子节点的样本数据量不再是简单地计数,而要收到权重的影响。 如果设置了样本权重,那么基于权重的预修剪标准更加容易优化树的结构; |
因此,在建模之前,进行数据的类别 分布权重进行分析非常 重要。
来源:CSDN
作者:广小辉
链接:https://blog.csdn.net/Galbraith_/article/details/104108714