赞
踩
本文主要介绍决策树的过程:
目录
决策树一般都是自上而下的来生成的。每个决策事件都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很像一棵树的枝干,故称决策树。
基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处熵值为0(叶节点中的实例都属于一类)。
在决策树构建的过程中,我们需要一个衡量标准来确定每次数据划分所带来的收益,这个标准就是信息熵,以0-1二分类问题为例,衡量一个节点的信息熵公式如下:
信息熵越大代表信息越抽象,决策树中节点信息熵规则为:Entropy(parent)> Entropy(son)> Entropy(grandson)> ...... > 0
杜撰了一批数据集,用于具体构建决策树:
决策树中常用ID3归纳算法构建节点,信息获取量过程:Gain(A) = Info(D) - Info_A(D)
通过购买结果来作为分类,看获取了多少信息量。
故:Gain(年龄) = Info(D) - Info_年龄(D) = 0.94 - 0.69 = 0.25bits
类似地,可以计算出Gain(收入) = 0.03 ,Gain(是否学生) = 0.15,Gain(信用) = 0.05
ID3算法归纳认为,选择年龄作为归纳树的父节点。
父节点的分裂结果为:
对于购买结果为no的情况可以重复上述运算过程,完成一棵完整决策树的构建。
决策树的优点:直观,便于理解,小规模数据集有效;
决策树的缺点:处理连续变量不好,类别较多时,错误增加的比较快。
用sklearn实现决策树,代码如下:
- from sklearn.feature_extraction import DictVectorizer
- import csv
- from sklearn import tree
- from sklearn import preprocessing
- from sklearn.externals.six import StringIO
-
- # Read in the csv file and put features into list of dict and list of class label
- allElectronicsData = open(r'train_set.path', '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):
- rowDict[headers[i]] = row[i]
- featureList.append(rowDict)
-
- print(featureList)
-
- # Vetorize features
- vec = DictVectorizer()
- dummyX = vec.fit_transform(featureList) .toarray()
-
- print("dummyX: " + str(dummyX))
- print(vec.get_feature_names())
-
- print("labelList: " + str(labelList))
-
- # vectorize class labels
- lb = preprocessing.LabelBinarizer()
- dummyY = lb.fit_transform(labelList)
- print("dummyY: " + str(dummyY))
-
- # Using decision tree for classification
- # clf = tree.DecisionTreeClassifier()
- clf = tree.DecisionTreeClassifier(criterion='entropy')
- clf = clf.fit(dummyX, dummyY)
- print("clf: " + str(clf))
-
-
- # Visualize model
- with open("Dtree.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 = oneRowX
- newRowX[0] = 1
- newRowX[2] = 0
- print("newRowX: " + str(newRowX))
-
- predictedY = clf.predict(newRowX)
- print("predictedY: " + str(predictedY))
结果输出为:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。