本文结构:

是什么?

有什么算法?

数学原理?

编码实现算法?

1. 是什么?

简单地理解,就是根据一些 feature 进行分类,每个节点提一个问题,通过判断,将数据分为几类,再继续提问。这些问题是根据已有数据学习出来的,再投入新数据的时候,就可以根据这棵树上的问题,将数据划分到合适的叶子上。

2. 有什么算法?

常用的几种决策树算法有ID3、C4.5、CART:

ID3:选择信息熵增益最大的feature作为node,实现对数据的归纳分类。

C4.5:是ID3的一个改进,比ID3准确率高且快,可以处理连续值和有缺失值的feature。

CART:使用基尼指数的划分准则,通过在每个步骤最大限度降低不纯洁度,CART能够处理孤立点以及能够对空缺值进行处理。

3. 数学原理?

ID3: Iterative Dichotomiser 3

下面这个数据集,可以同时被上面两颗树表示,结果是一样的,而我们更倾向于选择简单的树。

那么怎样做才能使得学习到的树是最简单的呢?

下面是 ID3( Iterative Dichotomiser 3 )的算法:

例如下面数据集,哪个是最好的 Attribute?

用熵Entropy来衡量:

E(S) 是数据集S的熵

i 指每个结果,即 No,Yes的概率

E越大意味着信息越混乱,我们的目标是要让E最小。

E在0-1之间,如果P+的概率在0.5, 此时E最大,这时候说明信息对我们没有明确的意义,对分类没有帮助。

但是我们不仅仅想要变量的E最小,还想要这棵树是 well organized。

所以用到 Gain:信息增益

意思是如果我后面要用这个变量的话,它的E会减少多少。

例如下面的数据集:

先计算四个feature的熵E,及其分支的熵,然后用Gain的公式计算信息增益。

再选择Gain最大的特征是 outlook。

第一层选择出来后,各个分支再继续选择下一层,计算Gain最大的,例如分支 sunny 的下一层节点是 humidity。

详细的计算步骤可以参考这篇博文。

C4.5

ID3有个局限是对于有大量数据的feature过于敏感,C4.5是它的一个改进,通过选择最大的信息增益率 gain ratio 来选择节点。而且它可以处理连续的和有缺失值的数据。

P’ (j/p) is the proportion of elements present at the position p, taking the value of j-th test.

例如 outlook 作为第一层节点后,它有 3 个分支,分别有 5,4,5 条数据,则 SplitInfo(5,4,5) = -5/14log(5,14)-4/14log(4,14)-5/14(5,14) ,其中 log(5,14) 即为 log2(5/14)。

下面是一个有连续值和缺失值的例子:

连续值

第一步计算 Gain,除了连续值的 humudity,其他步骤和前文一样。

要计算 humudity 的 Gain 的话,先把所有值升序排列:

{65, 70, 70, 70, 75, 78, 80, 80, 80, 85, 90, 90, 95, 96}

然后把重复的去掉:

{65, 70, 75, 78, 80, 85, 90, 95, 96}

如下图所示,按区间计算 Gain,然后选择最大的 Gain (S, Humidity) = 0.102

因为 Gain(S, Outlook) = 0 .246,所以root还是outlook:

缺失值

处理有缺失值的数据时候,用下图的公式:

例如 D12 是不知道的。

计算全集和 outlook 的 info,

其中几个分支的熵如下,再计算出 outlook 的 Gain:

比较一下 ID3 和 C4.5 的准确率和时间:

accuracy :

execution time:

4. 编码实现算法?

代码可以看《机器学习实战》这本书和这篇博客。

接下来以 C4.5 的代码为例:

1. 定义数据:

1 defcreateDataSet():2 dataSet = [[0, 0, 0, 0, 'N'],3 [0, 0, 0, 1, 'N'],4 [1, 0, 0, 0, 'Y'],5 [2, 1, 0, 0, 'Y'],6 [2, 2, 1, 0, 'Y'],7 [2, 2, 1, 1, 'N'],8 [1, 2, 1, 1, 'Y']]9 labels = ['outlook', 'temperature', 'humidity', 'windy']10 return dataSet, labels

2. 计算熵:

1 defcalcShannonEnt(dataSet):2 numEntries =len(dataSet)3 labelCounts ={}4 for featVec indataSet:5 currentLabel = featVec[-1]6 if currentLabel not inlabelCounts.keys():7 labelCounts[currentLabel] =08 labelCounts[currentLabel] += 1 #数每一类各多少个, {'Y': 4, 'N': 3}

