目录
什么是决策树
分类决策树模型是一种描述对实例进行分类的树形结构,它由节点和有向边组成
决策树的节点
分为内部节点和叶节点
内部节点——代表一个特征或属性
叶节点——代表一个类
如下图 ,黑色的为内部节点,红色的为叶节点:
决策树的特点
1.对属性进行“测试”即对就决策过程中的问题进行判定
2.决策树上的每条路径都是一个判定测试序列
决策树的最终学习目的是为了产生一颗泛化能力强即能够有效处理未知样本的决策树
决策树的基本算法
注意:当某一判定测试序列的结果为空(无对应样本),将当前节点标记为叶子节点并进行回溯——回到父节点,以父节点的测试结果为准
决策树的划分选择
优秀的决策树应该具备优秀的划分属性、高纯度的节点
如何选择最优划分属性
方法一:信息增益
信息熵——度量样本集合纯度的指标之一,信息熵(Ent(D))的值越小,则样本集合(D)的纯度越高,Ent(D)最小为0,最大值为log2|y|
Ent(D)计算公式:
PS:Pk为第k类样本在样本集合D中所占的比例
当p=0或p=1时,样本集合纯度百分百。
原因:
信息熵的python代码实现:
该函数可计算数据集的香农熵,将数据集的最后一列设为键值,并为所有可能的分类创建字典,其中若发现新分类(新键值),则扩展字典并加入新键值。
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {}#字典
for featVec in dataSet: #the the number of unique elements and their occurance
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#统计某一键值出现频率
shannonEnt -= prob * log(prob,2) #log base 2
return shannonEnt
信息增益基于信息熵(Ent(D))
用信息增益划分最优属性的python代码:
以下代码为信息增益公式的代码形式,是实现信息增益划分属性的核心:
baseEntropy = calcShannonEnt(dataSet)#得到总熵值
#得到每种决策属性的比例
prob = len(subDataSet)/float(len(dataSet))
#得到各个特征值对应的熵
newEntropy += prob * calcShannonEnt(subDataSet)
从下列代码我学习到了:
1.python的列表推导式:[表达式 for 变量 in 列表];形如:[example[i] for example in dataSet]
以行的形式遍历数据集,并取出第i列;
2.利用set集合的性质取出列表中的重复元素,得到某一属性的分类标签列表。
def chooseBestFeatureToSplit(dataSet):
numFeatures = len(dataSet[0]) - 1 #the last column is used for the labels
baseEntropy = calcShannonEnt(dataSet)#得到总熵值
bestInfoGain = 0.0; bestFeature = -1
for i in range(numFeatures): #iterate over all the features
featList = [example[i] for example in dataSet]#create a list of all the examples of this feature
#利用set内值不重复的性质得到某一属性的分类标签列表
uniqueVals = set(featList) #get a set of unique values
newEntropy = 0.0
#遍历特征值得到相应的数据集
for value in uniqueVals:
subDataSet = splitDataSet(dataSet, i, value)
#得到每种决策属性的比例
prob = len(subDataSet)/float(len(dataSet))
#得到各个特征值对应的熵
newEntropy += prob * calcShannonEnt(subDataSet)
#计算信息增益
infoGain = baseEntropy - newEntropy #calculate the info gain; ie reduction in entropy
if (infoGain > bestInfoGain): #compare this to the best gain so far
bestInfoGain = infoGain #if better than current best, set to best
bestFeature = i
#返回最优划分属性的索引值
return bestFeature #returns an integer
ID3决策树学习算法就是以信息增益为准则来划分属性的算法
特点:一般而言,信息增益越大,则意味着该属性越适合作为划分属性;信息增益对可取值数目较多的属性有所偏好。
方法二:增益率
IV(a):属性a的固有值,属性a的可能取值数目越大,IV(a)的值通常越大
增益率基于IV(a)
公式如下: