关于《机器学习实战》中创建决策树的核心代码分析
SIAT nyk 2017年10月21日星期六
一、源码内容
def createTree(dataSet,labels):
classList = [example[-1] for example in dataSet]
ifclassList.count(classList[0]) == len(classList):
return classList[0]#stop splitting when all of the classes are equal
iflen(dataSet[0]) == 1: #stop splitting when there are no more features indataSet
return majorityCnt(classList)
bestFeat = chooseBestFeatureToSplit(dataSet)
bestFeatLabel = labels[bestFeat]
myTree = {bestFeatLabel:{}}
del(labels[bestFeat])
featValues = [example[bestFeat] for example in dataSet]
uniqueVals = set(featValues)
forvalue in uniqueVals:
subLabels = labels[:] #copy all of labels, so trees don't mess upexisting labels
myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat, value),subLabels)
return myTree
原始数据集(训练用)如下:
dataSet = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
labels = ['nosurfacing','flippers']
dataSet只有属性的值和类标签的值,不知道属性代表的含义,比较抽象,因此对每一个属性附加标签说明,那么有以下的训练集
(属性标签1)no surfacing |
(属性标签2)flippers |
(类标签) Fish(在决策树描述中用不上) |
1 |
1 |
yes |
1 |
1 |
yes |
1 |
0 |
no |
0 |
1 |
no |
0 |
1 |
no |
这本书最大的优点就是实践性非常强,书本所有的算法不管多高深都给用目前世界上在深度学习(机器学习)领域第一受欢迎的Python语言实现,最大的缺点就是很少讲算法背后的数学理论,比如要弄懂条件熵,就要懂,离散随机变量,随机事件,二维离散随机变量,离散随机变量的分布律,经典概率事件,条件概率的求法。数学的期望定义等等。书本中实际上采用ID3算法构建决策树,ID3算法就是一种通过信息伦里面的信息增益的方法来选择最佳特征然后划分训练集的递归过程(不懂的请参考:http://blog.csdn.net/xwd18280820053/article/details/70739368),需要注意以下公式的内含:
需要知道原始数据集的信息熵,然后每个特征属性所有取值对应的条件熵,原信息熵减去条件熵所得到的差值就是该特征值所对应的信息增益,计算完所有的属性特征的信息增益,选一个最大的,那么该特征属性就是最优的划分属性,然后以它为划分基准,该特征属性有多少种取值,就有多少种子数据集的划分,然后再划分的数据集当中,有些是非常纯的,有些是不纯的。在觉得构建决策树过程中,它是一个递归的过程,对于纯的子训练集,那么就把他归到叶子节点,对于不纯的子训练集,则继续按照上面的求最大信息增益法选择最优特征然后进一步划分。直到纯或者人为干涉停止为止(什么情况下需要人为干涉让其停止呢,简单来说,已经是针对最后一个特征划分了,但是类标签属性依然不纯,比如上面的鱼类这个,按