9 shannonEnt = 0.0

10 for key inlabelCounts:11 prob = float(labelCounts[key])/numEntries12 shannonEnt -= prob * log(prob, 2)13 return shannonEnt

3. 选择最大的gain ratio对应的feature:

1 defchooseBestFeatureToSplit(dataSet):2 numFeatures = len(dataSet[0]) - 1 #feature个数

3 baseEntropy = calcShannonEnt(dataSet) #整个dataset的熵

4 bestInfoGainRatio = 0.0

5 bestFeature = -1

6 for i inrange(numFeatures):7 featList = [example[i] for example in dataSet] #每个feature的list

8 uniqueVals = set(featList) #每个list的唯一值集合

9 newEntropy = 0.0

10 splitInfo = 0.0

11 for value inuniqueVals:12 subDataSet = splitDataSet(dataSet, i, value) #每个唯一值对应的剩余feature的组成子集

13 prob = len(subDataSet)/float(len(dataSet))14 newEntropy += prob *calcShannonEnt(subDataSet)15 splitInfo += -prob * log(prob, 2)16 infoGain = baseEntropy - newEntropy #这个feature的infoGain

17 if (splitInfo == 0): #fix the overflow bug

18 continue

19 infoGainRatio = infoGain / splitInfo #这个feature的infoGainRatio

20 if (infoGainRatio > bestInfoGainRatio): #选择最大的gain ratio

21 bestInfoGainRatio =infoGainRatio22 bestFeature = i #选择最大的gain ratio对应的feature

23 return bestFeature

4. 划分数据,为下一层计算准备:

1 defsplitDataSet(dataSet, axis, value):2 retDataSet =[]3 for featVec indataSet:4 if featVec[axis] == value: #只看当第i列的值=value时的item

5 reduceFeatVec = featVec[:axis] #featVec的第i列给除去

6 reduceFeatVec.extend(featVec[axis+1:])7 retDataSet.append(reduceFeatVec)8 return retDataSet

5. 多重字典构建树:

1 defcreateTree(dataSet, labels):2 classList = [example[-1] for example in dataSet] #['N', 'N', 'Y', 'Y', 'Y', 'N', 'Y']

3 if classList.count(classList[0]) ==len(classList):4 #classList所有元素都相等,即类别完全相同,停止划分

5 return classList[0] #splitDataSet(dataSet, 0, 0)此时全是N,返回N

6 if len(dataSet[0]) == 1: #[0, 0, 0, 0, 'N']

7 #遍历完所有特征时返回出现次数最多的

8 returnmajorityCnt(classList)9 bestFeat = chooseBestFeatureToSplit(dataSet) #0-> 2

10 #选择最大的gain ratio对应的feature

11 bestFeatLabel = labels[bestFeat] #outlook -> windy

12 myTree ={bestFeatLabel:{}}13 #多重字典构建树{'outlook': {0: 'N'

14 del(labels[bestFeat]) #['temperature', 'humidity', 'windy'] -> ['temperature', 'humidity']

15 featValues = [example[bestFeat] for example in dataSet] #[0, 0, 1, 2, 2, 2, 1]

16 uniqueVals =set(featValues)17 for value inuniqueVals:18 subLabels = labels[:] #['temperature', 'humidity', 'windy']

19 myTree[bestFeatLabel][value] =createTree(splitDataSet(dataSet, bestFeat, value), subLabels)20 #划分数据,为下一层计算准备

21 return myTree

6. 可视化决策树的结果:

dataSet, labels =createDataSet()

labels_tmp=labels[:]

desicionTree=createTree(dataSet, labels_tmp)

treePlotter.createPlot(desicionTree)

