3 决策树(Splitting datasets one feature at a time: decision trees)
3.1 构建决策树(Tree construction)
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。
决策树是对数据进行分类,以此达到预测的目的。该决策树方法先根据训练集数据形成决策树,如果该树不能对所有对象给出正确的分类,那么选择一些例外加入到训练集数据中,重复该过程一直到形成正确的决策集。决策树代表着决策集的树形结构。
优点:计算量小,预测结果易于理解,属性值可以缺失,可以处理无关特征。
缺点:容易过拟合。
适用范围:数值和标称值。
利用信息论分割数据集,createBranch()伪代码:
检查数据集样本是否同类
- 如果结果为真,返回标签
- 否则
- 查找数据最佳分割
- 分割数据
- 创建分支节点
- 对于每个分割
调用createBranch()并将结果加入分支节点- 返回分支节点
决策树步骤:
- 收集数据
- 准备:决策树构建算法仅适用于离散值,对于连续值需要对其量化处理
- 分析:任意方法
- 训练:构建树的数据结构
- 测试:计算错误率
- 使用:可用于任意监督学习任务。
- ID3算法
ID3算法是一种贪心算法,用来构造决策树。
以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继续这个过程,直到生成的决策树能完美分类训练样例。
3.1.1 信息增益
设 p ( x i ) p(x_i) p(xi)为选择符号 x i x_i xi的概率,符号 x i x_i xi的信息定义为:
l ( x i ) = log 2 ( x i ) l(x_i)=\log_2(x_i) l(xi)=log2(xi)
信息熵(information entropy)定义为所有符号的信息期望:
H = − ∑ i = 1 n p ( x i ) log 2 p ( x i ) H=-\sum^n_{i=1}p(x_i)\log_2p(x_i) H=−i=1∑np(xi)log2p(xi)
# Listing 3.1 Function to calculate the Shannon entropy of a dataset
import math
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {
}
# create dictionary of all possible classes
for featVec in dataSet:
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[key]) / numEntries
# logarithm base 2
shannonEnt -= prob * math.log