P:机器学习中分类和预测算法的评估:
- 准确率
- 速度
- 强壮性
- 可规模性
- 可解释性
1、什么是决策树/判定树(decision tree)
判定树是一个类似于流程图的树结构:其中,每个内部结点表示一个属性上的测试,每个分支代表一个属性输出,而每个树叶节点代表类或类分布。树的最顶层是根节点。
决策树
2、如何创建决策树
2.1、熵的概念
一条信息的信息量大小和它的不确定性有直接的关系,信息量的度量就等于不确定性的多少。信息量的计算公式如下所示:
** 变量的不确定性越大,熵越大 **
信息量
2.2、决策时归纳算法
选择属性判断结点
信息获取量(Information Gain):Gain(A)= Info(D) - Infor_A(D)通过A作为节点分类获取了多少信息。
实例,以下是对是否购买计算机的群体的一项数据调查:
调查
已知从结果上来看的信息量是:
信息量
当知道年龄分布后的结果信息量:
信息量
依次类推,分别可以求得在其他条件已知的情况下的信息量
信息量
依次类推,当将age作为第一个结点之后,会得到新生成的三个结点,然后再次重复计算,将三个结点按照决策树原理再次进行分类,知道分类结果唯一。
决策树
2.2分类停止的条件:
- 1.给定条件的结点所有样本属于同一样类
- 2.找不到可以分类该结点的属性
2.3算法
算法步骤其它算法
3.决策树的优点与缺点
优点:
直观 便于理解 小规模数据集有效
缺点:
处理连续性变量不好 错误增加的比较快 不适用于大规模数据集
4、代码实现
4.1、Python
4.2、python机器学习的库:scikit-learn
4.2.1:特性
- 简单高效的数据挖掘和机器学习分析
- 对所有用户开放,根据不同需求高度可重用性
- 基于Numpy,SciPy和matplotlib
- 开源,商用级别;获得BSD许可
4.2.2:覆盖问题领域
分类(classfication)、回归(regression)、聚类(clustering),降维(dimensionality)
模型选择(model selection)、预处理(preprocessing)
4.3:使用scikit-learn
- 安装scikit-learn:pip,easy_install,windows installer
- 安装必要package:numpy,SciPy和matplotlib,可使用Anaconda(包含numpy,scipy等科学计算常用package)
安装注意问题:Python解释器版本(2.7or3.4-),32-bit or 64-bit系统。
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
网友评论