决策树的构造 trees.py代码
from math import log
import operator
#计算熵
def calcShannonEnt(dataSet):
# numEntries保存实例总数
numEntries=len(dataSet)
labelCounts={}
#取每个实例最后一项作为特征currentLabel
for featVec in dataSet:
currentLabel=featVec[-1]
# 如果不在字典里就加入字典 在字典里的话就+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)
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
no surfacing 不浮出水面
flippers 脚蹼
不浮出水面是否可以生存 | 是否有脚蹼 | 属于鱼类 | |
---|---|---|---|
1 | 是 | 是 |
是 |
2 | 是 | 是 | 是 |
3 | 是 | 否 | 否 |
4 | 否 | 是 | 否 |
5 | 否 | 是 | 否 |
#按照给定特征划分数据集
输入的三个参数分别是 待划分的数据集 划分数据集的特征 需要返回的特征的值
def splitDataSet(dataSet,axis,value):
retDataSet=[]
for featVec in dataSet:
if featVec[axis]==value:
#划分数据集
reducedFeatVec=featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet
if中的代码的作用:将featVec中的等于value的元素去掉 并将去掉后的列表放在retDataSet中作为返回值返回
#选择最好的数据集划分方式
def choose(dataSet):
#特征的种类数
numFeatures=len(dataSet[0])-1
#baseEntropy存放数据集的熵