决策树

来源:互联网 发布:江湖外卖3.0源码 编辑:程序博客网 时间:2024/06/05 08:29

     决策树是一个类似于流程图的树结构。其中,每个内部节点表示在一个属性上的测试,每个分类代表一个属性输出,而每个输液结点代表类或类分布,树的最顶层是根结点。

决策树是机器学习中分类方法中的一个重要算法。

现在有这样一组数据:


简单的根据条件判断用户是否买电脑。

如果仅考虑年龄,我们可以构建这样一个结点:


根据年龄老中青判断。


首先我们要知道一个概念:熵

一条信息的信息量大小和它的不确定性有直接的关系,要确定一件不确定的事情,就要获得大量的信息。

表示一条信息的不确定性即信息熵,不确定性越大,熵越大,用比特(bit)来衡量信息的多少。


根据熵的大小选择叶子结点:



算法:

树以代表训练样本的单个结点开始

如果样本都在同一个类,则该结点为树叶,并用该类标号

所有的属性都是分类的,即离散值,连续属性必须离散化

对测试属性的每个已知的值,创建一个分支,并据此划分样本

算法使用同样的过程,递归地形成每个划分上的样本判定树,一旦一个属性出现在一个结点上,就不必在该结点的任何后代上考虑它

递归划分步骤仅当下列条件之一成立停止:

     给定结点的所有样本属于同一类

     没有剩余属性可以用来进一步划分样本,在此情况下,使用多数表决


程序实现:

#coding: utf-8#author: 吴晶#wechat: 18007148050from sklearn import *from sklearn.feature_extraction import DictVectorizerimport csvfrom sklearn import preprocessingfrom sklearn import treefrom sklearn.externals.six import StringIO#读取数据allElectronicsData = open("E:\program\TensorFlow\ElementTree\\allElementTree.csv",'rt')reader = csv.reader(allElectronicsData)headers = next(reader)#print(headers)featureList = []labelList = []for row in reader:    labelList.append(row[len(row)-1])    rowDict = {}    for i in range(1,len(row)-1):        #print(row[i])        rowDict[headers[i]] = row[i]        # print("rowDict: ",rowDict)    featureList.append(rowDict)# print(featureList)vec = DictVectorizer()dummyX = vec.fit_transform(featureList).toarray()# print("dummyX:" + str(dummyX))# print(vec.get_feature_names())# print("labelList: " + str(labelList))lb = preprocessing.LabelBinarizer()dummyY = lb.fit_transform(labelList)# print("dummyY: " + str(dummyY))clf = tree.DecisionTreeClassifier(criterion="entropy")clf = clf.fit(dummyX,dummyY)# print("clf: "+ str(clf))with open("allElectronicInformationGainOri.dot","w") as f:    f = tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file= f)oneRowX = dummyX[0,:]# print("oneRowX: " + str(oneRowX))newRowX = oneRowXnewRowX[0] = 1newRowX[2] = 0# print("newRowX: " + str(newRowX))predictedY = clf.predict([newRowX])print("predictedY: " + str(predictedY))