决策树缺失值python_【机器学习笔记之二】决策树的python实现相关推荐

  1. 机器学习笔记(二十八):高斯核函数

    凌云时刻 · 技术 导读:核函数是机器学习算法中一个重要的概念.简单来讲,核函数就是样本数据点的转换函数.这一节我们来看看应用非常广泛的一个核函数,高斯核函数. 作者 | 计缘 来源 | 凌云时刻(微 ...

  2. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(二):Python Numpy教程(2)

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

  3. 【机器学习笔记7】决策树原理及应用

    目录 构造决策树的算法 信息增益与信息增益比 熵 经验熵 条件熵 信息增益 信息增益率 关于CART算法和基尼系数 决策树的构建 ID3算法 C4.5算法 决策树的剪枝 预剪枝 后剪枝 利用sklea ...

  4. id3决策树 鸢尾花 python_机器学习之分类回归树(python实现CART)

    机器学习之分类回归树(python实现CART) 之前有文章介绍过决策树(ID3).简单回顾一下:ID3每次选取最佳特征来分割数据,这个最佳特征的判断原则是通过信息增益来实现的.按照某种特征切分数据后 ...

  5. 【机器学习笔记】【决策树】【泰坦尼克号幸存者的预测】

    目录 一.导入库以及相关的数据 1.导入所需要的库 2.导入指定的数据集 3.查看数据的相关信息 1.data.info() 2.data.head() 二.数据的预处理 1.处理数据中的空缺值 2. ...

  6. python 决策树和随机森林_【python机器学习笔记】使用决策树和随机森林预测糖尿病...

    决策树:一种有监督的机器学习分类算法,可以训练已知数据,做出对未知数据的预测. 机器学习中的分类任务殊途同归,都是要根据已知的数据特征获得最佳的分类方法.对于一个有多个特征的数据,我们需要知道根据哪些 ...

  7. 机器学习笔记(二)——特征工程

    文章目录 前言 一.数据集 概念 可用数据集 Kaggle UCI Scikit-learn 鸢尾花案例 数据集的划分 程序数据集下载 二.特征抽取 介绍 字典的特征提取 文本特征提取(英文) 中文文 ...

  8. 机器学习笔记(二)学习方法、误差与泛化能力

    目录 一.方法 (一)模型: (二)策略:(最优化问题) 1.损失函数(指标) 2.期望与均值 3.最优化问题 (三)算法 二.误差与泛化能力 1.训练误差与测试误差 2.泛化能力与泛化误差 3.过拟 ...

  9. 模式识别与机器学习笔记(二)机器学习的基础理论

    机器学习是一门对数学有很高要求的学科,在正式开始学习之前,我们需要掌握一定的数学理论,主要包括概率论.决策论.信息论. 一.极大似然估计(Maximam Likelihood Estimation,M ...

最新文章

  1. 让你的JS代码更具可读性
  2. python的100个案例_Python实例100个(基于最新Python3.7版本)
  3. linux 安装 加入内核参数,Linux 实现自动安装服务组件以及优化内核参数
  4. TypeScript 枚举指南
  5. html如何自动调整边框大小,html – Chrome与大小调整:显示中的边框:表格
  6. 信息量、信息熵、KL散度、交叉熵
  7. 特斯拉推出通用钥匙带 官方售价145元
  8. QueryRunner实战(query_update)、BeanList\BeanHandler、MapList\MapHandler、ScalarHandler
  9. Kali linux 2016.2(Rolling)中的Exploits模块详解
  10. android源码学习-Handler机制及其六个核心点
  11. 用overleaf 写 计算机学报 格式的论文
  12. 概念模型转化为逻辑模型规律
  13. Busting Frame Busting: a Study of Clickjacking Vulnerabilities on Popular Sites
  14. viper4android 2.1,viper4android fx 2.2.1.1 调解
  15. 懒虫读诗 (树形dp+分组背包)
  16. 光滑曲线_计算机图形学十:贝塞尔曲线与贝塞尔曲面
  17. 2022年中小企业上云首选,华为云省钱攻略
  18. 微信小程序顶部下拉菜单栏
  19. Word处理控件Aspose.Words功能演示:使用Java合并MS Word文档
  20. python tk下拉列表_Python 窗体(tkinter)下拉列表框(Combobox)实例

热门文章

  1. UI 实用素材|可视化后台系统UI视觉界面
  2. UI设计进阶干货|切图命名
  3. Kroneker Tensor:克罗内克张量
  4. Linux定时器:无节拍机制tickless(CONFIG_NO_HZ)
  5. 如何实现一个连接池?
  6. Linux开机自动启动软件/可执行程序方法
  7. LTE系统信息块SIB:LTE system information blocks-MIB,SIB-1,2,3,4,5,6,7,8,9,10,11
  8. Android 版本适配:9.0 Pie(API 级别 28)
  9. 队列的基本操作_算法设计:数据结构-队列
  10. php分页函数代码,PHP分页函数代码分享