(2)决策树算法及其应用

2020-08-04  本文已影响0人  我的章鱼小丸子呢

P:机器学习中分类和预测算法的评估:

1、什么是决策树/判定树(decision tree)

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


决策树

2、如何创建决策树

2.1、熵的概念

一条信息的信息量大小和它的不确定性有直接的关系,信息量的度量就等于不确定性的多少。信息量的计算公式如下所示:
** 变量的不确定性越大,熵越大 **


信息量

2.2、决策时归纳算法

选择属性判断结点
信息获取量(Information Gain):Gain(A)= Info(D) - Infor_A(D)通过A作为节点分类获取了多少信息。
实例,以下是对是否购买计算机的群体的一项数据调查:


调查

已知从结果上来看的信息量是:


信息量
当知道年龄分布后的结果信息量:
信息量
依次类推,分别可以求得在其他条件已知的情况下的信息量
信息量

依次类推,当将age作为第一个结点之后,会得到新生成的三个结点,然后再次重复计算,将三个结点按照决策树原理再次进行分类,知道分类结果唯一。


决策树

2.2分类停止的条件:

2.3算法

算法步骤
其它算法

3.决策树的优点与缺点

优点:
直观 便于理解 小规模数据集有效
缺点:
处理连续性变量不好 错误增加的比较快 不适用于大规模数据集

4、代码实现

4.1、Python

4.2、python机器学习的库:scikit-learn

4.2.1:特性

4.2.2:覆盖问题领域

分类(classfication)、回归(regression)、聚类(clustering),降维(dimensionality)
模型选择(model selection)、预处理(preprocessing)

4.3:使用scikit-learn

4.4、代码

#决策时的应用算法
"""
scikit-learn 强大的机器学习库 达到商用级别
对数据输入的要求 
对所有的特征值必须是数值型
"""
# print("hello world")
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import preprocessing #需要使用到预处理
from sklearn import tree #需要使用到树
from sklearn.externals.six import StringIO #读写功能

all_csv_data = open(r'C:\Users\25478\Desktop\Python\DT.csv','rt')  #读取表格数据
reader = csv.reader(all_csv_data) #利用模块中的reader函数读取出来
header = next(reader)   #取第一行
# print(header)

feature_list = []
label_list = []

for row in reader:
    label_list.append(row[len(row)-1])
    #print(row)
    row_dict = {}
    for i in range(1,len(row)-1):
        row_dict[header[i]] = row[i]
    feature_list.append(row_dict)
#print(feature_list)

vec = DictVectorizer()
dummyX = vec.fit_transform(feature_list).toarray()
# print("dummyX:\n" + str (dummyX)) #在特征值上将字符型的转化为数值
# print(vec.get_feature_names())

lb = preprocessing.LabelBinarizer() #在标签上进行二进制化
dummyY = lb.fit_transform(label_list)
# print("dummyY:\n" + str(dummyY))

clf = tree.DecisionTreeClassifier(criterion = 'entropy')
clf = clf.fit(dummyX,dummyY)
# print("clf=:"+str(clf))

with open("dt.dot",'w') as f:
    f = tree.export_graphviz(clf,feature_names=vec.get_feature_names(),out_file= f)

OneRowX = dummyX[0,:]
print("OneRowX:\n"+str(OneRowX))
newRowX = OneRowX
newRowX[0] = 1
newRowX[1] = 0
print("NewRowX:\n"+str(newRowX))

predY = clf.predict(newRowX)
print("predY:"+str(predY))

使用的数据文件


数据

得到的dot文件


决策树dot文件

5、将dot文件转至pdf-可视化决策树

使用graphviz将dot文件转为png,pdf

#转为png图片
dot -Tpng dtc.dot -o dtc.png

#转为pdf文件
dot -Tpdf dtc.dot -o dtc.pdf
上一篇下一篇

猜你喜欢

热点阅读