一、信息论基础
1.1 信息熵
信息熵与热力学中的熵不一样,是表示随机变量不确定性的度量。熵值越大,不确定程度越大,也就是说明所含信息越多;相反,熵值越小,不确定程度越小,也就是说明所含信息越小;在决策树的应用中,熵用来衡量样本的纯度,熵越小,样本越纯,表明分类的效果越好公式:
H(X)=∑xp(x)∗logp(x)H(X) = \sum_{x}p(x)*\log{p(x)}H(X)=∑xp(x)∗logp(x)
log函数底数为2时,熵的单位为比特。
1.1.1 联合熵
衡量随机变量X、Y在一起时的不确定性。公式如下:
H(X,Y)=∑x,yp(x,y)∗logp(x,y)H(X,Y) = \sum_{x,y}p(x,y)*logp(x,y)H(X,Y)=∑x,yp(x,y)∗logp(x,y).
以下图形帮助理解,两个颜色区域相加代表联合熵。
1.1.2条件熵
定义为X发生前提下,Y的熵。有的老师念H Y give X?
H(Y∣X)=H(X,Y)−H(X)=−∑x,yp(x,y)logp(y∣x)H(Y|X) =H(X,Y)-H(X) = -\sum_{x,y}p(x,y)logp(y|x)H(Y∣X)=H(X,Y)−H(X)=−x,y∑p(x,y)logp(y∣x)
推导过程如下:
1.1.3互信息熵
I(X,Y)=H(Y)−H(Y∣X)=H(X)+H(Y)−H(X,Y)I(X,Y) = H(Y) - H(Y|X) = H(X) + H(Y) - H(X,Y)I(X,Y)=H(Y)−H(Y∣X)=H(X)+H(Y)−H(X,Y)
红色文本交叉部分为互信息熵。
1.1.4信息增益
表示特征X使得类Y的不确定性减少的程度。是指未进行过分类的原样本的信息熵与通过某一属性对原样本划分后所得的信息熵的差值。一般而言,信息增益越大,意味着使用这种属性来进行划分所获得的“纯度提升”越大。
其公式如下:
信息增益用于ID3算法,而ID4.5则使用了信息增益率:gr(D,A)=g(D,A)/H(A)g_r(D,A) = g(D,A)/H(A)gr(D,A)=g(D,A)/H(A)
1.1.5 基尼指数
基尼指数反映了从数据集中随机抽取两个样本,其类别标记不一致的概率,因此,基尼指数越小,数据集的纯度越高。
Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1kpk2=1−∑k=1k(∣Ck∣D)2Gini(p) = \sum^K_{k=1}p_k(1-p_k)=1 - \sum^k_{k=1}p^2_k = 1 - \sum^k_{k=1}(\frac{|C_k|}{D})^2Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑kpk2=1−k=1∑k(D∣Ck∣)2
1.2 决策树的不同分类算法
1.2.1 ID3算法
ID3 生成算法核心是在决策树的每个结点上应用信息增益准则选择特征,递归地构建决策树。 -
- 从根结点开始,计算结点所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征划分出子结点。
- 再对子结点递归地调用以上方法,构建决策树。 直到所有特征的信息增益均很小或者没有特征可以选择为止,最后得到一个决策树 。
- 如果不设置特征信息增益的下限,则可能会使得每个叶子都只有一个样本点,从而划分得太细。
1.2.2 C4.5
C4.5 生成算法与 ID3 算法相似,但是 C4.5 算法在生成过程中用信息增益比来选择特征。
如果是取值更多的属性,更容易使得数据更“纯” ,其信息增益更大,决策树会首先挑选这个属性作为树的顶点。结果训练出来的形状是一棵庞大且深度很浅的树,这样的划分是极为不合理的。
而使用信息增益率:gr(D,A)=g(D,A)/H(A)g_r(D,A) = g(D,A)/H(A)gr(D,A)=g(D,A)/H(A),考虑自身熵,解决ID3问题。
1.2.3 CART分类树
CART算法使用基尼指数来选择划分属性。一个属性的信息增益越大,表明属性对样本的熵减少的能力更强,这个属性使得数据由不确定性变成确定性的能力越强
二、决策树防止过拟合
2.1 剪枝
为什么要剪枝:决策树过拟合风险很大,理论上可以完全分得开数据
(想象一下,如果树足够庞大,每个叶子节点不就一个数据了嘛)
剪枝策略:预剪枝,后剪枝.
预剪枝:边建立决策树边进行剪枝的操作(更实用)
- 限制深度,叶子节点个数
- 叶子节点样本数,信息增益量等
后剪枝:当建立完决策树后来进行剪枝操作。通过一定的衡量标准
2.2随机森林
解决过拟合的另一个办法是生成随机森林。
名词解释:
- EM:Ensemble learning
- 目的:让机器学习效果更好,单个不行,群殴走起
- Bagging:训练多个分类器取平均 f(x)=1M∑m=1Mfm(x)f(x) = \frac{1}{M}\sum_{m=1}^Mf_m(x)f(x)=M1m=1∑Mfm(x)
- Boosting:从弱学习器开始加强,通过加权来进行训练
- Stacking:聚合多个分类或回归模型(可以分阶段来做)
- Bagging模型
- 全称: bootstrap aggregation(说白了就是并行训练一堆分类器)
- 最典型的代表就是随机森林,随机指数据采样随机,特征选择随机。森林指很多个决策树并行放在一起
三、sklearn参数详解,Python绘制决策树
sklearn绘制决策树,树模型保存为.gv数据,Graphviz打开。或import pydotplus
,输出pdf
sklearn.tree.DecisionTreeClassifier
(criterion=‘gini’, splitter=‘best’, max_depth=None, min_samples_split=2,
min_samples_leaf=1,min_weight_fraction_leaf=0.0, max_features=None,
random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, class_weight=None, presort=False)
criterion:特征选择的标准,有信息增益和基尼系数两种,使用信息增益的是ID3和C4.5算法(使用信息增益比),使用基尼系数的CART算法,默认是gini系数。
splitter:特征切分点选择标准,决策树是递归地选择最优切分点,spliter是用来指明在哪个集合上来递归,有“best”和“random”两种参数可以选择,best表示在所有特征上递归,适用于数据集较小的时候,random表示随机选择一部分特征进行递归,适用于数据集较大的时候。
max_depth:决策树最大深度,决策树模型先对所有数据集进行切分,再在子数据集上继续循环这个切分过程,max_depth可以理解成用来限制这个循环次数。
min_samples_split:子数据集再切分需要的最小样本量,默认是2,如果子数据样本量小于2时,则不再进行下一步切分。如果数据量较小,使用默认值就可,如果数据量较大,为降低计算量,应该把这个值增大,即限制子数据集的切分次数。
min_samples_leaf:叶节点(子数据集)最小样本数,如果子数据集中的样本数小于这个值,那么该叶节点和其兄弟节点都会被剪枝(去掉),该值默认为1。
min_weight_fraction_leaf:在叶节点处的所有输入样本权重总和的最小加权分数,如果不输入则表示所有的叶节点的权重是一致的。
max_features:特征切分时考虑的最大特征数量,默认是对所有特征进行切分,也可以传入int类型的值,表示具体的特征个数;也可以是浮点数,则表示特征个数的百分比;还可以是sqrt,表示总特征数的平方根;也可以是log2,表示总特征数的log个特征。
random_state:随机种子的设置,与LR中参数一致。
max_leaf_nodes:最大叶节点个数,即数据集切分成子数据集的最大个数。
min_impurity_decrease:切分点不纯度最小减少程度,如果某个结点的不纯度减少小于这个值,那么该切分点就会被移除。
min_impurity_split:切分点最小不纯度,用来限制数据集的继续切分(决策树的生成),如果某个节点的不纯度(可以理解为分类错误率)小于这个阈值,那么该点的数据将不再进行切分。
class_weight:权重设置,主要是用于处理不平衡样本,与LR模型中的参数一致,可以自定义类别权重,也可以直接使用balanced参数值进行不平衡样本处理。
presort:是否进行预排序,默认是False,所谓预排序就是提前对特征进行排序,我们知道,决策树分割数据集的依据是,优先按照信息增益/基尼系数大的特征来进行分割的,涉及的大小就需要比较,如果不进行预排序,则会在每次分割的时候需要重新把所有特征进行计算比较一次,如果进行了预排序以后,则每次分割的时候,只需要拿排名靠前的特征就可以了。