背景与原理:

决策树算法是在各种已知情况发生概率的基础上通过构成决策树来求某一事件发生概率的算法,由于这个过程画成图解之后很像一棵树形结构,因此我们把这个算法称为决策树。

而在机器学习中,决策树是一种预测模型,代表对象属性和对象值之间的一种映射,一棵决策树的每个内部节点会处理数据的某个维度对应的变量,根据这个变量的取值向下进行分支,直到走到叶节点,每个叶节点代表输入对应的一个最终输出。

决策树生成算法有很多种,比如ID3,C4.5和C5.0等,这里使用ID3实现方法。

决策树直观上很好理解,比如已知小明在晴天有空的时候去跑步的概率是90%,那么现在如果想预测小明是否会去跑步,那么我们首先观察是否是晴天,这就产生了“是晴天”和“不是晴天”两个分支,而对于“是晴天”的分支我们再观察小明是否有空,这就产生了“有空”和“没空”两个分支,最后在“有空”这个分支我们已经找到了叶节点,发现小明去跑步的概率为90%,那我们就作出预测小明会去跑步。而对于其余的分支我们需要更多信息才能做出预测。

而对于决策树而言,最重要的是要选择每个节点处理哪个属性。在上述例子中可能没有体现,我们先观察是否是晴天和先观察是否有空对整个决策过程没有影响,但是如果我们再加入一个条件“小明在没空的时候一定不会去跑步(都没空了跑什么步)”,那此时如果我们先观察是否是晴天,我们仍然需要在每个分支里都观察小明是否有空,而如果我们先观察小明是否有空,那么在小明没空的时候,我们不需要观察是否是晴天就可以作出预测:小明不会去跑步!也就是说对于“有空”这个分支,我们才需要继续向下分支,而对于“没空”这个分支,我们直接到达了叶节点——“不去跑步”!

上述分析实际上体现了“熵”的思想:严格地:对于一个有$n$个取值$x_{1},...,x_{n}$的随机变量$X$,那么定义其熵值为$H(X)=-\sum_{i=1}^{n}P(X=x_{i})\log_{b}P(X=x_{i})$,这里的$b$通常取$2,e,10$

我们说“信息”是用来消除“不确定性”的东西,而熵则是用来度量不确定性的量(比如如果一个随机变量只有一个取值,那么这个随机变量也就不再随机了,不确定性为0,其熵值也是0)。因此我们可以认为一个信息的出现如果造成的熵减越大,那么这个信息的信息量越大。

所以对一个样本集$T$,其原始的熵为$H(T)$,而当我们已知一个特征$X$的信息时,假设$X$有$n$个取值$x_{1},...,x_{n}$,我们定义条件熵$H(T|X)=\sum_{i=1}^{n}P(X=x_{i})H(T|X=x_{i})$,其中$H(T|X=x_{i})$是计算$T$在$X=x_{i}$下概率分布的熵,比如虽然原始的$T$可能有100种取值,但是当我们已知$X=x_{i}$时,$T$只会有一种取值,这样的话$H(T|X=x_{i})=0$

这样我们就可以非常自然地定义信息增益$IG(T,X)=H(T)-H(T|X)$,表示当我们引入条件$X$后消除了多少不确定性,而我们在每个节点上要选取的特征就是在当前能选取的特征中消除的不确定性最多的特征,即使$IG(T,X)$最大的$X$

代码实现:

import numpy as np
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
import graphviz data=load_iris()
X=data.data
Y=data.target X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.25) clf=DecisionTreeClassifier(criterion="entropy")
clf=clf.fit(X_train,Y_train) dot_data = tree.export_graphviz(clf,feature_names= ['f1','f2','f3','f4'],class_names=["class1","class2","class2"],filled=True,rounded=True,out_file=None)
graph = graphviz.Source(dot_data)
score_=clf.score(X_test, Y_test)
print(score_)
graph

这是对于鸢尾花数据集用决策树分类的效果,这里的决策树直接调了sklearn里的包,同时引用了graphviz包来做可视化(这个包的使用很复杂,建议在jupyter里运行上述代码,不然可视化不太容易),而score是用来衡量分类效果的,这里的score得分还不错。

小结与优化:

决策树算法的一个问题在于可能出现过拟合——如果有一个特征的取值多到了可以直接根据这个特征分支出所有的类,那么上面的算法会很高兴地建立这样的决策树,但是这样的决策树的泛化效果就会变得很差,因此在上述训练过程中,可以加入参数random_state和splitter来控制决策树的随机模式,通过合理选择模式降低对训练集的拟合,从而一定程度上提高模型的泛化性能,同样在原理层面可以把特征选取原则由信息增益变为信息增益率,通过增加一定的惩罚项减轻过拟合的问题等。

另一个问题是对于特征维度多、数据数量大的数据集决策树训练的效率不高,可以通过迭代增益、探索确定的分裂原则等手段进行优化。

