背景与原理:

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

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

决策树生成算法有很多种,比如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. echarts柱状图快速上手笔记地址

    https://blog.csdn.net/qq_40323256/article/details/114890628 借鉴借鉴

  2. 实验1task5

    <实验结论> #include <stdio.h> #include <stdlib.h> int main() { float a,b,c; printf(&qu ...

  3. 用有限差分估计(Finite Difference Estimate)解决地理坐标与平面像素坐标转换过程的误差造成风场粒子向量失真问题

    下载NCEP的气象场grib2数据,风场是二维的向量,包含u和v两个分量.这个用经纬度投影到像素坐标会产生误差,直接绘制效果不太对:(   通过插值计算得到风场粒子的预测数据wind = interp ...

  4. 面试之CAS

    1.CAS(Compare And Swap)比较并替换,是线程并发运行时用到的一种技术或者算法,CAS与之对应的是一些锁技术,,例如synconozied,同事这种比较替换的思想也可以运用到数据库上 ...

  5. kafka日志数据清理策略

    vim /kafka/server.properties # 日志清理策略优先级是谁先满足条件. # 保留7天的日志数据 log.retention.hours=168 # 日志数据总大小保留100G ...

  6. HTML基础知道了解

    第1章 Html介绍 1.Html和CSS的关系 1.1 学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1.2 HT ...

  7. C# Linq将DataTable中的某列转换成数组或者List

    // 获取到的数据 DataTable picDt = GetPdmPoroductModelPictureData(productModelCode); // 将productCode列转数组 st ...

  8. C# 调用LDAP接口获取域用户信息

    C# 调用LDAP接口获取域用户信息: 根据用户显示名称和邮箱的前半部分,拉去相应的用户列表,进行智能提示. web 的提示控件可以用select2. using System; using Syst ...

  9. win10事件查看器出现10016错误的解决办法

    该错误一般会重复出现在事件查看器,严重的会导致系统卡死. 以解决下列错误为例,给出步骤: 注意记录用户(划掉的部分)及要添加的权限(本例为"本地激活"权限) 1.运行regedit ...

  10. vue 祖孙传值