python决策树算法_决策树算法及python实现
决策树算法是机器学习中的经典算法
1.决策树(decision tree)
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。
假设小明去看电影,影响看电影的外部因素有 时间 电影类型 评分 三个情况,目前已知的样本数据如下
根据以上样本数据,整理成tree形结构如下
2.决策树算法中熵的概念
1948年香农提出了“信息熵(entropy)”的概念
一条信息的信息量大小和它的不确定性有直接,信息量的度量就等于不确定性的多少,我们用bit(比特)来衡量信息量的多少
信息熵的计算公式如下,以log2为底,取对数,然后把每一种情况相加,当每种情况下概率相等时,取最大值,为n/2 -1 ,即变量的不确定性越大,则信息熵也越大
3.决策树归纳算法
策树归纳算法是J.Ross.Quinian在19世纪70年代提出的的ID3算法.
上面小明看电影实例中,总的信息量(单位为bit)为
同理,我们可以计算不同电影类型的信息熵,结果为0.65bits
此处解释下为什么根节点从电影类型开始划分,判断应该用哪个类型划分节点,可以依据如下公式判定
Gain(A) = info(D) - Info_A(D)
即总的信息量减除以特定节点的信息获取量,如果此值越大,说明获取的信息量越多,据此可以作为根节点
以type为节点的信息获取量:
Gain(type) = 0.991 - 0.65 = 0.341 (bits)
依次类推,也可以计算出以time 和 grade获取的信息量,在此不一一计算了。因为此处以type为节点获取的信息量最大,所以根节点以type区分
其它算法
c4.5: (Quinlan)
cart: Classification and Regression Trees (L.Breiman, J.Friedman, R.Olshen, C.Stone)
以上两个算法c4.5和cart以及前面介绍的entropy都是贪心算法,主要区别在于属性的度量方法不同.
tips
决策树算法,直观,便于理解,试用于小规模的数据,对连续型变量处理不好,如果要处理,需要做到离散化。如果类型分得太细,可能会造成train较好,但是predict不好,为避免此种情况的overfitting,一般采取减枝
代码实现
本文以python为例,讲解代码的实现,本文会用到机器学习中常用的python库sklearn
下面直接看代码
其中用到了sklearn库中的DictVectorizer(转换成sklearn所能接受的类型用), csv(处理csv格式文件用), preprocessing(预处理数据,只能是数值类型),tree(决策树), StringIO(sklearn中的IO处理)
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import preprocessing
from sklearn import tree
from sklearn.externals.six import StringIO
接下来,首先读取本读的csv数据,数据样本如第一张图片
allFilmsData = open(r'/Users/max/Desktop/seeFilm.csv', 'rb')
reader = csv.reader(allFilmsData)
headers = reader.next()
接着,我们对数据进行处理
# 特征数组
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)
# vetoarize feature
vec = DictVectorizer()
#DictVectorizer实例化
dummyX = vec.fit_transform(featureList).toarray()
#转化成dummy viable格式的
通过以上转化,得到的数据结构如下
dumyX:[
[ 1. 0. 0. 0. 1. 0. 0. 1. 0.]
[ 0. 0. 1. 1. 0. 0. 0. 0. 1.]
[ 0. 0. 1. 1. 0. 0. 1. 0. 0.]
[ 1. 0. 0. 1. 0. 1. 0. 0. 0.]
[ 1. 0. 0. 0. 1. 0. 0. 0. 1.]
[ 0. 1. 0. 1. 0. 0. 1. 0. 0.]
[ 0. 1. 0. 0. 1. 0. 0. 0. 1.]
[ 1. 0. 0. 0. 1. 0. 1. 0. 0.]
[ 0. 0. 1. 1. 0. 0. 0. 1. 0.]
]
同时,我们可以查看feature_names和labelList
feature_names格式如下:
['grade=high', 'grade=low', 'grade=middle', 'time=weekend', 'time=workday_night', 'type=art', 'type=crime', 'type=love', 'type=science_fiction']
labelList格式如下:
labelList:['see', 'no', 'see', 'see', 'no', 'no', 'no', 'see', 'see']
把labelList转化,代码如下
# vectorize class labels
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummy:" + str(dummyY))
接下来,我们可以查看树结构
clf = tree.DecisionTreeClassifier(criterion='entropy')
'''
上述采用的信息熵的差作为度量标准,即ID3
如果此处不传,默认采用的是gini,即是cart算法
'''
clf = clf.fit(dummyX, dummyY)
print("clf:" + str(clf))
with open("/Users/max/Desktop/allFilmInfoGainOri.dot", 'w') as f:
f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f)
我们把上面结果存储为allFilmInfoGainOri.dot的文件,可以看到文档信息如下,打开本地文件,可以看到文件结构如下
当然为了更加直观的查看以上部分数据结构,我们可以用Graphviz工具转换成树形结构的形式便于阅读,转换后的属性结构如下
最后,我们用代码预测
例如:我们修改第一行的数据,预测代码如下
oneRowX = dummyX[0, :]
newRowX = oneRowX
newRowX[0] = 0
newRowX[7] = 1
['grade=high', 'grade=low', 'grade=middle', 'time=weekend', 'time=workday_night', 'type=art', 'type=crime', 'type=love', 'type=science_fiction']
labelList:['see', 'no', 'see', 'see', 'no', 'no', 'no', 'see', 'see']
newRowX[0] = 0, 表示评分高为0
newRowX[7] = 1, 表示是love类型电影
predictedY = clf.predict([newRowX])
以上代码执行后,我们会得到predictedY为[1], 即说明此中情况下,小明会去看电影
python决策树算法_决策树算法及python实现相关推荐
- python编程基础_月隐学python第2课
python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...
- 查看Python的版本_查看当前安装Python的版本
一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...
- python构建决策引擎_决策引擎与机器学习模型的集成 | 信数这么干(一)
这是"信数这么干"之决策引擎系列专题的第1篇(该专题总计11篇,由技术篇和应用篇两大部分构成).信数这么干--决策引擎系列专题提纲 ✦ 决策引擎技术篇 -决策引擎与机器学习模型的集 ...
- python opencv手册_教你用Python实现5毛钱特效(给你的视频来点料)
一.前言 请务必看到最后.Python牛已经不是一天两天的事了,但是我开始也没想到,Python能这么牛.前段时间接触了一个批量抠图的模型库,而后在一些视频中找到灵感,觉得应该可以通过抠图的方式,给视 ...
- python并行运算库_最佳并行绘图Python库简介:“ HiPlot”
python并行运算库 HiPlot is Facebook's Python library to support visualization of high-dimensional data ta ...
- python新手难点_初学两天python的操作难点总结
已经学习两天python,将我认为的操作难点进行总结 1 在cmd下 盘与盘之间的切换 直接 D或d: 就好 2 查找当前盘或者文件下面的目录 直接 dir 3 想在一个盘下进去一个文件夹,用cd空格 ...
- python内存泄漏_诊断和修复Python中的内存泄漏
python内存泄漏 Fugue uses Python extensively throughout the Conductor and in our support tools, due to i ...
- python基本原理概论_怎样开始自学Python?
本人才疏学浅,学识大多浅尝辄止,故文章若有错误,不论是文字笔误还是理解有错,烦请您留言以告知,本人必定感激不尽! **Python分类下的系列文章,不断更新中,如果你迫不及待地想要看看写得如何可以先试 ...
- 如何提高python的运行效率_几个提升Python运行效率的方法之间的对比
在我看来,python社区分为了三个流派,分别是python 2.x组织,3.x组织和PyPy组织.这个分类基本上可以归根于类库的兼容性和速度.这篇文章将聚焦于一些通用代码的优化技巧以及编译成C后性能 ...
- python了解一下_想要精通python?19个语法了解一下!
原标题:想要精通python?19个语法了解一下! Python简单易学,但又博大精深.许多人号称精通Python,却不会写Pythonic的代码,对很多常用包的使用也并不熟悉.学海无涯,我们先来了解 ...
最新文章
- 数据告诉你,哪个省才是高考地狱模式?第一名,你想不到!
- selenium元素的定位以及操作 第二章
- 判断字符串中只含有字母和问题
- Spring MVC 下设置默认访问页面的3种方式
- vue学习笔记(WebStorm安装)
- Hadoop二次开发项目案例方案汇总
- erlang lists模块函数使用大全
- 23种设计模式(十六)接口隔离之中介者
- VirtualPC2007添加Shared Folder的方法for dos
- k8s学习:部署 PHP + Redis 留言薄
- Atitit 代码的艺术 attilax 艾提拉著作 1. 代码就像一首歌,一个文章,一个绘画	1 2. 代码就像文章	2 2.1. ,要流畅读出来,使用dsl 方法连模式	2 2.2. 段落划分与
- 测试工程师六大能力模型
- python3d旋转相册,用HTML+CSS代码制作3D旋转相册
- 安装python第三方模块包时,报错 error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C
- 零基础入门学习Python4
- RFS实例登录126邮箱/利用cookie登陆百度
- Axure RP 9格式刷使用说明【教程三】
- c语言编写程序寻找最大公约数,C程序设计编程题库
- 在太空飞船里玩狼人杀是什么体验?
- 解决关于win10下eclipse代码格式化不生效问题