使用sklearn构建含有标量属性的决策树

网络上使用sklearn生成决策树的资料很多,这里主要说明遇见标量数据的处理。

经查验参考资料,sklearn并非使用了课上以及书上讲的ID3算法,而是选择了CART,该算法生成二叉树;scikit-learn使用了一种优化的CART算法,要求元数据为数值型(要能转换为np.float32类型的矩阵),因为该实现同时可以做回归分析。然而,题目数据中有天气等标量数据,所以还要进行转化,这里采用了sklearn中的LabelEncoder来将n个标量转化为1至n-1的整数。将数据训练完毕后,安装并使用了Graphviz(一个图形显示库)和pydotplus(方便使用Graphviz的Python编程接口)来进行结果图形化显示;查阅资料说的配置好像比较复杂,其实下载下来Graphviz后解压缩,并把bin文件夹加入环境变量就可以用pydotplus来访问了。使用信息熵作为度量,结果如图所示,其中value表示目标两类各包含多少实例。

结果:

为展示训练结果如何,将原数据再次使用score函数输入,发现正确率100%。应该是由于没有限制树的深度结果比较精确,并且发现“湿度”这个属性根本没有使用!但是一旦数据比较多,就需要限制树的深度了和每个叶子的实例个数了,由max_depth、min_samples_split、min_samples_leaf来设置。

