决策树
1. 决策树算法核心解决的2个问题
1.1 如何选择最优划分的属性
使用不纯度划分。衡量纯度可以分信息熵和基尼值。
1.1.1 信息熵
信息熵(information entropy)是度量不纯度最常用指标。
不纯度计算是基于节点来结算,树中的每个节点都会有不纯度。
1.1 假设当前节点t中第k类样本所含比例为 p k p_k pk,则信息熵定义为:
E n t ( t ) = − ∑ k = 1 c p k l o g 2 p k Ent(t) = -\sum_{k=1}^cp_klog_2{p_k} Ent(t)=−∑k=1cpklog2pk
ps: c表示当前节点中总共有分了c类。
- Ent(t)值越小,纯度越高。
- Ent(t)最小值是0,最大值是 l o g 2 c log_2^c log2c,如果是二分类最大值则是1。
- Ent(t)越接小(接近0),表示样本分类不平衡;越大,表示样本分类平衡
1> 信息增益 ID3
假定样本集合D,其中属性a有V个可能的取值{
a
1
,
a
2
.
.
.
a
v
a^1,a^2...a^v
a1,a2...av},其中第V个分支节点包含了集合D在属性a上取值为
a
v
a^v
av的样本,记为
D
v
D^v
Dv,根据上式可以计算出
D
v
D^v
Dv的信息熵;
同时考虑到各分支节点包含的样本量不同,给予分支节点权重
∣
D
v
∣
/
∣
D
∣
|D^v|/|D|
∣Dv∣/∣D∣,于是可以算出属性a对样本集D进行划分所获得的信息增益,
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a) = Ent(D)-\sum_{v=1}^V\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)−∑v=1V∣D∣∣Dv∣Ent(Dv)
- 信息增益越大,则使用属性a划分获得的“纯度提升”越大;故使用信息增益最大的属性进行划分。
- 如果有多个属性均得到了最大的信息增益,则可任选其中之一。
2)优缺点 - 不能处理连续型变量
- 对可取值数目多的属性有所偏好
2> 增益率 C4.5
为解决信息增益对可取数目较多属性的偏好,使用“增益率”
G a i n r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain~ratio(D,a) = \frac{Gain(D,a)}{IV(a)} Gain ratio(D,a)=IV(a)Gain(D,a)
分 支 度 I V ( a ) = − ∑ v = 1 v ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ 分支度 IV(a) = -\sum_{v=1}^v\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|} 分支度IV(a)=−∑v=1v∣D∣∣Dv∣log2∣D∣∣Dv∣
-
通常属性a的取值数目越多,IV(a)值越大。
-
注意:增益率对可取数目较少的属性有所偏好
-
处理连续值:使用二分法;针对连续变量每个间隔划分为两类,分别计算gain_ratio,找出最大的gain_ratio。
故C4.5算法并不是直接选信息增益率最大的属性,而是一个启发式:先找出信息增益(Gain)高于平均水平的属性,在从中选择增益率(Gain_ratio)最高的
1.1.2 基尼值
基尼值:也是针对每个节点计算
G i n i ( t ) = ∑ k = 1 c p k ( 1 − p k ) = 1 − ∑ k = 1 c p k 2 Gini(t) = \sum_{k=1}^cp_k(1-p_k) = 1-\sum_{k=1}^cp_k^2 Gini(t)=∑k=1cpk(1−pk)=1−∑k=1cpk2
- 基尼值反映从数据集中随机抽取两个样本,其类别标记不一致的概率。
- 因此,基尼值越小,数据集纯度越高。
- 一般基尼值介于0-0.5,接近与0表明样本越不平衡;越接近0.5,样本越平衡。
1>基尼指数 CART 二叉树
G i n i i n d e x ( D , a ) = ∑ k = 1 v ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini~index(D,a) = \sum_{k=1}^v\frac{|D_v|}{|D|}Gini(D^v) Gini index(D,a)=∑k=1v∣D∣∣Dv∣Gini(Dv)
所以,选择基尼指数最小的那个属性进行划分。
1.1.3 回归树最优属性划分衡量指标
以上均是针对分类树,对于回归树(预测值为连续型变量):
- CART可用于回归树,针对每个叶子节点使用均值作为预测值,使用方差作为不纯度衡量指标
- M5-Quinlan,提出针对每个叶子节点使用线性回归预测,使用标准差做为不纯度衡量指标
方差理解:
未 分 组 样 本 方 差 : s 2 = ∑ i − 1 n ( x − x ˉ ) n − 1 未分组样本方差: s^2 = \frac{\sum_{i-1}^n(x-\bar{x})}{n-1} 未分组样本方差:s2=n−1∑i−1n(x−xˉ)
分 组 样 本 方 差 : s 2 = ∑ i − 1 k ( M i − x ˉ 2 ) f i n − 1 分组样本方差: s^2 = \frac{\sum_{i-1}^k(M_i-\bar{x}^2)f_i}{n-1} 分组样本方差:s2=n−1∑i−1k(Mi−xˉ2)fi
- 在根节点处是全部数据集,求全部的数据的均值,再用每个原数据减去均值求方差
- 当有分支时,相当于分组数据,针对每个组计算均值 x ˉ \bar{x} xˉ,每个组数据 M i M_i Mi减去其对应组的 x ˉ \bar{x} xˉ,再乘以其所在组数据所占比重 f i f_i fi。
- 选用方差下降做多的属性做划分。
sklearn中使用如下:
- mse 均方误差,叶节点使用均值预测
M S E = 1 N ∑ i = 1 n ( f i − y i ) 2 MSE = \frac{1}{N}\sum_{i=1}^n(f_i-y_i)^2 MSE=N1∑i=1n(fi−yi)2
- friedman_mse
- mae 平均绝对误差,叶节点使用中位数预测。
M A E = 1 N ∑ i = 1 n ∣ f i − y i ∣ MAE = \frac{1}{N}\sum_{i=1}^n|f_i-y_i| MAE=N1∑i=1n∣fi−yi∣
均选根据父节点与子节点额差额最大的属性作为最佳划分属性。
1.2 如何让树停止生长,防止过拟合
剪枝处理
1> 预剪枝
- 原理:指在决策树生长过程中,对每个节点在划分前进行估计,若当前节的划分不能使泛化能力提升,则停止划分并将当前节点标记为叶节点。(用验证集验证泛化能力)
- 优点:显著减少决策树的训练时间和测试时间开销,降低了过拟合风险。
- 缺点:但也有欠拟合的风险。(当前划分可能不能提高返还能力,但在其基础上进行的后续划分却有可能导致性能显著提高)
2> 后剪枝
- 原理:指先从训练集中生成一颗完整的决策树,然后自底向上地对非叶节点进行考察,如果该节点对应的子树替换为叶节点能带来泛化能力的提升,则将该子树替换成叶节点。(用验证集验证泛化能力)
- 优点:后剪枝通常比预剪枝保留更多的分支,欠拟合风险很小,有效降低过拟合风险,泛化能力优于预剪枝。
- 缺点:时间开销比预剪枝大的多。
2. 决策树在sklearn中实现
from sklearn.tree import DecisionTreeClassfier # 分类决策树
from sklearn.tree import DecisionTreeRegressor # 回归决策树
#分类树与回归树参数一致,只是分类树比回归树多了一个class_weight参数。
DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort='deprecated', ccp_alpha=0.0)
DecisionTreeRegressor(criterion='mse', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, presort='deprecated', ccp_alpha=0.0)
【参考资料】
1.西瓜书
2.菜菜的sklern课堂
3.CDA数据培训