决策树算法实现

#coding=utf-8
#导入相关包
from sklearn.feature_extraction import DictVectorizer#sklearn 对输入的数据格式有要求,必为离散整形
import csv#数据集存放的位置
from sklearn import preprocessing#预处理
from sklearn import tree#决策树
from sklearn.externals.six import StringIO#读写的过程

#open输出scv文件,这就把数据读取进来了。读进来之后,csv自带了一个read方法,
#这样就把csv文件里面的按行读取内容
#heads就是read的next方法,可以打印出来看看它是什么东西
csvfile='/home/user/zhyproject/dataset.csv'
dataset=open(csvfile,'rb')
reader=csv.reader(dataset)#按行读取
# print reader
headers=reader.next()
# print headers#就是我们定义的第一行的title
#在这之后有3个步骤,sklearn对decision tree已经实现好了,但是他对数据的输入有一个格式的要求,我们不能直接使用原始格式
# 的数据。故我们先要进行一个预处理,在预处理之后,我们可以直接使用sklearn里面自带的分类器进行模型的创建,构建决策数,
# 之后我们就可以来可视化的看我们建好的decisiontree
#1.我们先要把数据转换成
featurelist=[]
labellist=[]

for row in reader:#遍历reader中的每一行,每个row相当于一个list吧
labellist.append(row[-1])#取每一行的最后一个元素(即label)
rowdict={}#!!对于每一行来讲,我们要取这一行的4个特征值(第一个不算,第一个为ID )
#所以在这一行内,我们要遍历这4个值
#这个字典的key就对应它是哪一个属性(比如说age,然后它具体的值就是我们取出来的值)
# 通过这种方式完成了2个list的创建,一个是labellist,一个是rowdictionary,就是我们的featurelist(特征值的字典)
#我们为什么要建立list类型呢?是因为python给我们提供了一个模块叫Dicvectortizer,它可以将
for i in range(1,len(row)-1):#遍历每一行的每一个属性与属性值
rowdict[headers[i]]=row[i]
featurelist.append(rowdict)
# print featurelist
# print labellist
#rectorie features
vec=DictVectorizer()#这样就直接把字符型数据转换成了0,1型数据的matrix(2行代码搞定)
dummyX=vec.fit_transform(featurelist).toarray()

print("dummyX: "+str(dummyX))
# print vec.get_feature_names()

lb=preprocessing.LabelBinarizer()
dummyY=lb.fit_transform(labellist)
print("dummyY: "+str(dummyY))#dummyX,dummyY是矩阵啊,原来也可以通过str转换成字符型

#这两步完成之后,dummyX和dummyY都符合sklearn里面的分类器的格式
#所以这个时候我们直接可以利用sklearn里面的tree下面的DecisionTree的classifier直接来buildmodel
#第一步,说明我们要创建一个classifier分类器,注意这里面有很多参数可以选取,
# 具体的参数可以参照sklearn的decisionTree文档、
#选取属性作为节点的时候,有一个度量方法,他就决定了用那种算法。ID3是选择信息熵的差(infogain)来作为度量标准
#选取哪一个属性作为构建树的节点。如果我们不作任何指明的话,python将默认使用cat算法
#第二步,通过调用分类器的。fit方法来进行建模,填入两个参数,第一个是features矩阵,y是一列,
#完了之后我们旧构建好了决策数
clf=tree.DecisionTreeClassifier(criterion="entropy")
clf=clf.fit(dummyX,dummyY)
# print('clf: '+str(clf))
#########################################################
#利用python里面的graphviz来把我们建好的tree打印出来,这个tree的每一个节点是什么样,怎么来分的,而且我们可以通过plot
with open("dataset_tree.dot",'w') as f:#存储我们创建的决策数的各种信息
f=tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file=f)
#其中dot就是我们build好的decision tree,它告诉我们第一个节点(根节点)
# 我们之后可以通过graphviz将dot文件转换为pdf文件,并且直接把desiontree形象的画出来
#在终端输入dot -Tpdf dat aset_tree.dot -o output.pdf


#build完树以后我们就可以来预测,假如说我们有一个新的数据,有一个人,我们要预测它是不是要买电脑
#我们就可以用predict方法来预测
#也即我们现在有一行新的数据,要知道最后它的classlabel是什么,
#我们可以在代码里面predict一个函数
#假设我们取我们放入的x的第一行,在这一行取出来之后,假设我们做点改动,也就是说
# oneRowX=dummyX[0,:]#取矩阵的第一行(age:0,0,1)
# print("oneRowX: "+str(oneRowX))

# newRowX=oneRowX
# newRowX[0]=1#变成(1,1,0)
# newRowX[2]=0
# print("newRowX: "+str(newRowX))

#预测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值