【机器学习】决策树算法原理详解

决策树

1 概述

1.1 定义

决策树是一种解决分类问题的算法,决策树算法采用树形结构,使用层层推理来实现最终的分类。

决策树即可以做分类,也可以做回归。它主要分为两种:分类树回归树

1.2 决策树算法

  • 第一个决策树算法: CLS (Concept Learning System)
  • 使决策树受到关注、成为机器学习主流技术的算法: ID3
  • 最常用的决策树算法: C4.5
  • 可以用于回归任务的决策树算法: CART (Classification and Regression Tree)
  • 基于决策树的最强大算法: RF (Random Forest)

1.3 结构

决策树由下面几种元素构成:

  • 根节点:包含样本的全集(全部训练数据)
  • 内部节点:对应特征属性测试
  • 叶节点:代表决策的结果

决策树学习的目的是为了产生一棵泛化能力强的决策树

2 决策树构建

2.1 构建过程

整体策略:自上而下分而治之

决策树的构建过程就是一个自根至叶的递归过程 , 在每个中间结点寻找一个划分属性。

大致过程:

  • 开始:构建根节点,所有训练数据都放在根节点,选择x个最优特征,按着这一特征将训练数据集分割成子集,进入子节点。
  • 所有子集按内部节点的属性递归地进行分割。
  • 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去。
  • 每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。

递归的三种停止条件:

  • 当前结点包含的样本全属于同一类别,无需划分;
  • 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;
  • 当前结点包含的样本集合为空,不能划分。

2.2 特征选择

信息熵 :随机变量的不确定性。
H ( X ) = − ∑ p i l o g 2 p i i = 1, 2, ..., n H(X) = - \sum p_i log_2 p_i \hspace{2em} \text{i = 1, 2, ..., n} H(X)=−∑pilog2pii = 1, 2, ..., n

例:

A集合 [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 ] [1, 1, 1, 1, 1, 1, 1, 1, 2, 2] [1,1,1,1,1,1,1,1,2,2]

B集合 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 ] [1, 2, 3, 4, 5, 6, 7, 8, 9, 1] [1,2,3,4,5,6,7,8,9,1]

A集合熵值低于B集合熵值,因为A集合中只有两种类别,B集合中类别比较多(结构比较乱),熵值就会比较大

信息增益: 表示特征X使得类Y的不确定性减少的程度(熵值减少),即当前划分对信息熵所造成的变化。

信息增益越大,表示特征a来划分所减少的熵最大,即提升最大,应当作为根节点。

3 决策树算法

3.1 ID3(信息增益)

下面是基于信息增益的ID3算法的实例:

我们有14天的数据,4个特征条件:天气,温度,湿度,是否有风。最终结果是去玩不玩。

上面有四种划分方式,我们需要判断谁来当根节点,根据的主要就是信息增益这个指标。下面计算信息增益来判断根节点。

本例暂且以ent(a, b)代表以下含义:(只有两种结果的时候的熵值计算)

python 复制代码
from math import log2
def ent(a, b):
    tot = a + b
    x, y = a / tot, b / tot
    return -(x * log2(x) + y * log2(y))

总的数据中,9天玩,5天不玩,熵值为:
− 9 14 l o g 2 9 14 − 5 14 l o g 2 5 14 = 0.940 -\frac{9}{14}log_2 \frac{9}{14} - \frac{5}{14}log_2 \frac{5}{14} = 0.940 −149log2149−145log2145=0.940

然后对4个特征逐个分析:

  • outlook

    • outlook = sunny时,熵值为0.971,取值为sunny的概率为 5 14 \frac{5}{14} 145
    • outlook = overcast时,熵值为0,取值为overcast的概率为 4 14 \frac{4}{14} 144
    • outlook = rainy时,熵值为0.971,取值为rainy的概率为 5 14 \frac{5}{14} 145

    熵值为:
    5 14 × 0.971 + 4 14 × 0 + 5 14 × 0.971 = 0.693 \frac{5}{14} \times 0.971 + \frac{4}{14} \times 0 + \frac{5}{14} \times 0.971 = 0.693 145×0.971+144×0+145×0.971=0.693

    信息增益:系统熵值从0.940下降到0.693,增益为0.247。

  • temperture

    • temperture = hot时,熵值为1.0(ent(2, 2)),取值为hot的概率为 4 14 \frac{4}{14} 144
    • temperture = mild时,熵值为0.918(ent(4, 2)),取值为mild的概率为 6 14 \frac{6}{14} 146
    • temperture = cool时,熵值为0.81(ent(3,1)),取值为cool的概率为 4 14 \frac{4}{14} 144

    熵值为:
    4 14 × 1.0 + 6 14 × 0.918 + 4 14 × 0.81 = 0.911 \frac{4}{14} \times 1.0 + \frac{6}{14} \times 0.918 + \frac{4}{14} \times 0.81 = 0.911 144×1.0+146×0.918+144×0.81=0.911

    信息增益: G a i n ( S , t e m p e r t u r e ) = 0.940 − 0.911 = 0.029 Gain(S, temperture) = 0.940 - 0.911 = 0.029 Gain(S,temperture)=0.940−0.911=0.029

  • 其他特征按照相同方法来做得到:

G a i n ( S , O u t l o o k ) = 0.247 G a i n ( S , H u m i d i t y ) = 0.151 G a i n ( S , W i n d ) = 0.048 G a i n ( S , T e m p e r a t u r e ) = 0.029 Gain(S,Outlook)=0.247 \\ Gain(S, Humidity)=0.151 \\ Gain(S, Wind)=0 .048 \\ Gain(S,Temperature)=0 .029 Gain(S,Outlook)=0.247Gain(S,Humidity)=0.151Gain(S,Wind)=0.048Gain(S,Temperature)=0.029

