决策树 ID3\C4.5\CART
ID3 | C4.5 | CART | |
---|---|---|---|
特征选择 | 信息增益 | 信息增益比 | 基尼不纯度 |
连续值处理 | 只能处理离散值 | 排序后找到不同类别的分割线 | 二分 |
特征在层级之间复用 | 否 | 否 | 是 |
树形式 | 多叉 | 多叉 | 二叉树 |
剪枝 | 无 | 有 | 有 |
适用问题 | 分类 | 分类 | 分类/回归 |
-
关于特征选择方式与熵?
熵反映了信息量大小(混乱程度),熵越大信息量越大。我们的目标是熵减少方向
树模型原理
ID3
(1)计算数据集D 的经验熵 H(D)
H(D)=−K∑k=1|Ck||D|log2|Ck||D|
K 表示数据类别,Ck 表示第 k 类样本的个数
(2)计算特征 A 对数据集 D 的经验条件熵 H(D|A)
H(D|A)=n∑i=1|Di||D|H(Di)=−n∑i=1|Di|D|K∑k=1|Dk||Di|log2|Dk||Di|
Di 表示根据特征 A 划分后的数据子集
(3)计算信息增益
g(D,A)=H(D)−H(D|A)
C4.5
信息增益比
HA(D)=−∑nj=1N(Dj)N(D)log(N(Dj)N(D))gr(D,A)=g(D,A)HA(D)
其中 n
表示特征 A
取值的个数
CART
分类树
基尼不纯度(gini impurity)
gini(p)=K∑i=1pk(1−pk)=1−K∑i=1p2k
pk 表示两个第 k
类样本的数量比。
基尼不纯度的(1−pk) 相当于信息熵中log项的泰勒展开
ln(x)=(x−1)
根据特征 A
的取值a
划分两个子集(二叉)
gini(D)=1−K∑i=1(|Ck||D|)2gini(D,A)=|D1||D|gini(D1)+|D2||D|gini(D2)D1={(x,y)∈D|A(x)=a},D2=D−D1
回归树
-
回归树如何选择节点分裂方式?
使用平方误差 ∑(yi−f(xi))2
-
树模型怎么得到平方误差呢?
根据叶子节点值作为作为输出。将输入空间划分为多个单元,每个单元有一个固定输出值(对应输入空间输出值的平均)
-
具体怎么划分?
类似分类树,根据划分前后的误差选取。选取切分变量和切分点(特征及特征取值)
回归树构建流程:
-
选择切分变量
j
和切分点s
,划分子区域:R1(j,s)={x|x(j)≤s},R2(j,s)={x|x(j)>s} -
计算对应特征与特征值下的误差:
∑xi∈R1(j,s)(yi−c1)2+∑xi∈R2(j,s)(yi−c2)2其中 c1=ave(yi|xi∈R1(j,s))
-
遍历,寻找最优切分变量
j
和最优切分点s
(使平方误差最小) -
根据选定的
(j,s)
划分区域:
R1,R2,cm=1Nm∑xi∈Rm(j,s)yi,m∈{1,2} -
树创建
ID3、C4.5 多叉树
CART分类树(二叉)
CART回归树
不同树的基本创建过程只有两点不同:
- 划分节点的评价方式
- 子集的划分
references:
[1] 统计学习方法
[2] 机器学习实战
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么 .NET8线程池 容易引发线程饥饿
· golang自带的死锁检测并非银弹
· 如何做好软件架构师
· 记录一次线上服务OOM排查
· Linux实时系统Xenomai宕机问题的深度定位过程
· 2025年广告第一单,试试这款永久免费的开源BI工具
· o3 发布了,摔碎了码农的饭碗
· 用 2025 年的工具,秒杀了 2022 年的题目。
· 为什么 .NET8线程池 容易引发线程饥饿
· .NET 响应式编程 System.Reactive 系列文章(一):基础概念