机器学习——CRAT算法

2023-10-20 17:50
文章标签 算法 学习 机器 crat

本文主要是介绍机器学习——CRAT算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

机器学习——CRAT算法

1、CART算法引入

1.1 从ID3算法到CART算法

在之前的文章机器学习——决策树(ID3)算法,我们主要介绍了使用信息增益来构建决策树的算法。在ID3算法中,我们使用信息增益来选择特征,信息增益大的优先选择,通过信息增益的计算公式我们不难看出,信息增益的计算会涉及到大量的对数计算,计算量大,并且在计算的过程中容易丢失信息,那么我们应该如何对此进行改进呢?这里我们介绍CRAT算法,其使用基尼指数作为特征选择的评价标准,基尼指数的计算不需要对数,计算量小,并且不容易丢失信息。

1.2 基尼指数

首先,我们给出基尼指数的计算公式:
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p)=∑_{k=1}^Kp_k(1-p_k)=1-∑_{k=1}^Kp_k^2 Gini(p)=k=1Kpk(1pk)=1k=1Kpk2

我们对上面的公式进行一下解释,首先假设有K个类别,每一个类别的概率为 p k p_k pk,则整个样本集合的基尼指数为上面所示。对于基尼指数,网上流传的最为常见的理解方式是某个事件被分类错误的概率,比如某个事件 x i x_i xi属于第k类的概率为 p k p_k pk,在这个基础上被分类错误的概率就是 p k ( 1 − p k ) p_k(1-p_k) pk(1pk),则对于整个事件集合而言,其所有样本被分类错的概率就是基尼指数,基尼指数可以表示样本集合的不纯度,基尼指数越小,说明样本被分类错误的概率越小,样本集合的纯度越高,否则样本集合的纯度越低。

对于K分类问题,计算可以表示为:
G a i n ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D k ∣ ) 2 Gain(p)=∑_{k=1}^Kp_k(1-p_k)=1-∑_{k=1}^K(\frac{|C_k|}{|D_k|})^2 Gain(p)=k=1Kpk(1pk)=1k=1K(DkCk)2
其中 ∣ C k ∣ |C_k| Ck表示第k个分类的样本数量,D表示总的样本数量。

同理,对于样本D,如果根据特征A的某个值a,将样本集合D分成 D 1 D_1 D1 D 2 D_2 D2两个部分,则在特征A的条件下,D的基尼系数的表达式为:

G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)

为了进一步的简化模型,CART分类树算法每次仅仅对某个特征进行二分,而不是多分,也就是分为满足特征值和不满足特征值的两种情况

2 CART算法构建决策 树

在上面的叙述中,我们已经了解了CART算法中对于特征选择的方法,那么下面我们就来介绍如何构建一棵CART分类树。

2.1 CART分类树对于连续特征处理

在CART算法中,对于连续特征的处理方式如下,首先假设当前树节点中的样本集合D有m个样本,则对于连续特征A而言就有m个特征值。

我们首先将特征值按照从大到小的规则进行排序, a 1 , a 2 , . . . a m a_1,a_2,...a_m a1,a2,...am,则CART算法取相邻的两个特征值的中位数。,这样就获得了m-1个划分点,其中第i个划分点 T i T_i Ti表示为:
T i = a i + a i + 1 2 T_i=\frac{a_i+a_{i+1}}{2} Ti=2ai+ai+1
我们用一张图来展示一下:
在这里插入图片描述
如上图所示, a i a_i ai表示各个属性值, b i b_i bi表示各个切分点。对于这m-1个值的切分点,我们分别计算以每一个切分点作为二分类点的时候的基尼指数,选择基尼指数最最小的点作为连续特征的二分类点。分类的过程就是满足特征值的为 C 1 C_1 C1类,不满足的称为 C 2 C_2 C2类别。这样我们就对连续的特征进行了离散化,这里需要注意的是,与离散的属性不同的是,对于连续的属性,在使用其划分完一次之后并不丢弃,后续的子节点仍然需要对这个属性进行评估,如果仍然满足基尼指数最小,则仍然使用这个属性进行划分。举个例子来说:

某个属性的属性值是(1~100)的连续属性值,假设第一次我们选择了该属性,将集合划分成了(1-50)和(50-100)的集合,那么下一次划分的时候,我们仍考虑到了该属性,并且计算出来该属性的基尼指数最小,所以我们进一步可以将该属性划分成(50-75),(75-100)的两个子集。

