决策树之所以如此流行,一个很重要的原因是一个很重要的原因就是不需要了解机器学习的知识就能搞明白决策树是如何工作的。
决策树的优点:计算复杂度不高,输出结构易于理解,对中间值的缺失不敏感。缺点:可能产生过度匹配问题。
创建决策树分支createBranch()的伪代码:
if 数据集中所有数据都是同一类:
return 类标签
else:
寻找划分数据集最好的特征
根据最好的特征划分数据集
创建分支节点
for 每个划分的子集
调用createBranch(),并且返回结果到分支节点
return 分支节点
决策树的一般流程:
(1)收集数据:任何方法
(2)准备数据:构造树算法只适合于标量数据,因此必须离散化数值型数据
(3)分析数据:
(4)训练数据:构造决策树
(5)测试数据:使用经验树计算错误率
(6)使用算法:使用决策树进行分类数据
决策树的ID3算法每次划分数据只选取一个特征值,选取特征值的原则是按照获取的最大信息增益(熵的减少)的方法划分数据。
决策树创建的代码:
def createTree(dataSet,labels):
classList = [example[-1] for example in dataSet]
if classList.count(classList[0]) == len(classList): #只剩一个类时返回标签
return classList[0]
if len(dataSet[0]) == 1: #特征值使用完时,返回剩下最多的标签
return majorityCnt(classList)
bestFeat = chooseBestFeatureToSplit(dataSet) #选择信息增益最大的特征值
bestFeatLabel = labels[bestFeat]
myTree = {bestFeatLabel:{}} #创建树结构
del(labels[bestFeat])
featValues = [example[bestFeat] for example in dataSet]
uniqueVals = set(featValues) #确定此特征值的的所有取值
for value in uniqueVals: #根据不同取值创建分支
subLabels = labels[:]
myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
return myTree
由这个字典树结构可知,字典的从左的第一个关键字是第一个划分数据集的特征名称,该键的值是一个字典,该字典的第一个关键字是划分的数据集。该数据集的值如果为类标签则为叶子节点,如果为字典则为判断节点。