本文章只基于Numpy库实现决策树(但是有更好的方法)
决策数是一种应用广泛的归纳推理算法,在分类问题中,决策树算法基于特征对样本进行分类,构成一颗包含一系列if-then规则的树,在数学上可以将这棵树解释为定义在特征空间与类空上的条件概率分布。决策树的主要优点是分类速度快,健壮性好(训练数据可包含错误),模型具有可读性,目前已被成功应用到医疗诊断,贷款风险哦评估等领域
这一章我们将使用著名的 I D 3 ID3 ID3 算法构建决策树
3.1决策树模型
- 我们通过一个经典例子来了解决策树模型
假设你有一位和你一样热爱打网球的朋友,尽管他对打网球有足够的兴趣,但他 对什么天气打网球却非常在意。你每次约他打球,他总要根据当时的天气情况决定是 否去玩。
图3-1所示的表格为你在各种天气下约他打球的历史记录,其中包含4 项天 气指标以及是否去打球了。
在你今天约他打球之前,我们可以利用以上数据(“天气”为特征丨“是否去玩” 为类标记)构建出如图3-2所示的一棵决策树,再根据今天的天气情况判断他是否会 i打球。
Day | Outlook | Temperature | Humidity | Wind | PlayTennis |
---|---|---|---|---|---|
D1 | Sunny | Hot | High | Weak | No |
D2 | Sunny | Hot | High | Strong | No |
D3 | Overcast | Hot | High | Weak | Yes |
D4 | Rain | Mild | High | Weak | Yes |
D5 | Rain | Cool | Normal | Weak | Yes |
D6 | Rain | Cool | Normal | Strong | No |
D7 | Overcast | Cool | Normal | Strong | Yes |
D8 | Sunny | Mild | High | Weak | No |
D9 | Sunny | Cool | Normal | Weak | Yes |
D10 | Rain | Mild | Normal | Weak | Yes |
D11 | Sunny | Mild | Normal | Strong | Yes |
D12 | Overcast | Mild | High | Strong | Yes |
D13 | Overcast | Hot | Normal | Weak | Yes |
D1 | Rain | Mild | High | Strong | No |
图3-1
图3-2
可以看出,一棵决策树是由节点(Node)和有向边(Directed Edge)构成的,其中节点有两类:内部节点(Internal Node)和叶节点(Leaf Node)。内部节点表示某 一特征,叶节点表示某一分类标记。
决策树对实例进行分类时,从树根节点开始递归执行以下过程:
-
(1)若当前节点为内部节点,则根据样本对应特征的值移动到当前节点的某个
子节点。 -
(2)若当前节点为内部节点,则返回叶节点所表示的分类标记,分类过程结束。
通过以上例子可以看出,决策树的决策过程就像是执行一个包含一系列嵌套if-then语句 的算法,该算法并不是手写,而是根据训练样本自动生成的。
3.2生成决策树
概念
决策树本质上是从训练数据集中归纳出来的一组分类规则,与训练数据不矛盾(对所有数据都能做出正确分类)的决策树可能有多个,也有可能没有,我们需要做的是找到一颗与训练数据矛盾较小的,泛化能力较强的决策树。
方法
决策树的构造方法,其输入输出如下:
输入:训练数据集 D D D,特征集合 A A A
输出:决策树(或子树)
基本的决策树算法为递归算法,流程如下:
(1)如果当数据集 D D D中所有样本属于同一类,则
- 创建叶节点,节点的值为唯一的类标记。
(2) 如果当前特征集 A = ϕ A=\phi A=ϕ
- 创建叶节点,节点的值为数据集D中出现最多的类标记。
(3)否则
- 创建内部节点,节点的值为数据集D中出现最多的类标记。
- 从特征集合A中以某种规则(特征选择)抽取一个特征 a i a_i ai,在根据该特征的值切分当前数据集D,得到数据子集 D 1 , D 2 , … … , D k D_1,D_2,……,D_k D1,D2,……,Dk.
- 使用 k k k个数据子集 D 1 , D 2 , … … , D k D_1,D_2,……,D_k D1,D2,……,Dk以及特征子集 A − a i A-{a_i} A−ai递归调用决策树构造方法,创建 k k k个子树。
- 将当前内部节点作为 k k k个子树的父节点。
大致了解上面的算法流程后,大家可能会提出新的疑问:在创建内部节点时,应
使用怎样的原则选择用于切分数据集的特征(例如,为什么先以特征“阴睛”建立节
点,而不是特征“湿度”呢)?下一节内容将解答这个问题。
3.3切分特征的选择
选择切分特征时,应选择最有助于分类的特征,即按照这个特征将当前数据集进
行切分,能使得各个数据子集的样本尽可能属于同一类别,也就是尽量提高各数据子
集的纯度(Purity),降低不确定性。
在概率统计与信息论中,用信息灯(Information Entropy)来度量随机变量的不
确定性。在使用一个特征切分数据集后,用信息增益(Information Gain)或信息增益
比(Information Gain Ratio)来量化分类不确定性降低的程度。下面我们来学习这些
概念。
3.3.1信息熵
设X为一个可取有限个值 { x 1 x_1 x1, x 2 x_2 x2,…, x n x_n xn}的离散随机变量,其概率分布为:
P i = P ( X = x i ) {P_i=P(X=x_i)} Pi=P(X=xi)
则随机变量X的信息灯定义为:
H ( x ) = − ∑ i = 1 n P i ⋅ l o g P i { H(x)=-\sum_{i=1}^n{P_i}{\cdot }logP_i} H(x)=−∑i=1nPi⋅logPi
上式中,对数 l o g log log 以2为底时,熵的单位为比特(bit),以自然对数 e e e为底
时,熵的单位为纳特(nat)。另外,如果 p i = 0 {p_i=0} pi=0,则定义 0 l o g 0 = 0 0 log 0 = 0 0log0=0,信息熵值越大, 表示不确定性越强。
举一个例子,投挪某硬币,朝上的面为随机变量X,其中正面朝上的概率为P. 反面朝上的概率则为1-p。
根据定义,X的信息熵为:
H ( X ) = − p l o g 2 p − ( 1 − p ) l o g 2 ( 1 − p ) { H(X)=-plog2p-(1-p)log2(1-p)} H(X)=−plog2p−(1−p)log2(1−p)
信息熵H(X)随概率P变化的曲线如图所示。
图3-3
画图源码:
import numpy as np
import matplotlib.pyplot as plot
p=np.linspace(0,1,100)
def H(p):
return -p*np.log2(p)-(1-p)*np.log2(1-p)
title="information Entery"
ax=plot.figure(dpi=400)
plot.grid