2.2 对于离散属性的处理

CART算法与ID3算法不同的是,对于离散属性的使用不是一次就结束的,假设属性A包含三个属性值 A 1 A_1 A1, A 2 A_2 A2, A 3 A_3 A3,那么通过一次的划分可以将样本集合划分成 { A 1 } \{A_1\} {A1} { A 2 , A 3 } \{A_2,A_3\} {A2,A3} { A 2 } \{A_2\} {A2} { A 1 , A 3 } \{A_1,A_3\} {A1,A3} { A 3 } \{A_3\} {A3} { A 1 , A 2 } \{A_1,A_2\} {A1,A2}三种情况,无论是哪一种,都会有一个集合中包含两个属性值,那么在接下来的划分中,我们就可以在继续考虑对于包含两个属性值的属性A的划分,而不是丢弃这个属性。不难发现,对于离散属性A而言,其有n个取值,则可能的组合有 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1)

2.3 CART构建分类树
  1. 对于当前的数据集合D,如果样本的个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归。
  2. 计算样本集D 的基尼指数,如果基尼指数小于阈值,则返回决策子树,当前节点停止递归。
  3. 计算当前节点集合中的各个特征的各个特征值对于D的基尼指数,选择基尼指数最小的特征和对应的特征值a。根据最优属性和属性值进行划分。建立决策树的左右子节点。
  4. 递归调用1-3步生成决策树。
2.4 CART构建回归树

首先,CART回归树中对于连续值的处理方式和分类树是不同的,在分类树中,我们的目标是分类之后各个子集的基尼指数最小,但是在回归树中,我们对于连续值的处理使用的是方差的度量方式,对于某个连续属性而言,我们计算的是划分成两个集合之后,形成的子集 D 1 , D 2 D_1,D_2 D1,D2中各自集合的方差之和最小。用下面的公式表示就是:
m i n [ m i n ∑ x ∈ D 1 ( y i − C 1 ) 2 + m i n ∑ x ∈ D 2 ( y i − C 2 ) 2 ] min[min∑_{x∈D_1}(y_i-C_1)^2+min∑_{x∈D_2}(y_i-C_2)^2] min[minxD1(yiC1)2+minxD2(yiC2)2]
其中 C 1 , C 2 C_1,C_2 C1,C2分布为两个子集和的均值。我们使用p表示当前选择的属性,q表示当前属性的属性值上的切分点。则有
R 1 ( p , q ) = x ∣ x p < = q R_1(p,q)=x|x_p<=q R1(p,q)=xxp<=q
R 2 ( p , q ) = x ∣ x p > q R_2(p,q)=x|x_p>q R2(p,q)=xxp>q
R 1 R_1 R1表示左子节点的数据集, R 2 R_2 R2表示右子节点的数据集。每一个子节点均值为:
C k = 1 N ∑ x i ∈ R k ( p , q ) y , i ∈ [ 1 , N ] , k ∈ [ 1 , 2 ] C_k=\frac{1}{N}∑_{x_i∈R_k(p,q)}y,i∈[1,N],k∈[1,2] Ck=N1xiRk(p,q)yi[1,N]k[1,2]
递归的对于生成的子数据集进行上述的操作,指的满足某个阈值停止。最终将空间划分成M个子数据集, R 1 , R 2 , . . . R M R_1,R_2,...R_M R1,R2,...RM,由这些子数据集构成CART树结构。最终CART的表示式为:
f ( x ) = ∑ i = 1 K C k I ( x ∈ R k ) f(x)=∑_{i=1}^KC_kI(x∈R_k) f(x)=i=1KCkI(xRk)

3、CART剪枝

3.1、基本思想

CART采用的是后剪枝的方式,首先构建出来CRAT树,然后使用交叉验证的方式对树进行检验。在剪枝的过程中,任意时刻的子树T,其损失函数为:
C a ( T t ) = C ( T t ) + α ∣ T t ∣ C_a(T_t)=C(T_t)+α|T_t| Ca(Tt)=C(Tt)+αTt
其中α表示的是正则化的参数, ∣ T t ∣ |T_t| Tt表示的是子树的节点个数, C ( T t ) C(T_t) C(Tt)为训练数据的预测误差,一般来说,α越大,则CART树的剪枝越厉害,最优树的结构越小。

