1.决策树解析
决策树是一种描写对实例进行分类的树型结构。决策树由结点和有向边组成。结点有两种类型:内部结点和叶节点。内部结点表示一个特征或属性,叶节点表示一个类。决策树分类算法是一种基于实例的归纳学习方法,它能从给定的无序的训练样本中,提炼出树型的分类模型。树中的每个非叶子节点记录了使用哪个特征来进行类别的判断,每个叶子节点则代表了最后判断的类别。
决策树的优点有:计算复杂度不高,输出结果容易理解,对中间值的缺失不敏感,可以处理不相关的特征数据。 其缺点就是容易产生过度匹配的问题,也就是过拟合问题。
2.决策树的简单构建
2.1信息增益构建决策树
我们先按照书上的代码示例来构建一个简单的决策树,在此之前先了解一下信息增益的基本信息。 划分数据集的大原则是:将无序的数据变得更有序。在划分数据集之前之后信息发生的变化称为信息增益,我们可以计算每一个特征值划分数据集获得信息增益,获得信息增益最高的特征就是最好的选择。 信息熵的计算公式为
信息增益的计算方法为:
下面是计算给定数据集的香农熵的方法
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {}
for featVec in dataSet:
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0
for key in labelCounts:
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob*log(prob,2)
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(myDat)
print(calcShannonEnt(myDat))
结果展示:
熵越高则混合的数据也越多,我们可以通过在数据集中添加更多的分类,观察熵是怎么变化的
myDat[0][-1]='maybe'
print(myDat)
print(calcShannonEnt(myDat))
分类算法除了需要测量信息熵,还需要划分数据集,度量划分数据集的熵,以便判断当前是否正确的划分了数据集。我们将对每个特征划分数据集的结果计算一次信息熵,判断哪一个特征是划分数据集是最后的划分方式。
划分数据集的代码如下,三个参数分别为待划分的数据集,划分数据集的特征,特征的返回值
def splitDataSet(dataSet,axis,value):