决策树算法解读即实例应用

决策树ID3算法

概念

决策树(Decision Tree)算法是在已经知道每种情况发生的概率下,利用概率论的原理,并且利用一种树图形作为分析工具(即判定树)从而获得最有方案的风险型决策方法。其基本原理是用决策点代表决策问题,用方案分枝代表可供选择的方案,用概率分枝代表方案可能出现的各种结果。

决策树/判定树(decision tree)

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

决策树特征划分的选取

根据特征先后的划分,分为不同的决策树算法。在1970年代,一个名为昆兰的大牛找到了用信息论中的熵来度量决策树的决策选择过程,方法一出,它的简洁和高效就引起了轰动,昆兰把这个算法叫做ID3。

实例:

数据源:

RID age income student credit_rating class_buys_computer
1 youth high no fair no
2 youth high no excellent no
3 middle_age high no fair yes
4 senior medium no fair yes
5 senior low yes fair yes
6 senior low yes excellent no
7 middle_age low yes excellent yes
8 youth medium no fair no
9 youth low yes fair yes
10 senior medium yes fair yes
11 youth medium yes excellent yes
12 middle_age medium no excellent yes
13 middle_age high yes fair yes
14 senior medium no fair no

在我们使用的sklearn库中,对decision tree已经构建好了,但数据的输入要进行预处理,处理为数值型的值。
例如:
对于age:youth=001,middle_age=010,senior=100
income: high=100,medium=010,low=001
student: yes=10, no=01
credit_rating: fair=01, excellent=10
class_buys_computer: no=0,yes=1

import csv

from sklearn.feature_extraction import DictVectorizer
from sklearn import preprocessing
from sklearn import tree
from sklearn.externals.six import StringIO

myFile = open(r'AllElectronics.csv', 'rt')
reader = csv.reader(myFile)
headers = next(reader) # 特征

print(headers)

featureList = [] 
labelList = [] # class值

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)

# DictVectorize对使用字典存储的数据进行特征抽取和向量化
vec = DictVectorizer()
# 转化成特征矩阵
dummyX = vec.fit_transform(featureList).toarray()

print('dummyX:\n' + 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))

# 创建决策树,参数选择代表属性选择度量的属性,该参数代表根据熵的大小,选取结点
clf = tree.DecisionTreeClassifier(criterion = 'entropy')
clf = clf.fit(dummyX, dummyY)
# print('clf:' + str(clf))

# 生成可视化树状图
# graphviz命令 dot -Tpdf inis.dot -o outpu.pdf
with open('allElectronicsInformationGainOri.dot', 'w') as f:
    # f = tree.export_graphviz(clf, out_file=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(dummyX)
print(dummyY)
print("predictedY:" + str(predictedY))

你可能感兴趣的:(机器学习)