在确定损失的度量之后,我们来确定剪枝的思路:
对于任意时刻的一棵子树而言,如果其没有剪枝,则有:
C a ( T t ) = C ( T t ) + α ∣ T t ∣ C_a(T_t)=C(T_t)+α|T_t| Ca(Tt)=C(Tt)+αTt
如果将其减掉,仅仅保留根节点,则有:
C a ( T ) = C ( T ) + α C_a(T)=C(T)+α Ca(T)=C(T)+α
其中T表示当前子树的根节点。

很容易的,我们可以想到,一开始剪枝掉少量的节点的时候,会造成训练误差增大,也就是当α=0或者α很小的时候,有:
C a ( T t ) [ 没 有 剪 枝 ] < C a ( T ) [ 剪 枝 ] C_a(T_t)[没有剪枝]<C_a(T)[剪枝] Ca(Tt)[]<Ca(T)[]

随着α的不断增大,最后可能出现的时候
C a ( T t ) < C a ( T ) C_a(T_t)<C_a(T) Ca(Tt)<Ca(T)
随着α的不断增加,则一定存在一个α使得:
C a ( T t ) = C ( T t ) + α ∣ T t ∣ = C a ( T ) = C ( T ) + α C_a(T_t)=C(T_t)+α|T_t|=C_a(T)=C(T)+α Ca(Tt)=C(Tt)+αTt=Ca(T)=C(T)+α
此时可以推导出来:
C ( T t ) + α ∣ T t ∣ = C ( T ) + α C(T_t)+α|T_t|=C(T)+α C(Tt)+αTt=C(T)+α
则可以求出来:
α = C ( T ) − C ( T t ) ∣ T t ∣ − 1 α=\frac{C(T)-C(T_t)}{|T_t|-1} α=Tt1C(T)C(Tt)
并且随着α的再次增大,必然就有 C a ( T t ) > C a ( T ) C_a(T_t)>C_a(T) Ca(Tt)>Ca(T),当T和 T t T_t Tt拥有相同的损失的时候,T所拥有的节点的个数更少,所以可以进行剪枝操作。将其变成一个叶子节点T。我们对于每一个非叶子节点计算出来是否剪枝的α,如果我们把所有的叶子节点是否剪枝的阈值α都计算出来,然后对于每一个α利用交叉验证的方法进行检验,最终确定最好的α,按照最优的α进行剪枝操作。

3.2 CART算法剪枝过程
  1. 初始化α=∞,最优的子树集合{T}
  2. 从下到上开始计算各个内部积淀t的训练误差损失函数 C α ( T t ) C_α(T_t) Cα(Tt),叶子节点的个数 ∣ T t ∣ |T_t| Tt,以及正则化阈值 α = m i n C ( T ) − C ( T t ) ∣ T t ∣ − 1 α=min\frac{C(T)-C(T_t)}{|T_t|-1} α=minTt1C(T)C(Tt),更新α值。
  3. 得到所有节点的α值的集合M。
  4. 从M中选择最大的 α m a x α_{max} αmax,从上到小的访问节点,当前计算出来的值α小于等于 α m a x α_{max} αmax的时候就进行剪枝操作。得到一个最优的子树Tk。
  5. 迭代M集合,根据各个α值执行第4步,最终生成一个子树的集合W。
  6. 采用交叉验证法在最庸子树集合中选择最优的子树。

4 决策树算法总结

无论是ID3,C4.5还是CART算法,都是决策树算法的一种,都具有一些相同的有点和局限性,在这里,我们做一些总结。

4.1 优点
  1. 简单直观,算法的可解释性强。
  2. 不需要预处理,不需要归一化操作。
  3. 既可以处理离散值,也可以处理连续值(ID3算法除外)。
  4. 可以采用交叉验证来选择模型,提高泛化能力。
4.2 缺点
  1. 不使用某种剪枝策略的话,非常容易过拟合。
  2. 树结构容易因为样本的一点点变动,导致结构的发生很大的改变。
  3. 不容易找到一棵最优的决策树。
  4. 对于样本不均衡的问题,处理的比较差。

这篇关于机器学习——CRAT算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/248707

相关文章

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx