【Machine Learning】笔记(3)
决策树(Decision Tree)
用于分类问题
模型概述
根节点、决策节点中包含各个待判断的输入特征(例如耳形、头形),叶节点为模型输出的最终结果(例如猫、不是猫)。直观上理解可视为“if语句”的条件选择结构。
此处输入特征也都为布尔量(例如头形是圆的、不是圆的)。
学习过程
对于给定任务,可以使用多种决策树模型,需要通过学习获得性能最好的一种。
学习过程需要确定各输入特征放在决策树模型的哪个节点中,以及合适终止分类。
输入特征放置的优先级应使得经过该节点分类后的分支具有最高的"纯度"。换句话说,那一项输入特征最具有决定性作用,则其应该更靠近根节点。依此能增加分类效率。
以下任一情况中可将节点设置为叶节点(终止分类),即停止条件为:
- 分类结果纯度已达100%
- 已达树最大 深度(又可称跳数,从根节点到该节点所需时间,根节点深度为0)
限制深度能使模型不会变得过大和笨重,同时能缓解过拟合问题。 - 分类结果剩余样本数低于阈值
- 拆分 信息增益 小于阈值
纯度
熵是衡量一组样本纯度的指标。
P
P
P为样本中某一类样本与所有样本的比例,则熵
H
(
P
)
H(P)
H(P)如下:
H
(
P
)
=
−
P
log
2
(
P
)
−
(
1
−
P
)
log
2
(
1
−
P
)
H(P)=-P\log_2(P)-(1-P)\log_2(1-P)
H(P)=−Plog2(P)−(1−P)log2(1−P)
令
H
(
0
)
=
H
(
1
)
=
0
H(0)=H(1)=0
H(0)=H(1)=0;
H
(
P
)
H(P)
H(P)越高则样本纯度越低。
当
P
P
P越接近0.5,
H
(
P
)
H(P)
H(P)越高,
P
=
0.5
P=0.5
P=0.5时
H
(
P
)
=
1
H(P)=1
H(P)=1;
当
P
P
P越接近0或1,
H
(
P
)
H(P)
H(P)越低,
P
=
0
P=0
P=0或
P
=
1
P=1
P=1时
H
(
P
)
=
0
H(P)=0
H(P)=0。
信息增益(information gain)
在构建决策树时,在节点上拆分哪项输入特征将取决于哪项特征能最小化熵/最大化纯度。熵的减少被称为信息增益,用于衡量该节点的拆分效果。
如上,节点拆分一项输入特征并将样本分为A、B两组。则类a在A、B两组中比例分别为:
{
P
1
=
a
A
P
2
=
a
B
\left\{\begin{matrix} P_1= \frac{a}{A}\\ P_2= \frac{a}{B} \end{matrix}\right.
{P1=AaP2=Ba
则加权平均熵
H
ˉ
\bar{H}
Hˉ为:
H
ˉ
=
A
A
+
B
H
(
P
1
)
+
B
A
+
B
H
(
P
2
)
\bar{H}=\frac{A}{A+B}H(P_1)+\frac{B}{A+B}H(P_2)
Hˉ=A+BAH(P1)+A+BBH(P2)
对于原始样本(未经过拆分),计算可知其熵
H
H
H,则对于该节点将选择拆分信息增益最大,即
H
−
H
ˉ
H-\bar{H}
H−Hˉ最大的一项
完整过程
- 计算类a在原始样本的熵 H H H;
- 计算拆分各输入特征对应的信息增益 H − H ˉ H-\bar{H} H−Hˉ并选择其中最大项;
- 依据选择的输入特征将样本拆分为左、右两支;
- 在各支上反复进行2、3步操作,直至满足停止条件。
上述过程为递归算法,即在根节点构建决策树的方法是在其左、右两支构建更小的决策树。
改进方法
独热编码(one-hot encoding)
在上述例子中,输入特征为布尔类型,对于输入特征为两种以上离散值的情况,可利用独热编码。
若一个输入特征可取
k
k
k个可能的值,则利用
k
k
k个二进制数表示该特征,每个特征之和为1
例如输入特征为形状,其值包括正方形、椭圆形、六边形、三角形,则可表示为:
正方形:[1,0,0,0]
椭圆形:[0,1,0,0]
六边形:[0,0,1,0]
三角形:[0,0,0,1]
该方法同样适用于神经网络模型。
连续数阈值
对于输入特征为连续数值的情况,可利用阈值进行样本拆分。
若一个输入特征取值位于 [ a , b ] [a, b] [a,b],则设置阈值 c c c并根据该输入特征将样本分为两组。对于 c c c的选择可尝试多次不同的取值,选择其中信息增益最大的为最终阈值 d d d。若此时该信息增益大于依据其他输入特征拆分所得信息增益,则令该节点对该输入特征依据阈值 d d d进行拆分
决策树集
使用单个决策树可能存在对数据的微小变化高度敏感的问题,例如某个样本的不同将导致信息增益不同,最终导致该节点选择不同的输入特征作为拆分依据。
为解决该问题,考虑使用决策树集。其思想为利用多个不同决策树做出的判断,综合考虑从而获得更可信的结果,即增加模型鲁棒性。
袋装决策树(bagged decision tree)
对于原始样本集,利用有放回抽样获得多个与原始样本集大小一致的随机样本集
根据
n
n
n个随机样本集,分别建立
n
n
n个决策树,由此获得了
n
n
n个决策树构成的决策树集。综合
n
n
n个决策树的输出结果,得到模型最终的输出结果。
模型的性能不会随着
n
n
n的增大而一直变好,因此
n
n
n的选取并非越大越好。
随机森林(random forest)
袋装决策树中不同随机样本集各自生成的决策树节点可能依然选择同样的输入特征作为拆分依据,故做以下改进:
若共有
i
i
i个输入特征,每个决策树只随机选用其中
j
(
j
<
i
)
j(j<i)
j(j<i)个作为拆分依据。通常选取
j
=
i
j=\sqrt{i}
j=i
由此使决策树更具随机性,模型更具鲁棒性。
增强决策树(boosted decision tree)/XGBoost
与袋装决策树获得随机样本集不同的是,从原始样本中随机抽取各样本的概率并非一致,而是有更大概率选中到目前为止生成的决策树集仍误分类的样本。即特意挑选“错题”作为新的决策树生成的训练数据。
同样构建
n
n
n个决策树,其中第
n
n
n个决策树构建时依据的随机样本集有更大概率抽中由第
1
,
2
,
.
.
.
,
n
−
1
1,2,...,n-1
1,2,...,n−1个决策树构成的决策树集误分类的样本。
使用最广泛的增强决策树的开源实现是XGBoost(极端梯度增强),其:
- 有默认拆分标准和停止条件
- 内置正则化以防止过拟合
from xgboost import XGBClassifier
model = XGBClassifier()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
回归树(Regression Tree)
用于回归问题,为决策树的推广
类似决策树,模型将依据各输入特征将样本拆分,区别在于样本标签不是类别而是数值,即最终叶节点的输出将不是类别而是模型预测的数值。
不同于决策树利用信息增益选择依据哪项输入特征对样本进行拆分,回归树利用拆分后组内样本标签方差。
如上,节点拆分一项输入特征并将样本分为A、B两组。A、B两组中样本标签分别为:
a
1
,
a
2
,
.
.
.
,
a
n
a_1,a_2,...,a_n
a1,a2,...,an;
b
1
,
b
2
,
.
.
.
,
b
n
b_1,b_2,...,b_n
b1,b2,...,bn。
计算A、B组内方差分别为
V
A
V_A
VA、
V
B
V_B
VB
则加权平均方差为:
V
ˉ
=
A
A
+
B
V
A
+
B
A
+
B
V
B
\bar{V}=\frac{A}{A+B}V_A+\frac{B}{A+B}V_B
Vˉ=A+BAVA+A+BBVB
对于原始样本(未经过拆分),计算可知其样本方差
V
V
V,则对于该节点将选择拆方差减少最大,即
V
−
V
ˉ
V-\bar{V}
V−Vˉ最大的一项
最终模型输出的预测值将是被拆分到同一组的训练样本标签的平均值。
from xgboost import XGBRegressor
model = XGBRegressor()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
神经网络与决策树
决策树与决策树集
- 通常适用于表格(结构化)数据
- 训练速度快
- 小体量决策树具有良好的可解释性
神经网络
- 适用于所有数据(包括图像、视频、文本等决策树难以处理的数据)
- 训练速度慢
- 能够迁移学习
- 便于将多个神经网络串联以获得更大的机器学习系统,且能同时训练