数据挖掘实验报告
- 格式:doc
- 大小:44.04 KB
- 文档页数:6
武汉理工大学理学院数学系课程上机实验报告课程名称:数据挖掘
班
级
信计1201 日期 6.9 成绩评定
姓名张徐军(26)
李雪梅(35)
张晓婷(33)
实验室数学207 老师签名
实
验
名
称
决策树解决肝癌预测问题
所
用
软
件
Python
实
验
目的及内容目的:熟悉决策树分类的基本思想以及运用ID3算法进行实例演练。
内容:根据所给的肝癌数据进行分类,得到决策树,以及验证其正确性与适用性。
实验原理步骤在编码之前为了方便起见,将实验数据的十个指标的属性值分别用数字1,2,3,4表示,表示结果如下:
X1 no 1 light 2 mid 3 serious 4
X2 no 1 branch 2 trunk 3
X3 positive 1 negative 2
X4 positive 1 negative 2
X5 rightliver 1 leftliver 2 allliver 3
X6 small 1 middle 2 big 3 verybig 4
X7 dilation 1 infiltration 2
X8 no 1 part 2 integrate 3
X9 no 1 have 2
X10 no 1 less 2 much 3
代码:
# -*- coding: cp936 -*-
import math
import operator
#计算香农熵,分两步,第一步计算频率,第二步根据公式计算香农熵。
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.0
for key in labelCounts:
prob =float(labelCounts[key])/numEntries
shannonEnt-=prob*math.log(prob,2)
return shannonEnt
def createDataSet():
dataSet=[[3,2,2,2,1,2,1,2,1,2,'Y'],
[3,3,1,1,1,2,2,1,2,3,'N'],
[4,1,2,1,2,3,1,1,1,3,'Y'],
[1,1,2,2,3,4,1,3,1,3,'Y'],
[2,2,1,1,1,1,2,3,2,1,'N'],
[3,3,1,2,1,2,2,2,1,1,'Y'],
[2,2,1,2,1,1,2,1,2,3,'Y'],
[1,3,2,1,3,3,1,2,1,2,'N'],
[3,2,1,2,1,2,1,3,2,2,'N'],
[1,1,2,1,1,4,1,2,1,1,'N'],
[4,3,2,2,1,3,2,3,2,2,'N'],
[2,3,1,2,3,1,1,1,1,2,'Y'],
[1,1,2,1,1,4,2,2,1,3,'N'],
[1,2,2,2,3,4,2,3,2,1,'N'],
[4,2,1,1,1,3,2,2,2,2,'Y'],
[3,1,2,1,1,2,1,3,2,3,'N'],
[3,2,2,2,1,2,1,3,1,2,'N'],
[2,3,2,1,2,1,2,1,1,1,'Y'],
[1,3,2,1,1,4,2,1,1,1,'N'],
[1,1,1,1,1,4,1,2,1,2,'Y']]
labels=['X1','X2','X3','X4','X5','X6','X7','X8','X9','X10']
return dataSet,labels
#划分数据集,将满足X[aixs]==value的值都划分到一起,返回一个划分好的集合(不包括用来划分的aixs属性,因为不需要)
def splitDataSet(dataSet, axis, value):
retDataSet = []
for featVec in dataSet:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis] #chop out axis used for splitting
reducedFeatVec.extend(featV ec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet
#选择最好的属性进行划分,思路很简单就是对每个属性都划分下,看哪个好。这里使用到了一个set来选取列表中唯一的元素。
def chooseBestFeatureToSplit(dataSet):
numFeatures = len(dataSet[0]) - 1 #因为数据集的最后一项是标签
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
uniqueVals = set(featList) #get a set of unique values
newEntropy = 0.0