决策树
1. 信息论基础(熵 联合熵 条件熵 信息增益 基尼不纯度)
1.1 Entropy
混乱程度的度量,越乱熵值越高
H
(
X
)
=
−
∑
i
=
1
N
p
i
l
o
g
2
p
i
H(X)=− \sum_{i=1}^{N}p_ilog_2p_i
H(X)=−i=1∑Npilog2pi
(log底数选取不影响,保持一致就好)
譬如:
A = [1, 1, 1, 2, 2]
B = [2, 9, 7, 1, 3]
A中只有两种类别,相对稳定;B中类别多,混乱。
A的熵值 < B的熵值
C = [1, 1, 1, 1, 1]
对于只有一种类别的相当于 p = 1
→
\to
→ logp = 0
→
\to
→ H(X) = 0
当p = 0.5,熵值最大,当p趋近于0或者1时,熵值越小。
1.2 Conditional Entropy
1.3 Joint Entropy
1.4 Information Gain
参考
如何挑出特征作为节点?
找到信息增益相对最大的那个点作为节点。
举例:
14天中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
四个特征:天气/温度/湿度/风
选谁当根节点?
特征一:天气
(5/14) 5天晴天中2天打球,3天不打球
(
−
2
5
l
o
g
2
2
5
)
+
(
−
3
5
l
o
g
2
3
5
)
=
0.971
(-\frac{2}{5}log_2\frac{2}{5} )+(- \frac{3}{5}log_2\frac{3}{5}) = 0.971
(−52log252)+(−53log253)=0.971
(4/14) 4天阴天都打球
l
o
g
2
4
4
=
0
log_2\frac{4}{4} = 0
log244=0
(5/14) 5天雨天中3天打球,2天不打球
(
−
3
5
l
o
g
2
3
5
)
+
(
−
2
5
l
o
g
2
2
5
)
=
0.971
(-\frac{3}{5}log_2\frac{3}{5} )+(- \frac{2}{5}log_2\frac{2}{5}) = 0.971
(−53log253)+(−52log252)=0.971
熵计算:
5
14
∗
0.971
+
4
14
∗
0
+
5
14
∗
0.971
=
0.693
\frac{5}{14}*0.971 +\frac{4}{14}*0+\frac{5}{14}*0.971 = 0.693
145∗0.971+144∗0+145∗0.971=0.693
信息增益:
0.940
−
0.693
=
0.247
0.940 - 0.693 = 0.247
0.940−0.693=0.247
同理算出
特征二:gain(温度) = 0.029
特征三:gain(湿度) =0.152
特征四:gain(风) = 0.048
max (gain(特征一), gain(特征二), gain(特征三), gain(特征四)) = 0.247
→
\to
→ 选择特征一:天气作为根节点。
下面的子节点需要再遍历算一遍找出max(gain(feature))
1.5 Gini Index
GINI Index:(和熵的衡量标准类似,只是计算方法不同)
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
Gini(p)=\sum_{k=1}^{K}p_k(1-p_k) = 1- \sum_{k=1}^{K}p_k^2
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
概率肯定在0~1之间,如果说这个东西越确定的越纯的,取到的概率接近于1,GINI系数越接近0,也就是说基尼指数越小,样本的不确定性越小。
2. 决策树的不同分类算法(ID3算法、C4.5、CART分类树)的原理及应用场景
2.1 ID3:信息增益
D: 训练数据集
A: 特征
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)−H(D|A) g(D,A)=H(D)−H(D∣A)
问题:信息增益会偏向取值较多特征
极端举例,按唯一ID编号
[
1
,
2
,
3
,
4
,
5
,
6
,
7
[1,2,3,4,5,6,7
[1,2,3,4,5,6,7]划分, 每个熵值都是自己,很纯,为0,也就是说信息增益最大,会选取ID作为优秀的特征【并不
2.2 C4.5:信息增益率
为了解决 ID3的问题,提出C4.5:information gain ratio,考虑自身熵
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
A
(
D
)
g_R(D,A)=\frac{g(D,A)}{H_A(D)}
gR(D,A)=HA(D)g(D,A)
如果特征A的取值越多,譬如刚才的ID编号例子,每个都是唯一的值,多混乱啊,HA(D)的值必须大,也就是说1/HA(D)的值小。这相当于是给信息增益乘了一个惩罚系数,也就是
g
R
(
D
,
A
)
=
g
(
D
,
A
)
∗
惩
罚
系
数
g_R(D,A)=g(D,A)∗惩罚系数
gR(D,A)=g(D,A)∗惩罚系数
2.3 CART:分类回归树
Classification And Regression Tree
使用GINI系数作为衡量标准,选GINI系数最小的那个做节点和切分
CART假设决策树是二叉树,内部节点特征的取值为“是”(左)和“否”(右)。这样的决策树等价于递归地二分每个特征,将输入空间划分为有限个单元。
连续值划分:
sort(): 60 70 75 85 90 95 100 120 125 220
二分法,找到分界点切分。
60 70 75 85 90 95 100 120 | 125 220
譬如来一刀,左边
≤
\leq
≤ 122.5
≤
\leq
≤右边
2.3.1 回归树原理
3. 决策树防止过拟合手段
决策树很容易过拟合
3.1 剪枝: 预剪枝&后剪枝
-
预剪枝:边建边剪(常用)
限制深度
限制叶子节点的个数
限制叶子节点中的样本数,譬如小于指定样本数就不用再分了
限制信息增益,譬如小于某个差值也不用再分了 -
后剪枝:建完剪
通过一定标准衡量,看要不要分裂
C α ( T ) = C ( T ) + α ⋅ ∣ T l e a f ∣ C_\alpha(T) = C(T) +\alpha·|T_{leaf}| Cα(T)=C(T)+α⋅∣Tleaf∣
C = Cost
T = Tree
叶子节点越多,损失越大
C ( T ) = ∑ ( 单 个 叶 子 节 点 中 的 样 本 数 ∗ 它 的 熵 值 或 者 G I N I 系 数 ) C(T) = \sum(单个叶子节点中的样本数*它的熵值或者GINI系数) C(T)=∑(单个叶子节点中的样本数∗它的熵值或者GINI系数)
α ⋅ ∣ T l e a f ∣ \alpha·|T_{leaf}| α⋅∣Tleaf∣限制叶子节点的个数,希望 C ( T ) + α ⋅ ∣ T l e a f ∣ C(T) +\alpha·|T_{leaf}| C(T)+α⋅∣Tleaf∣越小越好,也就是说明叶子节点越多,损失越大
举例:
本节点如果不分 ① C ( T ) = 9 ∗ 0.49 + α ∗ 1 C(T) = 9 * 0.49 + \alpha*1 C(T)=9∗0.49+α∗1
此节点下面有三个叶子节点② C α ( T ) = 3 ∗ 0 + 3 ∗ 0 + 3 ∗ 0.44 + α ∗ 3 C_\alpha(T) = 3*0+3*0+3*0.44 +\alpha*3 Cα(T)=3∗0+3∗0+3∗0.44+α∗3
对于 α \alpha α的取值, α \alpha α越大, ∣ T l e a f ∣ |T_{leaf}| ∣Tleaf∣越小; α \alpha α越小, ∣ T l e a f ∣ |T_{leaf}| ∣Tleaf∣越大
对比,如果①>②,那就说明还是分的好,如果①<②,那就还是不分的好。
4. 模型评估
5. sklearn参数详解,Python绘制决策树
详细见官网
from sklearn.datasets import load_iris
from sklearn import tree
import graphviz
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
dot_data = tree.export_graphviz(clf, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph
#graph.render("my_tree") #get a pdf file