python决策树算法_决策树算法及python实现

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

1.决策树(decision tree)

决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。

假设小明去看电影,影响看电影的外部因素有 时间 电影类型 评分 三个情况,目前已知的样本数据如下

63517e8aa4bd

根据以上样本数据,整理成tree形结构如下

63517e8aa4bd

2.决策树算法中熵的概念

1948年香农提出了“信息熵(entropy)”的概念

一条信息的信息量大小和它的不确定性有直接,信息量的度量就等于不确定性的多少,我们用bit(比特)来衡量信息量的多少

信息熵的计算公式如下,以log2为底,取对数,然后把每一种情况相加,当每种情况下概率相等时,取最大值,为n/2 -1 ,即变量的不确定性越大,则信息熵也越大

63517e8aa4bd

3.决策树归纳算法

策树归纳算法是J.Ross.Quinian在19世纪70年代提出的的ID3算法.

上面小明看电影实例中,总的信息量(单位为bit)为

63517e8aa4bd

同理,我们可以计算不同电影类型的信息熵,结果为0.65bits

63517e8aa4bd

此处解释下为什么根节点从电影类型开始划分,判断应该用哪个类型划分节点,可以依据如下公式判定

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的文件,可以看到文档信息如下,打开本地文件,可以看到文件结构如下

63517e8aa4bd

当然为了更加直观的查看以上部分数据结构,我们可以用Graphviz工具转换成树形结构的形式便于阅读,转换后的属性结构如下

63517e8aa4bd

最后,我们用代码预测

例如:我们修改第一行的数据,预测代码如下

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], 即说明此中情况下,小明会去看电影

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

长见识:你真的知道C语言里extern quot;Cquot; 的作用吗?

经常在C语言的头文件中看到下面的代码:#ifdef __cplusplus extern "C" { #endif// all of your legacy C code here#ifdef __cplusplus } #endif这通常用于C 和C混合编程的时候,为了防止C 的编译器在编译C文件的时候出现错误;众所周…

python自动批量发邮件脚本_Python实现自动发送邮件功能

简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件。Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。 SMTP通讯的基本流程可以概…

C语言中#if,#if defined ,#ifdef,extern的用法描述

1、#if 和#ifdef当asd_eee表达式存在而且,值为ture的时候接续向下执行例如#define TARGET_LITTLE_ENDINA 1 #define TARGET_BIG_ENDINA 0 #ifdef TARGET_LITTLE_ENDINA call little endina function #else call big endina function #endif上面的今天写的代码&…

delphi报列表索引越界怎么处理_图解Elasticsearch索引机制,此篇带你领悟新世界...

前言随着Elastic的上市,ELK不仅在互联网大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连"婚庆网站"都开始使用Elasticsearch了。随之而来的是 Elasticsearch 相关部署、框架、性能优化的文章早已铺天盖地。因…

为什么C语言函数不能返回数组,却可以返回结构体

