决策树(Decision Tree):
定义:
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。
ID3 决策树:(基本已被淘汰,但很经典)
1.信息熵与信息增益:
信息熵:
信息增益:
2.实现步骤:
① 使用信息熵度量类别标签对样本整体的不确定性。
② 使用信息熵度量每个特征不同取值的不确定性。
③ 使用信息增益决定决策树分支的划分依据。
3.代码实现:
from numpy import *
def calcShannonEnt(dataSet):
"""
input:数据集
output:数据集的香农熵
descript:计算给定数据集的香农熵
"""
num = len( dataSet ) # 样本集总数
classList = [c[-1] for c in dataSet] # 抽取分类信息
labelCounts = {} # 词典形式存储类别计数
for cs in set(classList): # 对每个类别计数
labelCounts[cs] = classList.count( cs )
shannonEnt = 0.0 # 信息熵
for key in labelCounts:
prob = labelCounts[key] / float(num)
shannonEnt -= prob * math.log2(prob)
return shannonEnt
# 给定数据集
def CreateDataSet():
dataSet = [[1, 1, ' Yes'],
[1, 1, ' Yes'],
[1, 0, 'No'],
[0, 1, 'No'],
[0, 1, 'No']]
labels = ['no surfacing', 'flippers']
return dataSet, labels
myDat, labels = CreateDataSet()
print(calcShannonEnt(myDat))
进阶:
本人这个不善于讲解,请跳转:
点我跳转
C4.5算法:(严格意义上讲不算算法,是一种规则)
C4.5算法是由Ross Quinlan开发的用于产生决策树的算法。该算法是对Ross Quinlan之前开发的ID3算法的一个扩展。C4.5算法产生的决策树可以被用作分类目的,因此该算法也可以用于统计分类。
本质:(实际是对ID3的改进)
用信息增益率来选择属性。ID3选择属性用的是子树的信息增益,这里可以用很多方法来定义信息,ID3使用的是熵(entropy, 熵是一种不纯度度量准则),也就是熵的变化值,而C4.5用的是信息增益率。
Cart树:
Cart树采用一种二分递归分割的技术,分割方法采用基于最小距离的基尼指数估计函数,将当前的样本集分为两个子样本集,使得生成的的每个非叶子节点都有两个分支。因此,CART算法生成的决策树是结构简洁的二叉树。
算法步骤:
1.决策树的生成:基于训练数据集生成决策树,生成的决策树要尽量大。
2.决策树的剪枝:用验证数据集对以生成的树进行剪枝并选择最优子树。这时用损失函数最小作为剪枝标准。
基尼指数计算公式:
CART树剪枝:
决策树算法对训练集很容易过拟合,导致泛化能力很差,为解决此问题,需要对CART树进行剪枝。CART剪枝算法从“完全生长”的决策树的底端剪去一些子树,使决策树变小,从而能够对未知数据有更准确的预测,也就是说CART使用的是后剪枝法。一般分为两步:先生成决策树,产生所有可能的剪枝后的CART树,然后使用交叉验证来检验各种剪枝的效果,最后选择泛化能力好的剪枝策略。
剪枝:
剪枝 (pruning)是决策树学习算法对付过拟合的主要手段。剪枝是指将一颗子树的子节点全部删掉,利用叶子节点替换子树(实质上是后剪枝技术),也可以(假定当前对以root为根的子树进行剪枝)只保留根节点本身而删除所有的叶子
两种方案:先剪枝和后剪枝:
1.预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点;
2.后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。