python机器学习——决策树算法的更多相关文章

  1. python数据挖掘决策树算法

    决策树是一个非参数的监督式学习方法,主要用于分类和回归.算法的目标是通过推断数据特征,学习决策规则从而创建一个预测目标变量的模型.如下如所示,决策树通过一系列if-then-else 决策规则 近似估 ...

  2. 机器学习-决策树算法+代码实现(基于R语言)

    分类树(决策树)是一种十分常用的分类方法.核心任务是把数据分类到可能的对应类别. 他是一种监管学习,所谓监管学习就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,通过学习得到一个 ...

  3. python机器学习笔记 ID3决策树算法实战

    前面学习了决策树的算法原理,这里继续对代码进行深入学习,并掌握ID3的算法实践过程. ID3算法是一种贪心算法,用来构造决策树,ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性 ...

  4. 吴裕雄--天生自然python机器学习:决策树算法

    我们经常使用决策树处理分类问题’近来的调查表明决策树也是最经常使用的数据挖掘算法. 它之所以如此流行,一个很重要的原因就是使用者基本上不用了解机器学习算法,也不用深究它 是如何工作的. K-近邻算法可 ...

  5. Kaggle竞赛入门:决策树算法的Python实现

    本文翻译自kaggle learn,也就是kaggle官方最快入门kaggle竞赛的教程,强调python编程实践和数学思想(而没有涉及数学细节),笔者在不影响算法和程序理解的基础上删除了一些不必要的 ...

  6. 就是要你明白机器学习系列--决策树算法之悲观剪枝算法(PEP)

    前言 在机器学习经典算法中,决策树算法的重要性想必大家都是知道的.不管是ID3算法还是比如C4.5算法等等,都面临一个问题,就是通过直接生成的完全决策树对于训练样本来说是“过度拟合”的,说白了是太精确 ...

  7. [转]机器学习——C4.5 决策树算法学习

    1. 算法背景介绍 分类树(决策树)是一种十分常用的分类方法.它是一种监管学习,所谓监管学习说白了很简单,就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分 ...

  8. day-8 python自带库实现ID3决策树算法

    前一天,我们基于sklearn科学库实现了ID3的决策树程序,本文将基于python自带库实现ID3决策树算法. 一.代码涉及基本知识 1. 为了绘图方便,引入了一个第三方treePlotter模块进 ...

  9. 机器学习回顾篇(7):决策树算法(ID3、C4.5)

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  10. Spark机器学习(6):决策树算法

    1. 决策树基本知识 决策树就是通过一系列规则对数据进行分类的一种算法,可以分为分类树和回归树两类,分类树处理离散变量的,回归树是处理连续变量. 样本一般都有很多个特征,有的特征对分类起很大的作用,有 ...

随机推荐

  1. 一套.NET Core +WebAPI+Vue前后端分离权限框架

    今天给大家推荐一个基于.Net Core开发的企业级的前后端分离权限框架. 项目简介 这是基于.NetCore开发的.构建的简单.跨平台.前后端分离的框架.此项目代码清晰.层级分明.有着完善的权限功能 ...

  2. apk文件结构

    APK (Android Package) 文件,是一个后缀名为.apk的压缩文件,APK文件中包含了一个Android应用程序的所有内容,是Android平台用于安装应用程序的文件. assets  ...

  3. 关于WPF的圆角

    失败案例 <Border CornerRadius="3" Width="100" Height="100"> <Stac ...

  4. zabbix编译安装,安装mysql数据库:configure: error: Not found mysqlclient library

    在编译时,可能会出现题目中所示的错误,可以通过安装mysql-devel这个库解决: # yum install mysql-devel 注:如果出现"configure: error : ...

  5. Jmeter学习:常用内置函数

    常用函数一:  常用函数二: __counter 功能介绍: 生成一个计数器变量,每次使用的时候+1 __counter(false,gseq)表示所有线程共用,所有线程及迭代共享计数. __coun ...

  6. IaaS--云虚拟机(一)(何恺铎《深入浅出云计算》笔记整理)

    [概念讲解] 云虚拟机的体系结构,就是全面解耦的计算存储分离的设计思想. 传统的虚拟化,往往是对单一物理机器资源的纵向切割,计算.存储.网络等各方面的能力都是一台物理机的子集.因此,从可伸缩性的角度来 ...

  7. 国产低功耗Soc蓝牙语音遥控器芯片HS6621 /OM6621

    随着物联网技术不断发展,家用电器往智能化方向持续迭代,使用红外遥控器这种传统的互动方式已经满足不了实际的使用需求,蓝牙语音遥控器作为人机交互新载体,逐渐取代传统红外遥控器成为家居设备的标配.相比于传统 ...

  8. 【笔记】gitlab+openldap使用memberof筛选登录用户

    这几天在搞kerberos+nfs4 没搞成 之前搞了个openldap实现了分散控制集中管理(不是DCS...) gitlab和nexus也支持ldap 虽然都不咋好用 但是在搞gitlab的时候发 ...

  9. Twenty-seven

    侦听器 watch侦听器 watch侦听器允许开发者监视数据 的变化,从而针对数据的变化做特定的操作 语法如下 侦听器的格式 1.方法格式的侦听器 缺点:无法在所进入页面的时候,自动触发!!!     ...

  10. yaml 文件的读取写

    yaml 是一种数据格式, 它可以和json数据相互转化 . 自动化测试中一般用于做配置文件或是测试用例. 数据的组成, 两种格式: 1. 字典 2. 列表 Eg. config.yaml serve ...