C语言函数为什么不能返回数组?在C语言程序开发中,我们不可以编写下面这样的代码:char f(void[8]{ char ret;// ...fill... return ret; }int main(int argc, char ** argv) {char obj_a[10];obj_a f(); }不可以编写这样的代码这其实就是不能…

C语言printf()函数具体解释和安全隐患

程序员都知道,也都会使用printf函数,但你知道它也有“安全隐患”吗?下面就来举例我说说:嵌入式专栏1问题描述打印输出的数据并不是理论值,如下图(右边):嵌入式专栏2进一步描述问题请…

java map 如何根据key获得对象_ThreadLocal:Java中的影分身

关于ThreadLocal,你有哪些疑问?ThreadLocal是用来解决什么问题的?如何使用ThreadLocal?ThreadLocal的实现原理是什么?可否举几个实际项目中使用ThreadLocal的案例?基础知识ThreadLocal是线程局部变量&#…

【C语言】你可能对 sizeof() 有点误解。。。

各位,今天还是按照惯例给大家分享一个C语言容易出现的小错误,这也是跟sizeof有关的,问题虽小,却可管中窥豹,话不多说,代码先行:#include int main() { int i; i 8; printf("%d\…

nginx tcp转发_Nginx学习(九):负载均衡服务

介绍对于请求而言,负载均衡能很好的均摊请求,提高服务端吞吐率和整体性能,多个服务节点部署的方式,也提高了容灾和服务高可用。一、负载均衡分类负载均衡分为:GSLB和SLB。1. GDLB全局负载均衡,往往按照国家…

控制台发送get命令_.NET Core使用命令行参数库构建控制台应用程序

前言在我们开发中可能需要设计一次性应用程序,这些实用程序可以利用接近原始源代码的优势,但可以在与主Web应用程序完全独立的安全性上下文中启动。具体在 [管理过程](https://12factor.net/admin-processes)中也已经列出了原因。创建控制台应用打开命令…

C语言函数为什么不能返回数组?

C语言函数为什么不能返回数组?在C语言程序开发中,我们不可以编写下面这样的代码:char f(void)[8] {char ret; // ...fill... return ret; }int main(int argc, char ** argv) {char obj_a[10]; obj_a f(); }不可以编写这样的代码这其实就是不…

mockito_书评:Mockito Essentials

mockitoSujoy Acharya的Mockito Essentials副标题( Packt出版 ,2014年10月)是:“实用指南,可帮助您使用Mockito进行单元测试并开始运行。” Mockito Essentials中的前言和七章涵盖大约190个实质性页面。 前言 在序言中…

C语言中quot;##quot;的独特用法

市面上有很多比较火的编程语言,比如Python、 JAVA、 Go等,你可能觉得C语言很古老、很落后。如果你有这种想法,那可能你只是一个初学的菜鸟。可能绝大部分 C 程序员都不知道"##"隐藏用法,下面就来给大家讲讲。一、##的“…

html a标签去掉下划线_如何用HTML基本元素制作表格

第2天【HTML基本元素】主要内容标题标签段落标签强制换行水平线图片超链接文本格式化标签列表表格学习目标一、标题标题&#xff08;Heading&#xff09;是通过 <h1> - <h6> 标签进行定义的。<h1> 定义最大的标题。 <h6> 定义最小的标题。标题很重要请…

C语言中几个容易踩的“坑”!

今天给大家分享几个C语言中的坑。一、带参数的宏展开顺序#include #define f(a,b) a##b #define g(a) #a #define h(a) g(a)int main(void) {printf("%s\n",h(f(1,2)));printf("%s\n",g(f(1,2)));return 0; }运行结果:12f(1,2)浅析&#xff1a;本题中的#运…

dockerfile cd目录_使用Werf和现有的Dockerfiles改善你的CI/CD体验

迟到总比不到好。该故事讲关于我们因不支持使用常规的Dockerfile来构建镜像导致我们差点犯了一个重大错误。Werf[1]是一个GitOps工具&#xff0c;可以很好地集成到任何CI/CD系统中&#xff0c;并提供完整的应用程序生命周期管理&#xff0c;允许你&#xff1a;构建和推送镜像部…

alxc tool 报错数组超出了界限_代码审计之报错信息泄露与字符串截断

机器在语言编码转换的时候&#xff0c;经常会出现各种各样的异常&#xff0c;这些神奇的字符串就有可能组合成一堆乱码出来&#xff0c;也有可能直接把程序搞崩溃掉&#xff0c;不过总有那么一些字符&#xff0c;可以帮助我们在利用漏洞的时候变得更简单一些&#xff0c;下面我…

C语言,去你的策略模式!

前言 这里先插一点题外话&#xff0c;在C语言中&#xff0c;实现封装、继承、隐藏、多态等等特性&#xff0c;是完全没有问题的。但是在使用过程中&#xff0c;必定是不如自带这些特性的语言方便好用的&#xff0c;比如C \java等。一旦要通过C语言来实现各种设计模式&#xff0…

eager_EAGER的获取是代码的味道

eager介绍 Hibernate获取策略确实可以使几乎没有爬网的应用程序和响应Swift的应用程序有所不同。 在这篇文章中&#xff0c;我将解释为什么您应该选择基于查询的获取而不是全局获取计划。 取得101 Hibernate定义了四种关联检索策略 &#xff1a; 提取策略 描述 加入 原始S…

什么时候会是用treeset?_flex:1 到底代表什么?

今天在做项目的时候遇到一个关于布局的问题, 就是 flex: 1; 我一直以为 flex: 1; 代表的是 flex: aoto; 后来发现结果并不是这样, 所以写一篇博客来讲解一下 flex: 1; 代表什么代码第一版<div class"container"><div class"div">我是一个div&l…