决策树构造
目录
建立一个树状模型,每个节点筛选出不同结果
优点:直观,好理解、计算复杂度不高、对中间缺失值不敏感、可以处理不相关特征数据、可以解释数据内在含义
缺点:1.对于树最大深度这个预制参数很敏感:决策树深度太大,可能OVERFIT;深度太小,可能UNDERFIT。2.计算效率不高,在数据量很大时,数据维度很高时计算很慢
使用数据范围:数值型和标称型
决策树的一般流程:
1.收集数据
2.准备数据:ID3算法只适用于标称型数据,数值型数据必须离散化
3.分析数据:任何方法,构造树完成之后,应检查图形是否符合预期
4.训练算法:构造树的数据结构
5.测试算法:使用经验树计算错误率
ID3算法的核心是根据信息增益来选择进行划分的特征,然后递归地构建决策树
创建分支的代码是递归函数
判断如何划分数据集(节点如何选择)的标准是最大熵增益(信息增益):原节点的熵与某一层节点的所有熵之和 之差
构建决策树
计算数据集的熵
from math import log
def calcShannonEnt(dataSet):
numEntries = len(dataSet) #数据集中实例的数量
labelCounts={}
for featVec in dataSet:
currentLabel = featVec[-1] #key为最后一列的label值
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel]=0
labelCounts[currentLabel]+=1
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[key])/numEntries #当前key出现的概率
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','flippers']
return dataSet,labels
myDat,labels=createDataSet()
mm = calcShannonEnt(myDat)
print(mm)
划分数据集
def splitDataSet(dataSet,axis,value): #(myDat,0,1)
retDataSet = []
for featVec in dataSet:#[1,1,'yes']
if featVec[axis] == value: #1=1
reducedFeatVec = featVec[:axis] #无
reducedFeatVec.extend(featVec[axis+1:])#列表后加1,'yes'
retDataSet.append(reducedFeatVec)#加一个[1,'yes']