适用场景:决策树能够生成清晰的基于特征(feature)选择不同预测结果的树状结构,希望更好的理解手上的数据的时候往往可以使用决策树,在实际应用中,受限于它的简单性,决策树更大的用处是作为一些更有用的算法的基石,例如随机森林。
特征选择
生成决策树
剪枝
(1) 计算复杂度不高,输出结果易于理解
以ID3为例,每次运算都是基于某一列特征,特征计算完后,下次计算不考虑该最优特征,并且通过适当剪支可以简化复杂度
(2) 对中间值的缺失不敏感
(3) 可以处理不相关特征数据
是基于每一列特征来计算,不考虑特征之间的依赖关系
(1) ID3
以信息增益作为树的分裂准则,该算法存在的不足:
(a) ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用,如果一定要运用ID3出来连续属性,那么要自己将连续特征离散化(办法非常多)
(b) 对于缺失值的情况没有做考虑
(c) 偏向于多值属性。例,如果存在唯一标识属性ID(每个样本的ID属性值都不相同),则ID3会选择它作为优先分裂属性,这样虽然使得划分充分纯净,但这种划分对分类几乎毫无用处
(2) C4.5
(a)以基于信息增益的增益率(gain ratio)作为树的分裂准则,解决了ID3的偏向于多值属性问题
(b)内部自己考虑了连续属性离散化过程,所以克服了ID3的没有考虑连续特征问题
(c)内部考虑了缺失值的自动处理策略
(3) CART
ID3和C4.5只能处理分类问题,而CART可以处理分类和回归问题,CART考虑问题非常全面,有较多优点,可以自行深入研究
信息熵用于度量信息的混乱程度,信息越混乱说明能够包含的信息量越多,则熵越大,例如一个声波,我们可以通过傅里叶变换分析其频谱看到其中的大量的信息;信息越有序说明包含的信息量越少,则熵越小,例如一条直线,这个信息太少了,则它的熵也非常小。
在数学上,对于任意一个向量,对其计算信息熵,可以证明出:当向量中每个值都相同的时候,熵最小。这样数学和通俗理解就对应上了。
信息增益用于度量一个随机变量中包含的关于另一个随机变量的信息量,或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性,也可以简单认为一个随机变量的引入导致了另一个随机变量的混乱性变化(约束)。信息增益是特征选择的重要指标,它定义为一个特征能够为分类系统带来多少信息,带来的信息越多,说明更容易分类,也说明该特征越重要,相应的信息增益也就越大
(2-1)
非对称性: (2-2)
正在上传…重新上传取消是标签对应的列向量,是其中的某一列特征,是信息增益,从公式来理解更容易:信息增益越大,特征对最终的分类结果影响也就越大?为何要越大越好:类标签列信息熵是固定值,要大,说明条件熵要小,条件熵意思是在已知的情况下,对于类标签列带来了多少约束,假设在确定的情况下,类标签列只有一个取值(此时的信息熵最小),信息类似于直线向量,说明这个约束非常大,达到最小,同时也可以明显看出,这个特征对分类很有用,只要使用了该特征,就可以将类别全部分开,此次我们说,这个特征对分类贡献最大,那么其信息增益也是最大的。
重要参数分析:
(1) criterion:特征选择标准,可选参数,默认是gini(CART),可以设置为entropy(ID3)
(2) 特征划分点选择标准splitter:主要考虑计算量
(3) 划分时考虑的最大特征数、决策树最大深、内部节点再划分所需最小样本数、叶子节点最少样本数、叶子节点最小的样本权重和、最大叶子节点数、节点划分最小不纯度:这些策略都是为了防止过拟合
(4) 类别权重:主要是克服样本不平衡问题
递归算法中,有两个固定步骤:递归头和递归体,缺一不可。
(1) 递归头:什么时候不调用自己的方法,即递归的结束条件
(2) 递归体:什么时候需要调用自己的方法,即自己调用自己
递归算法的优点:将问题逐渐简单化;缺点:会占用大量的系统堆栈,内存耗用多,早递归调用层数多时,比循环慢很多。
假设第2列是最优特征,使用该特征作为根节点,进行递归,则原来的dataSet,会变成两个子dataSet,然后对这两个子dataSet分别进行递归创建树,直到满足结束条件
数据:
dataSet = [[0, 0, 0, 0, 'no'],
[0, 0, 0, 1, 'no'],
[0, 1, 0, 1, 'yes'],
[0, 1, 1, 0, 'yes'],
[0, 0, 0, 0, 'no'],
[1, 0, 0, 0, 'no'],
[1, 0, 0, 1, 'no'],
[1, 1, 1, 1, 'yes'],
[1, 0, 1, 2, 'yes'],
[1, 0, 1, 2, 'yes'],
[2, 0, 1, 2, 'yes'],
[2, 0, 1, 1, 'yes'],
[2, 1, 0, 1, 'yes'],
[2, 1, 0, 2, 'yes'],
[2, 0, 0, 0, 'no']]
labels = ['年龄', '有工作', '有自己的房子', '信贷情况']
的计算:
只看最后一列,其中总共15个样本,yes类别有9个,no类别有6个,所以信息熵为:
信息增益的计算:
(2-4)
中,一共5个样本类别,yes有2个,no有3个: