决策树算法是机器学习中的经典算法

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实现相关推荐

  1. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  2. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

  3. python构建决策引擎_决策引擎与机器学习模型的集成 | 信数这么干(一)

    这是"信数这么干"之决策引擎系列专题的第1篇(该专题总计11篇,由技术篇和应用篇两大部分构成).信数这么干--决策引擎系列专题提纲 ✦ 决策引擎技术篇 -决策引擎与机器学习模型的集 ...

  4. python opencv手册_教你用Python实现5毛钱特效(给你的视频来点料)

    一.前言 请务必看到最后.Python牛已经不是一天两天的事了,但是我开始也没想到,Python能这么牛.前段时间接触了一个批量抠图的模型库,而后在一些视频中找到灵感,觉得应该可以通过抠图的方式,给视 ...

  5. python并行运算库_最佳并行绘图Python库简介:“ HiPlot”

    python并行运算库 HiPlot is Facebook's Python library to support visualization of high-dimensional data ta ...

  6. python新手难点_初学两天python的操作难点总结

    已经学习两天python,将我认为的操作难点进行总结 1 在cmd下 盘与盘之间的切换 直接 D或d: 就好 2 查找当前盘或者文件下面的目录 直接 dir 3 想在一个盘下进去一个文件夹,用cd空格 ...

  7. python内存泄漏_诊断和修复Python中的内存泄漏

    python内存泄漏 Fugue uses Python extensively throughout the Conductor and in our support tools, due to i ...

  8. python基本原理概论_怎样开始自学Python?

    本人才疏学浅,学识大多浅尝辄止,故文章若有错误,不论是文字笔误还是理解有错,烦请您留言以告知,本人必定感激不尽! **Python分类下的系列文章,不断更新中,如果你迫不及待地想要看看写得如何可以先试 ...

  9. 如何提高python的运行效率_几个提升Python运行效率的方法之间的对比

    在我看来,python社区分为了三个流派,分别是python 2.x组织,3.x组织和PyPy组织.这个分类基本上可以归根于类库的兼容性和速度.这篇文章将聚焦于一些通用代码的优化技巧以及编译成C后性能 ...

  10. python了解一下_想要精通python?19个语法了解一下!

    原标题:想要精通python?19个语法了解一下! Python简单易学,但又博大精深.许多人号称精通Python,却不会写Pythonic的代码,对很多常用包的使用也并不熟悉.学海无涯,我们先来了解 ...

最新文章

  1. 数据告诉你,哪个省才是高考地狱模式?第一名,你想不到!
  2. selenium元素的定位以及操作 第二章
  3. 判断字符串中只含有字母和问题
  4. Spring MVC 下设置默认访问页面的3种方式
  5. vue学习笔记(WebStorm安装)
  6. Hadoop二次开发项目案例方案汇总
  7. erlang lists模块函数使用大全
  8. 23种设计模式(十六)接口隔离之中介者
  9. VirtualPC2007添加Shared Folder的方法for dos
  10. k8s学习:部署 PHP + Redis 留言薄
  11. Atitit 代码的艺术 attilax 艾提拉著作 1. 代码就像一首歌,一个文章,一个绘画 1 2. 代码就像文章 2 2.1. ,要流畅读出来,使用dsl 方法连模式 2 2.2. 段落划分与
  12. 测试工程师六大能力模型
  13. python3d旋转相册,用HTML+CSS代码制作3D旋转相册
  14. 安装python第三方模块包时,报错 error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C
  15. 零基础入门学习Python4
  16. RFS实例登录126邮箱/利用cookie登陆百度
  17. Axure RP 9格式刷使用说明【教程三】
  18. c语言编写程序寻找最大公约数,C程序设计编程题库
  19. 在太空飞船里玩狼人杀是什么体验?
  20. 解决关于win10下eclipse代码格式化不生效问题

热门文章

  1. Oracle ADF和Oracle Jet一起工作。 建筑模式
  2. 现场故事:从Log4J迁移到Log4J2
  3. 借助Fargate和EKS,AWS甚至可以实现Cloud-ier和Kuberneties-ier
  4. Java Message System简介
  5. Java 8:声明接口中的私有方法和受保护的方法
  6. 在Oracle中使用JDBC插入功能
  7. 9针串口定义测试方法_一些定义–测试技术9
  8. 如何使用悲观锁定修复乐观锁定竞争条件
  9. 我的Wiki:使用JConsole对WildFly(或JBoss AS7)进行远程JMX访问
  10. Spring靴子战争包装