数据挖掘实验报告_第1页
数据挖掘实验报告_第2页
数据挖掘实验报告_第3页
数据挖掘实验报告_第4页
数据挖掘实验报告_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上武汉理工大学理学院数学系课程上机实验报告课 程 名 称: 数据挖掘 班级信计1201日 期6.9成绩评定 姓名张徐军(26)李雪梅(35)张晓婷(33)实验室数学207老师签名  实验名称决策树解决肝癌预测问题所用软件 Python实验目的及内容目的 :熟悉决策树分类的基本思想以及运用ID3算法进行实例演练。内容:根据所给的肝癌数据进行分类,得到决策树,以及验证其正确性与适用性。实验 原理步骤在编码之前为了方便起见,将实验数据的十个指标的属性值分别用数字1,2,3,4表示,表示结果如下:X1 no 1 light 2 mid 3

2、 serious 4X2 no 1 branch 2 trunk 3X3 positive 1 negative 2X4 positive 1 negative 2X5 rightliver 1 leftliver 2 allliver 3X6 small 1 middle 2 big 3 verybig 4X7 dilation 1 infiltration 2X8 no 1 part 2 integrate 3X9 no 1 have 2X10 no 1 less 2 much 3代码:# -*- coding: cp936 -*-import mathimport operator#计算

3、香农熵,分两步,第一步计算频率,第二步根据公式计算香农熵。def calcShannonEnt(dataSet): numEntries=len(dataSet) labelCounts= for featVec in dataSet: currentLabel=featVec-1 if currentLabel not in labelCounts.keys(): labelCountscurrentLabel=0 labelCountscurrentLabel+=1 shannonEnt=0.0 for key in labelCounts: prob =float(labelCounts

4、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

5、,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,

6、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

7、 dataSet,labels#划分数据集,将满足Xaixs=value的值都划分到一起,返回一个划分好的集合(不包括用来划分的aixs属性,因为不需要)def splitDataSet(dataSet, axis, value): retDataSet = for featVec in dataSet: if featVecaxis = value: reducedFeatVec = featVec:axis #chop out axis used for splitting reducedFeatVec.extend(featVecaxis+1:) retDataSet.append(re

8、ducedFeatVec) return retDataSet#选择最好的属性进行划分,思路很简单就是对每个属性都划分下,看哪个好。这里使用到了一个set来选取列表中唯一的元素。def chooseBestFeatureToSplit(dataSet): numFeatures = len(dataSet0) - 1 #因为数据集的最后一项是标签 baseEntropy = calcShannonEnt(dataSet) bestInfoGain = 0.0; bestFeature = -1 for i in range(numFeatures): #iterate over all the

9、 features featList = examplei 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 for value in uniqueVals: subDataSet = splitDataSet(dataSet, i, value) prob = len(subDataSet)/float(len(dataSet) newEntropy +=

10、 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 #return

11、s an integer #因为我们递归构建决策树是根据属性的消耗进行计算的,所以可能会存在最后属性用完了,但是分类还是没有完,这是就会采用多数表决的方式计算节点分类。 def majorityCnt(classList): classCount= for vote in classList: if vote not in classCount.keys(): classCountvote = 0 classCountvote += 1 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), r

12、everse=True) return sortedClassCount00#基于递归构建决策树。这里的label更多是对于分类特征的名字,为了更好理解。def createTree(dataSet,labels): classList = example-1 for example in dataSet if classList.count(classList0) = len(classList): return classList0#stop splitting when all of the classes are equal if len(dataSet0) = 1: #stop sp

13、litting when there are no more features in dataSet return majorityCnt(classList) bestFeat = chooseBestFeatureToSplit(dataSet) bestFeatLabel = labelsbestFeat myTree = bestFeatLabel: del(labelsbestFeat) featValues = examplebestFeat for example in dataSet uniqueVals = set(featValues) for value in uniqu

14、eVals: subLabels = labels: #copy all of labels, so trees don't mess up existing labels myTreebestFeatLabelvalue = createTree(splitDataSet(dataSet, bestFeat, value),subLabels) return myTreedef classify(inputTree,featLabels,testVec): firstStr = inputTree.keys()0 secondDict = inputTreefirstStr feat

15、Index = featLabels.index(firstStr) key = testVecfeatIndex valueOfFeat = secondDictkey if isinstance(valueOfFeat, dict): classLabel = classify(valueOfFeat, featLabels, testVec) else: classLabel = valueOfFeat return classLabeldef getResult(): dataSet,labels=createDataSet() # splitDataSet(dataSet,1,1)

16、chooseBestFeatureToSplit(dataSet) # print chooseBestFeatureToSplit(dataSet) #print calcShannonEnt(dataSet) mtree=createTree(dataSet,labels) print mtree print classify(mtree,'X1','X2','X3','X4','X5','X6','X7','X8','X9','X10&#

17、39;, 3,1,2,1,1,2,1,3,2,3)print classify(mtree,'X1','X2','X3','X4','X5','X6','X7','X8','X9','X10',3,2,2,2,1,2,1,3,1,2)print classify(mtree,'X1','X2','X3','X4','X5','X6','

18、;X7','X8','X9','X10',2,3,2,1,2,1,2,1,1,1)print classify(mtree,'X1','X2','X3','X4','X5','X6','X7','X8','X9','X10',1,3,2,1,1,4,2,1,1,1) print classify(mtree,'X1','X2','X3'

19、;,'X4','X5','X6','X7','X8','X9','X10', 1,1,1,1,1,4,1,2,1,2) if _name_='_main_': getResult() 实验结果及分析第一步:首先将20个样本作为训练样本生成决策树,然后以原来的20个样本作为测试样本检验决策树的正确性及适用性,得到的结果与事实全部相符,决策树程序表示如下:'X8': 1: 'X1': 1: 'N', 2: 'Y', 3: 'N', 4: 'Y', 2: 'X1': 1: 'X3': 1: 'Y', 2: 'N', 3: 'Y', 4: 'Y', 3: 'X1': 1: 'X2': 1: 'Y', 2: 'N', 2: &

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论