计算出所有的信息增益之后,选择有最大的信息增益的特征作为根节点。

下面找Sunny分支的决策树划分:

总的熵值
− 2 5 × l o g 2 ( 2 5 ) − 3 5 l o g 2 ( 3 5 ) = 0.97 -\frac{2}{5} \times log_2(\frac{2}{5}) - \frac{3}{5}log_2(\frac{3}{5}) = 0.97 −52×log2(52)−53log2(53)=0.97

以剩下的三个特征进行分析:

  • temperture

    • temperture=hot,熵值为0,概率为 2 5 \frac{2}{5} 52
    • temperture=mild,熵值为1.0,概率为 2 5 \frac{2}{5} 52
    • temperture=cool,熵值为0,概率为 1 5 \frac{1}{5} 51

    熵值为 2 5 \frac{2}{5} 52

    信息增益: 0.97 − 0.4 = 0.57 0.97-0.4 = 0.57 0.97−0.4=0.57

  • humidy

    • high,熵值为0,概率为 3 5 \frac{3}{5} 53
    • normal,熵值为1,概率为 2 5 \frac{2}{5} 52

    熵值为 2 5 \frac{2}{5} 52

    信息增益: 0.97 − 0.4 = 0.57 0.97 - 0.4 = 0.57 0.97−0.4=0.57

  • windy

    • false,熵值为0.918,概率为 3 5 \frac{3}{5} 53
    • true,熵值为1,概率为 2 5 \frac{2}{5} 52

    熵值为 0.951 0.951 0.951

    信息增益: 0.97 − 0.95 = 0.02 0.97 - 0.95 = 0.02 0.97−0.95=0.02

故选择humidy或wind划分

剩下的划分同理,最终决策树为

3.2 C4.5(信息增益率)

基于信息增益的决策树算法会有哪些问题:

如果有一个特征:id,代表样本的编号,以上述数据为例,id为从1到14,如果计算id特征的根节点,发现信息增益是最大的,因为每一个子节点的信息熵值都为0。

信息增益率:(解决了ID3的问题,考虑自身熵,信息增益除以自身熵)
G H ( x ) G:信息增益, H(x):熵值 \frac{G}{H(x)} \hspace{2em} \text{G:信息增益, H(x):熵值} H(x)GG:信息增益, H(x):熵值

3.3 CART(GINI系数)

使用基尼系数作为衡量标准。
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p) = \sum \limits _{k = 1}^K p_k (1 - p_k) = 1 - \sum \limits _{k = 1}^K p_k^2 Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2

3 决策树剪枝

3.1 预剪枝

在建立决策树边的时候进行剪枝的操作,比较使用实用。

剪枝策略:

  • 限制深度
  • 限制叶子结点个数
  • 限制叶子结点样本数
  • 限制信息增益量等。

3.2 后剪枝

建立完决策树后进行剪枝操作。

4 连续值和缺失值处理

  • 连续值属性可取数值不是有限的,不能根据连续树形的可取值对节点进行划分。常见做法是:二分法对其进行离散化。

  • 现实应用中,经常会遇到属性值缺失现象仅使用无缺失的样例,这是对数据的极大浪费使用带缺失值的样例,需解决:

    • 如何进行划分属性选择?
    • 给定划分属性,若样本在该属性上的值缺失,如何进行划分?

    基本思路:样本赋权,权重划分

集成算法

1 概述

集成算法:Ensemble Learning

Bagging:训练多个分类器取平均
f ( x ) = 1 M ∑ m = 1 M f m ( x ) f(x) = \frac{1}{M} \sum \limits_{m = 1}^M f_m(x) f(x)=M1m=1∑Mfm(x)

Boosting:从弱学习器开始加强,通过加权来训练。
F m ( x ) = F m − 1 ( x ) + a r g m i n h ∑ i = 1 n L ( y i , F m − 1 ( x i ) + h ( x i ) ) F_m(x) = F_{m - 1}(x) + argmin_h \sum \limits_{i = 1}^n L(y_i, F_{m - 1}(x_i) + h(x_i)) Fm(x)=Fm−1(x)+argminhi=1∑nL(yi,Fm−1(xi)+h(xi))

Stacking:聚合多个分类或回归模型。

2 Bagging模型-随机森林

其实就是并行训练一堆分类器(每个分类器互相独立)。典型代表为随机森林(多个决策树并行放在一起)。

随机指的是:数据随机采样,特征随机选择

每个分类器喂的数据随机,数据的特征数随机。二重随机性,会让每个树基本都不一样,最终的结果也不一样。

随机森林优势:

  • 可以处理高维度(feature多)数据,不用做特征选择
  • 训练完之后,可以给出那些feature比较重要
  • 容易做成并行化方法,速度快
  • 可以进行可视化展示,便于分析

3 Boosting模型

提升模型典型代表:AdaBoost,XgBoost

AdaBoost:会根据前一次的分类效果调整数据权重

4 Stacking模型

堆叠模型:可以堆叠各种各样的分类器(KNN,SVM,RF等)

分阶段进行:第一阶段得出各自的结果,第二阶段再利用前一阶段结果进行训练。

相关推荐
XiaoLeisj2 分钟前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
IT古董21 分钟前
【漫话机器学习系列】017.大O算法(Big-O Notation)
人工智能·机器学习
Jasmine_llq22 分钟前
《 火星人 》
算法·青少年编程·c#
闻缺陷则喜何志丹33 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
海棠AI实验室1 小时前
AI的进阶之路:从机器学习到深度学习的演变(三)
人工智能·深度学习·机器学习
Lenyiin1 小时前
01.02、判定是否互为字符重排
算法·leetcode
鸽鸽程序猿1 小时前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript