目录
一、决策树原理
决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。
决策树学习的关键在于如何选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支结点 所包含的样本尽可能属于同一类别,即结点的“纯度 ”(purity)越来越高。经典的属性划分方法有三种:信息增益;增益率;基尼指数。
二、实验过程
2.1信息增益
离散属性a有V个可能的取值{a1, a2, ..., aV},用a来进行划分,则会产 生V个分支结点,其中第v个分支结点包含了D中所有在属性a上取值为 av的样本,记为Dv。则可计算出用属性a对样本集D进行划分所获得的 “信息增益”:
一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的 “纯度提升”越大。
实现代码:
def chooseBestFeatureToSplit(dataSet):
#特征数量,-1是因为最后一列是类别标签
numFeatures = len(dataSet[0]) - 1
#计算数据集的原始香农熵
baseEntropy = calcShannonEnt1(dataSet)
bestInfoGain = 0.0 #信息增益赋初值0
bestFeature = -1 #最优特征的索引值
for i in range(numFeatures):
#获取dataSet的第i个所有特征存到featList中
featList = [example[i] for example in dataSet]
#print(featList) #每个特征的15项特征值列表
#创建set集合{},元素不可重复
uniqueVals = set(featList)
newEntropy = 0.0
for value in uniqueVals:
#subDataSet划分后的子集
subDataSet = splitDataSet(dataSet,i,value)
#计算子集的概率=子集个数/整个训练样本数
prob = len(subDataSet)/float(len(dataSet))
#计算香农熵
newEntropy += prob * calcShannonEnt(subDataSet)
#计算信息增益
infoGain = baseEntropy - newEntropy
#print("第%d个特征的增益为%.3f" %(i,infoGain))
#C4.5算法:计算增益比(信息增益率)
#infoGain2 = (baseEntropy - newEntropy)/baseEntropy
if (infoGain >bestInfoGain):
bestInfoGain = infoGain #更新信息增益,找到最大的信息增益
bestFeature = i #记录信息增益最大的特征的索引值
return bestFeature #返回信息增益最大的特征的索引值
2.2增益率
称为属性a的“固有值” [Quinlan, 1993],属性a的可能取值数 目越多(即V越大),则IV(a)的值通常就越大。
增益率准则对可取值数目较少的属性有所偏好。
C4.5 [Quinlan, 1993]采用了一个启发式方法:先从候选划分属性中找出信 息增益高于平均水平的属性,再从中选取增益率最高的
实现代码:
def calcShannonEnt1(dataSet, method = 'none'):
numEntries = len(dataSet)
labelCount = {}
for feature in dataSet:
if method =='prob': #当参数为prob时转而计算增益率
label = feature
else:
label = feature[-1]
if label not in labelCount.keys():
labelCount[label]=1
else:
labelCount[label]+=1
shannonEnt = 0.0
for key in labelCount:
numLabels = labelCount[key]
prob = numLabels/numEntries
shannonEnt -= prob*(log(prob,2))
return shannonEnt
#增益率
def chooseBestFeatureToSplit2(dataSet): #使用增益率进行划分数据集
numFeatures = len(dataSet[0]) -1 #最后一个位置的特征不算
baseEntropy = calcShannon