1 基本概念
- 熵
描述信息的不确定度。熵越大,信息的不确定度越大。 - 信息量
I ( x ) = − l o g ( p ( x ) ) I(x)=-log(p(x)) I(x)=−log(p(x))
信息是用来消除随机不确定性的东西。衡量信息量大小就看这个信息消除不确定性的程度。事件发生的概率越低,信息量越大。举个例子,“一个人是女性”和“一个人是大学老师”哪个信息量大呢?显然是后者。前者的概率是1/2,后者的概率远小于1/2。 - 信息熵
可能产生的信息量的期望。
H ( x ) = − ∑ i = 1 n p ( x i ) l o g ( p ( x i ) ) H(x)=-\sum_{i=1}^{n}p(x_i)log(p(x_i)) H(x)=−i=1∑np(xi)log(p(xi))
信息熵是用来衡量事物不确定性的。信息熵越大,事物越具不确定性,事物越复杂。当所有事件等概率发生时,信息熵最大,不确定性最大;当只有一个事件(p=1)时,信息熵为0,不确定性最小。
2 决策树的类型
从逻辑角度来看,决策树就是一堆if else语句的组合,通过不断划分节点,最终的目的是使样本越分越“纯”。根据划分节点的准则我们可以将决策树分为三种,分别是ID3、ID4.5和CART。
- ID3
决策树划分节点的原则是尽可能消除决策的不确定性。 ID3算法通过信息增益来选取特征。
信息增益 = 划分前熵 - 划分后熵。假定当前样本集合D中第 k 类样本(共n类)所占的比例为 p k p_k pk,则 D的信息熵为:
E n t ( D ) = ∑ k = 1 n p k l o g 2 p k Ent(D)=\sum_{k=1}^{n}p_klog_{2}p_k Ent(D)=k=1∑npklog2pk
若根据属性a对样本进行划分产生V个分支节点,那么信息增益为:
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=1∑V∣D∣∣Dv∣Ent(Dv) - ID4.5
根据信息熵的定义,节点属性值越多,信息熵越大。信息增益准则对属性值数目较多的属性有所偏好。
ID4.5 算法通过信息增益率来选择特征。
G a i n r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ Gain_ratio(D,a)=\frac{Gain(D,a)}{IV(a)} \\IV(a)=-\sum_{v=1}^{V}\frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|} Gainratio(D,a)=IV(a)Gain(D,a)IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
信息增益率本质: 是在信息增益的基础之上乘上一个惩罚参数。特征个数较多时,惩罚参数较小;特征个数较少时,惩罚参数较大。
增益率准对可取值数目较少的属性有所偏好。因此 , C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式方法:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。 - CART
CART采用的是二分递归分裂的思想,因此生成的决策树均为二叉树。CART包含两种类型的决策树:分类树和回归树。分类树的预测值是离散的,通常会将叶子节点中多数样本的类别作为该节点的预测类别。回归树的预测值是连续的,通常会将叶子节点中多数样本的平均值作为该节点的预测值。分类树采用基尼系数进行特征选择,而回归树采用均方误差。CART是XGBoost树模型的重要组成部分。
G i n i = 1 − ∑ i = 1 n p i 2 Gini=1-\sum_{i=1}^{n}{p_i}^2 Gini=1−i=1∑npi2
基尼系数反映了随机抽取两个样本,其类别不一致的概率。我们的目的是使同一个分支的类别一致,而基尼系数反映的是分支内任意两个样本分类不一致的情况,基尼系数越小,分类越纯,所以我们选取基尼系数最小的属性作为最优划分属性。
3 决策树的剪枝
决策树算法很容易过拟合(overfitting),剪枝算法就是用来防止决策树过拟合,提高泛化性能的方法。
剪枝分为预剪枝与后剪枝。
- 预剪枝
指在决策树的生成过程中,对每个节点在划分前先进行评估,若当前的划分不能带来泛化性能的提升,则停止划分,并将当前节点标记为叶节点,其类别标记为训练样例数最多的类别。
啥叫泛化性能呢?就是模型在验证集上的表现。拿生成的决策树去对验证集的样本分类,假如在一个节点划分后准确率下降了,那就是泛化性能降低。 - 后剪枝
指先从训练集生成一颗完整的决策树,然后自底向上对非叶节点进行考察,若将该节点对应的子树替换为叶节点,能带来泛化性能的提升,则将该子树替换为叶节点。
一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但后剪枝过程是在生成完全决策树之后进行的 ,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
4 连续值处理
采用二分法对连续属性进行处理,这正是 C4 . 5 决策树算法中采用的机制。
5 缺失值处理
让同一个样本以不同的概率划入到不同的子结点中去。这个呢很好理解,假如一共10个样本,在某节点处4个样本被划分到左分支,5个样本被划分到右分支,还有一个节点属性缺失。那么我们就将该节点同时划到两个分支,但是会乘上一个权重。原始的权重为1,左边的样本乘以 4 9 \frac{4}{9} 94,右边的样本乘以 5 9 \frac{5}{9} 95。其实就是根据样本的分布估计它属于不同类别的概率。
6 决策树的优缺点
优点:容易理解和解释,训练需要数据少,不需要归一化。
缺点:容易过拟合。
7 sklearn 实现
from sklearn.datasets import load_iris
from sklearn import tree
from sklearn.model_selection import cross_val_score
iris = load_iris()
X, y = iris.data, iris.target
clf = tree.DecisionTreeClassifier()
scores = cross_val_score(clf, X, y, cv=5)
print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))