【初级算法梳理】决策树

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=1Npilog2pi
(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 1450.971+1440+1450.971=0.693
信息增益:
0.940 − 0.693 = 0.247 0.940 - 0.693 = 0.247 0.9400.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=1Kpk(1pk)=1k=1Kpk2
概率肯定在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(DA)

问题:信息增益会偏向取值较多特征
极端举例,按唯一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)=90.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)=30+30+30.44+α3
    对于 α \alpha α的取值, α \alpha α越大, ∣ T l e a f ∣ |T_{leaf}| Tleaf越小; α \alpha α越小, ∣ T l e a f ∣ |T_{leaf}| Tleaf越大
    对比,如果①>②,那就说明还是分的好,如果①<②,那就还是不分的好。

4. 模型评估

Sklearn, Model evaluation

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值