最后还有一些疑问,就是把标量当做数值属性来处理,会影响最后分类的结果吗?需要拿数据说话还是有一些已经存在的结论。。。?

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Tue Nov 22 17:45:37 2016
 4
 5 @author: Ascii0x03
 6 """
 7
 8 from sklearn import tree
 9 from sklearn import preprocessing
10 import pydotplus
11 from IPython.display import Image
12
13 #将数据集data中的字符串属性全部转化为对应的标签
14 #data为矩阵,同tree.DecisionTreeClassifier.fit方法中的数据
15 #返回值le_list是preprocessing.LabelEncoder()对象的列表
16 #str_index是属性中字符串类型的下标
17 def preprocess(data):
18     str_index = []
19     #temp_label = []
20     le_list = []
21     le_num = 0
22     for i in range(0,len(data[1])):
23         if (isinstance(data[1][i], str)):
24             str_index.append(i)
25     #整理出labelEncoder
26     for index in str_index:
27         temp_label = []
28         for i in data:
29             temp_label.append(i[index])
30         le_list.append(preprocessing.LabelEncoder())
31         le_list[le_num].fit(temp_label)
32         #根据labelEncoder修改原始数据
33         #print temp_label
34         for i in data:
35             i[index] = le_list[le_num].transform([(i[index])])[0]
36
37         le_num += 1
38
39     return (le_list, str_index)
40
41
42
43 clf = tree.DecisionTreeClassifier(criterion = "entropy")
44 #每行是一个数据,分别为天气,温度,湿度风况
45 data = [["Sunny", 85, 85, "No"],
46         ["Sunny", 80, 90, "Yes"],
47         ["Cloudy", 83, 78, "No"],
48         ["Rainy", 70, 96, "No"],
49         ["Rainy", 68, 80, "No"],
50         ["Rainy", 65, 70, "Yes"],
51         ["Cloudy", 64, 65, "Yes"],
52         ["Sunny", 72, 95, "No"],
53         ["Sunny", 69, 70, "No"],
54         ["Rainy", 75, 80, "No"],
55         ["Sunny", 75, 70, "Yes"],
56         ["Cloudy", 72, 90, "Yes"],
57         ["Cloudy", 81, 75, "No"],
58         ["Rainy", 71, 80, "Yes"]
59         ]
60 #针对每行数据,分类为适合运动与不适合运动
61 labels = ["unfit", "unfit", "fit", "fit", "fit",
62           "unfit", "fit", "unfit", "fit", "fit",
63           "fit", "fit", "fit","unfit"]
64 (le_list, str_index) = preprocess(data)
65 #print data
66 clf.fit(data, labels)
67
68 print clf.feature_importances_
69 dot_data = tree.export_graphviz(clf, out_file=None)
70 graph = pydotplus.graph_from_dot_data(dot_data)
71 Image(graph.create_png()) #这里貌似不能正确显示
72 graph.write_pdf("test1.pdf")
73 graph.write_png("test1.png")
74 #print dot_data
75
76 test = [["Rainy", 71, 80, "Yes"]]
77 #Preprocessing the test data
78 for index in range(0, len(str_index)):
79     for i in test:
80         i[str_index[index]] = le_list[index].transform([i[str_index[index]]])[0]
81 #print test
82 print clf.predict(test)
83 print clf.predict_proba(test)
84 print clf.score(data, labels)

参考:

0. ID3算法实现决策树可http://blog.csdn.net/u012822866/article/details/42419471

1. http://scikit-learn.org/stable/modules/tree.html#tree-classification

2. http://scikit-learn.org/dev/modules/generated/sklearn.preprocessing.LabelEncoder.html

3. http://pydotplus.readthedocs.io/

4. http://www.graphviz.org/

时间: 2024-08-01 10:28:06

使用sklearn构建含有标量属性的决策树的相关文章

Redis(二):命令集构建及关键属性解析

上一篇文章,我们从框架层面,主要介绍了redis的启动过程,以及主要的命令处理流程逻辑.这些更多的都是些差不多的道理,而要细了解redis,则需要更细节的东西. 今天我们稍微内围的角度,来看看几个命令执行的重要方法,深入理解下redis的魅力所在. 首先,我们通过上一章知道,processCommand 是其业务主要入口,我们再来回顾下: // server.c /* If this function gets called we already read a whole * command,

Entity Framework json 序列化含有导航属性的实体

public ActionResult User_Query2()        {            //通过用户手机号查寻 该用户的所有邮包记录            string User_Tel1 = Request.Form["User_Tel"];            if (User_Tel1 == null)            {                return HttpNotFound();            }            Lis

数据分析算法

数据分析算法 决策树 决策树用于对数据集中的记录进行分类. 假设每条记录都含有若干条属性,决策树根据属性进行分类. ID3算法 如何决定选取哪条属性来进行划分? 判断条件是根据该属性划分后数据集的信息熵最小(信息熵越小表明数据越整齐),也就是熵差值最大. 假设A属性共有n个取值,按照A划分后将获得n个分支,每个分支里的子数据集都删除了A属性. 递归地对分支里的数据集实施划分.最终达到不可分或者所有数据都是相同值为止. 这将生成一颗决策树.利用决策树的叶子节点进行分类 c4.5算法 ID3的扩展,

【火炉炼AI】机器学习006-用决策树回归器构建房价评估模型

[火炉炼AI]机器学习006-用决策树回归器构建房价评估模型 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 最近几十年,房价一直是中国老百姓心中永远的痛,有人说,中国房价就像女人的无肩带文胸,一半人在疑惑:是什么支撑了它?另一半人在等待:什么时候掉下去? 而女人,永不可能让它掉下来.就算快掉下来了,提一提还是又上去了..... 虽然我们不能预测中国房价什么时候崩盘,但是却可以用机器学

「数据挖掘入门系列」数据挖掘模型之分类与预测 - 决策树

决策树在分类.预测.规则提取等领域有着广泛的应用. 决策树是一种树状结果,它的每一个叶节点对应一个分类.构造决策树的核心问题是:在每一步如何选择适当的属性对样本做拆分.对于分类问题,从已知类标记的训练样本中学习并构造出决策树是一个自上而下,分而治之的过程. 常见的决策树算法如下: ID3算法 C4.5算法 CART算法 其中ID3是最经典的决策树分类算法. ID3算法 ID3算法基于信息熵来选择最佳测试属性.它选择当前样本集中具有最大信息增益值的属性作为测试属性. 总的信息熵计算方式如下: 设S

【Python数据挖掘】决策树

决策树的定义 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树).其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别.使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果. 树是由节点和边两种元素组成的结构.理解树,就需要理解几个关键词:根节点.父节点.子节点和叶子节点. 父节点和子节点是相对的,说白了子节点由父节点根据某

用Python开始机器学习(2:决策树分类算法)

http://blog.csdn.net/lsldd/article/details/41223147 从这一章开始进入正式的算法学习. 首先我们学习经典而有效的分类算法:决策树分类算法. 1.决策树算法 决策树用树形结构对样本的属性进行分类,是最直观的分类算法,而且也可以用于回归.不过对于一些特殊的逻辑分类会有困难.典型的如异或(XOR)逻辑,决策树并不擅长解决此类问题. 决策树的构建不是唯一的,遗憾的是最优决策树的构建属于NP问题.因此如何构建一棵好的决策树是研究的重点. J. Ross Q

我的机器学习之旅(六):决策树

决策树概念: 分类决策树模型是一种描述对实例进行分类的树形结构.决策树由结点和有向边组成.结点有两种类型:内部节点和叶节点,内部节点表示一个特征或属性,叶节点表示一个类. 分类的时候,从根节点开始,对实例的某一个特征进行测试,根据测试结果,将实例分配到其子结点:此时,每一个子结点对应着该特征的一个取值.如此递归向下移动,直至达到叶结点,最后将实例分配到叶结点的类中. 例如判断某款物品的潜在买家: 决策树可以看成一个if-then规则的集合:由决策树的根结点到叶结点的每一条路径构建一条规则:路径上

Sklearn分类树在合成数集上的表现

小伙伴们大家好~o( ̄▽ ̄)ブ,今天我们开始来看一下Sklearn分类树的表现,我的开发环境是Jupyter lab,所用的库和版本大家参考: Python 3.7.1(你的版本至少要3.4以上) Scikit-learn 0.20.0 (你的版本至少要0.20) Graphviz 0.8.4 (没有画不出决策树哦,安装代码conda install python-graphviz) Numpy 1.15.3, Pandas 0.23.4, Matplotlib 3.0.1, SciPy 1.1