什么是决策树呢?其实很直观,这样的就是
不说了,先看数据:
这是一个医疗检测的数据,前面六个是指标,具体是什么其实没有意义,说的好像化验单上的那些医学术语你都知道似得。最后一个就是结果。我们就是要构建一颗决策树,根据前面六个指标,预测最后结果是消极还是积极。当然,码代码之前我们先要对数据做一点处理。
对于后面这一行,我们当然是把消极变为0,积极变为1,结果大概呢就是这样的。so easy!
对了,数据、还有接下来的代码,大家可以去我的github上面下载整个完整的工程。里面都有。地址在最后给出哦!
然后就是写代码了。这次我们还是使用sklearn这个库,谁叫他这么好用呢。
1.导入库
代码语言:javascript复制import csv
from sklearn import tree
import numpy as np
2.读取数据
代码语言:javascript复制def readData(path,ratio):
reader = csv.reader(file(path, 'rb'))
data = []
flag = []
dataTrain = []
flagTrain = []
dataTest = []
flagTest = []
for line in reader:
data.append([float(line[0]),float(line[1]),float(line[2]),float(line[3]),float(line[4]),float(line[5])])
flag.append(float(line[6]))
for i in range(0,int(len(data)*ratio)):
dataTrain.append(data[i])
flagTrain.append(flag[i])
for i in range(int(len(data)*ratio),len(data)):
dataTest.append(data[i])
flagTest.append(flag[i])
return dataTrain,flagTrain,dataTest,flagTest
和之前的也没什么区别,不过受到前面ByPython数据的启发,在里面加了个内容,就是能够按照比例,自动产生训练数据和测试数据。
3.测试
代码语言:javascript复制path = 'I:/MLtrain/hData.csv'#设置文件的路径
X_train,Y_train,X_test,Y_test = readData(path,0.8)#读取数据,按照4:1的比例分割训练集和测试集
clf = tree.DecisionTreeClassifier()#生成一个DT 分类器
clf = clf.fit(X_train, Y_train)#训练这个DT
pre=clf.predict(X_test)
print np.sum(np.abs(pre - np.array(Y_test)))/len(pre)#输出错误率
代码比较简单。最后的结果是0.08的错误率,也就是92%的准确率,相当不错哦!
4.关于原理
决策树的原理是什么呢?这里简单说一下。我们简化一下,考虑一个一个离散的情况,
是网上流传的很经典的大龄女性相亲决策树模型。为什么第一个节点是年龄而不是别的呢?我们按照怎么样的顺序去选择这些节点呢。
一个节点选择的好坏使用信息熵来衡量的,如果一个节点一分类之后,发现把情况彻底分开了,那么这个就是最好的,因为每一个部分都很“纯”,不是0就是1.反过来,如果还是很杂,比如年龄三十以下和年龄三十以上两个部分分开之后,每一个部分还是混了很多不见和见的情况,那么就没什么意义。这种数据的“纯度”就是用信息熵来衡量的。这里就不给大家写什么公式了,有兴趣的可以找数据挖掘的书看看。原理就是这个样子的。
大家可以去我的Github上面下载代码和数据:https://github.com/Luyixiao/DecisionTree