[ML]在不使用package的情况下撰写决策树程式码
[ML]在不使用package的情况下撰写决策树程式码
前言
网路上的决策树教学大多都是教决策树的大概念与何呼叫API,却没有详细说明决策树的拟合是怎么进行的。
我认为要彻底了解程式码的最好方式,就是实际撰写一遍。因此本文会在不呼叫API的情况下,撰写出一个能够进行拟合、预测的决策树程式码,并将此程式码提供给读者自行把玩。
什么是决策树
决策树的英文为decision tree,因为它就是由一连串的决策(如同if else)组成,并且结构像树一样。
决策树是一种supervised learning(监督式学习),并且可以应用于classification或regression, 本文会针对classification进行说明 。
决策树中的nodes可以被区分为以下两种:
- 内部节点:
Internal nodes中有决策,用来对输入进行预测/分类。 - 叶节点:
Leaf nodes不做任何决策。若有资料经过决策(internal nodes)后分类到leaf nodes,Leaf nodes会给这笔资料一个预测数值/分类结果。
背景
在讲解演算法与程式码之前,我先说明一些等等会使用到的名词与意义:
资讯量
通常决策树会使用Shannon entropy(熵)或者Gini impurity(吉尼不纯度)来作为资讯量的计算。在此不细讲计算方式,我们只需要知道所有可能发生的结果若 机率分布较为平均、分散 的话,会有 较高的资讯量 。反之,若 机率分布较为集中 的话,会有 较低的资讯量 。
怎样算是机率分布平均、分散?
以掷硬币为例,掷硬币的两种可能结果(正面与反面)的机率都是50%,没有其中一个机率比较高,这就是机率分布平均、分散。
反之,以买乐透为例,若只将结果分为中奖与没中奖两种的话(撇除中大奖与小奖的情况),中奖的机率会远远小于没中奖的机率,这就是机率分布集中。
信息增益
以下文字说明来自维基百科:
一般而言,期望的信息增益是信息熵的减少 ** 这** 从先前状态到接受给定信息的状态:
在哪里 ** H(T|a)** 是条件熵 ** 吨** 给定属性的值 ** 一个** .
看起来很复杂,接下来我一个一个解释里面的每个符号与意义。
- 吨 代表随机变数
- H() 代表资讯量
- H T) 代表在随机变数 吨 之下的资讯量
- H(T|a) 代表随机变数 吨 在条件 一个 之下的资讯量
- 胃肠道(T,a) 代表在条件 一个 之下,能够 获得 的资讯量
若是以树的资料结构来看的话, H T) 代表父节点的资讯量,而 H(T|a) 代表被决策 一个 的分割后的所有子节点的资讯量加总。而information gain 胃肠道(T,a) 代表进行决策 一个 所带来的资讯量。
Information gain的公式與意義
简单的说,我们希望 H(T|a) (也就是经过决策后的资讯量)越少越好,因为这样代表决策 一个 能够获得较多的资讯。而机率分布越不平均、越集中,资讯量越低。因此我们希望经过决策后机率分布会越集中。
藉由information gain,我们可以分析决策 一个 是否能够有效的区分预测结果。
演算法
本文会以不呼叫package的方式实现决策树程式码,以利读者了解实际决策树的拟合是如何实现的。
决策树是一种贪婪演算法(greedy algorithm),拟合时会利用递回的方式,每次增加一个拥有最大information gain的节点。简略流程如下:
- 确认是否还要继续增加节点(为了避免overfitting,当决策树的深度过深或者样本数过少可以停止增加节点)。若不继续增加节点则完成拟合。
- 若要增加节点的话,则选出一个information gain最大(最能够让分割后的资料机率分布越集中)的分割分方式。
程式码
Kaggle是一个数据分析的竞赛平台,同时他也提供了线上撰写/编辑程式码的环境,基本的packages如numpy、pandas也都安装好了。
点击上方连结并且点选Copy & Edit(见下图)就可以进入编写环境了。可以自己研究一下程式码,并尝试修改参数把玩一下。
點進連結後的畫面
总结
若了解了决策树的程式码后,可以参考scikit-learn这个package提供的API。会更能够了解各个参数的意义。 连结请点我
参考
[Youtube]Python 中的决策树分类(从零开始!)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明