决策树算法梳理
文章目录
1 信息论基础
-
熵
如果一个随机变量 X X X的可能取值为 X = x 1 , x 2 , … , x k X = {x1, x2,…, xk} X=x1,x2,…,xk,其概率分布为 P ( X = x i ) = p i ( i = 1 , 2 , . . . , n ) P(X = xi) = pi(i = 1,2, ..., n) P(X=xi)=pi(i=1,2,...,n),则随机变量X的熵定义为:
H ( X ) = − ∑ x p ( x ) log p ( x ) = ∑ x p ( x ) log 1 p ( x ) H(X)=-\sum_xp(x)\log p(x)=\sum_xp(x)\log \frac{1}{p(x)} H(X)=−x∑p(x)logp(x)=x∑p(x)logp(x)1
由定义知,当随机变量为均匀分布时,熵最大,且 0 ≤ H ( X ) ≤ log n 0 \leq H(X)\leq\log n 0≤H(X)≤logn熵(entropy):表示随机变量不确定性的度量(熵越大,随机变量的不确定性就越大)
-
联和熵
将一维随机变量分布推广到多维随机变量分布
H ( X , Y ) = − ∑ x , y p ( x , y ) log p ( x , y ) = − ∑ i = 1 n ∑ i = 1 m p ( x i , y i ) log p ( x i , y i ) H(X,Y)=-\sum_{x,y}p(x,y)\log p(x,y)=-\sum_{i=1}^n\sum_{i=1}^mp(x_i,y_i)\log p(x_i,y_i) H(X,Y)=−x,y∑p(x,y)logp(x,y)=−i=1∑ni=1∑mp(xi,yi)logp(xi,yi) -
条件熵
条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X) 表示在已知随机变量 X 的条件下随机变量$ Y$ 的不确定性 .随机变量 X X X给定的条件下随机变量Y的条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X),定义为: X X X给定的条件下 Y Y Y的条件概率分布的熵对 X X X的数学期望
H ( Y ∣ X ) = ∑ x p ( x ) H ( Y ∣ X = x ) = − ∑ x p ( x ) ∑ y p ( y ∣ x ) log p ( y ∣ x ) = − ∑ x ∑ y p ( x , y ) log p ( y ∣ x ) H(Y|X)=\sum_xp(x)H(Y|X=x)\\=\ \ -\sum_xp(x)\sum_yp(y|x)\log p(y|x)\\=-\sum_x\sum_yp(x,y)\log p(y|x) H(Y∣X)=x∑p(x)H(Y∣X=x)= −x∑p(x)y∑p(y∣x)logp(y∣x)=−x∑y∑p(x,y)logp(y∣x)
条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X)相当于联合熵 H ( X , Y ) H(X,Y) H(X,Y) 减去单独的熵 H ( X ) H(X) H(X) ,即:
H ( Y ∣ X ) = H ( X , Y ) − H ( X ) H(Y|X)=H(X,Y)-H(X) H(Y∣X)=H(X,Y)−H(X)
证明:
H
(
X
,
Y
)
=
−
∑
x
,
y
p
(
x
,
y
)
log
p
(
x
,
y
)
=
−
∑
x
,
y
p
(
x
,
y
)
log
p
(
x
)
p
(
y
∣
x
)
=
−
∑
x
,
y
p
(
x
,
y
)
log
p
(
y
∣
x
)
−
∑
x
,
y
p
(
x
,
y
)
log
p
(
x
)
=
H
(
Y
∣
X
)
−
∑
x
∑
y
p
(
x
,
y
)
log
p
(
x
)
=
H
(
Y
∣
X
)
−
∑
x
log
p
(
x
)
∑
y
log
p
(
x
,
y
)
=
H
(
Y
∣
X
)
−
H
(
X
)
\begin{aligned} H(X,Y) &= -\sum_{x,y}p(x,y)\log p(x,y) \\&=-\sum_{x,y}p(x,y)\log p(x)p(y|x) \\&=-\sum_{x,y}p(x,y)\log p(y|x)-\sum_{x,y}p(x,y)\log p(x) \\ &= H(Y|X)-\sum_x\sum_yp(x,y)\log p(x)\\&=H(Y|X) - \sum_x\log p(x)\sum_y\log p(x,y) \\&=H(Y|X) - H(X) \end{aligned}
H(X,Y)=−x,y∑p(x,y)logp(x,y)=−x,y∑p(x,y)logp(x)p(y∣x)=−x,y∑p(x,y)logp(y∣x)−x,y∑p(x,y)logp(x)=H(Y∣X)−x∑y∑p(x,y)logp(x)=H(Y∣X)−x∑logp(x)y∑logp(x,y)=H(Y∣X)−H(X)
描述 X 和 Y 所需的信息是描述 X 自己所需的信息,加上给定 X 的条件下具体化 Y 所需的额外信息
-
信息增益
表示:得知特征X的信息而使得类Y的信息的不确定性减少的程度
定义:特征A对训练数据D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(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)
信息增益在决策树算法中是用来选择特征的指标,信息增益越大,则这个特征的选择性越好,在概率中定义为:待分类的集合的熵和选定某个特征的条件熵之差(这里只的是经验熵或经验条件熵,由于真正的熵并不知道,是根据样本计算出来的) -
信息增益比
信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题
特征A对训练数据D的信息增益比 g R ( D , A ) g_R(D,A) gR(D,A)定义为:
其信息增益 g ( D , A ) g(D,A) g(D,A)与训练数据集D关于特征A的值得熵 H A ( D ) H_A(D) HA(D)之比
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)
其中:
H A ( D ) = − ∑ j i = 1 n ∣ D i ∣ ∣ D ∣ log 2 ∣ D i ∣ ∣ D ∣ n 是 特 征 取 值 的 个 数 H_A(D) = -\sum_{ji=1}^n\frac{|D_i|}{|D|}\log_2 \frac{|D_i|}{|D|} \ \ n是特征取值的个数 HA(D)=−ji=1∑n∣D∣∣Di∣log2∣D∣∣Di∣ n是特征取值的个数 -
基尼不纯度
从一个数据集中随机选取子项,度量其被错误的划分到其他组里的概率。(书上解释)
一个随机事件变成它的对立事件的概率(简单理解)
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}^KP_k(1-P_k) = 1-\sum_{k=1}^KP_k^2 Gini(p)=k=1∑KPk(1−Pk)=1−k=1∑KPk2
2 .决策树的不同分类算法(ID3算法、C4.5、CART分类树)的原理及应用场景
-
ID3算法
在决策树上各个节点上应用信息增益准则选择特征,递归地构建决策
-
C4.5
C4.5算法与ID3算法相似,C4.5算法对ID3算法进行了改进,C4.5在生成的过程中,用信息增益比来进行选择特征
-
CART分类树
以基尼指数最小化准则进行特征选择
3 回归树原理
回归树是可以用于回归的决策树模型,一个回归树对应着输入空间(即特征空间)的一个划分以及在划分单元上的输出值.与分类树不同的是,回归树对输入空间的划分采用一种启发式的方法,会遍历所有输入变量,找到最优的切分变量j和最优的切分点s,即选择第j个特征 x j x_j xj和它的取值s将输入空间划分为两部分,然后重复这个操作。
参考:决策树(分类树、回归树)
- 回归树是采用最大均方误差来划分节点,并且每个节点样本的均值作为测试样本的回归预测值;而分类树是采用信息增益或者是信息增益比来划分节点,每个节点样本的类别情况投票决定测试样本的类别。我们可以看到,这两者的区别主要在于划分方式与工作模式。回归树采用最大均方误差这种对数据精确处理的方式,输出连续变量,可以更好地给我们的数据进行预测;而分类树使用一个非常宽泛的信息增益这个变量,更好的从整体把握这个数据集的分类
参考:经典的决策树算法
4 决策树防止过拟合手段
- 剪枝(pruning)
- 预剪枝:预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当前结点的划分不能带来决策树模型泛华性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。
- 后剪枝:后剪枝就是先把整颗决策树构造完毕,然后自底向上的对非叶结点进行考察,若将该结点对应的子树换为叶结点能够带来泛华性能的提升,则把该子树替换为叶结点
5 模型评估
6 sklearn 参数详解,python绘制决策树
'''
scikit-learn中有两类决策树,它们均采用优化的CART决策树算法。
'''
from sklearn.tree import DecisionTreeRegressor
'''
回归决策树
'''
DecisionTreeRegressor(criterion="mse",
splitter="best",
max_depth=None,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.,
max_features=None,
random_state=None,
max_leaf_nodes=None,
min_impurity_decrease=0.,
min_impurity_split=None,
presort=False)
'''
方法:
1.fit(X,y):训练模型。
2.predict(X):预测。
'''
from sklearn.tree import DecisionTreeClassifier
'''
分类决策树
'''
DecisionTreeClassifier(criterion="gini",
splitter="best",
max_depth=None,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.,
max_features=None,
random_state=None,
max_leaf_nodes=None,
min_impurity_decrease=0.,
min_impurity_split=None,
class_weight=None,
presort=False)
'''
方法:
1.fit(X,y):训练模型。
2.predict(X):预测
3.predict_log_poba(X):预测X为各个类别的概率对数值。
4.predict_proba(X):预测X为各个类别的概率值。
'''