数据挖掘实验报告

  • 格式:doc
  • 大小:44.04 KB
  • 文档页数:6

下载文档原格式

  / 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

武汉理工大学理学院数学系课程上机实验报告课程名称:数据挖掘

信计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