[ML学习笔记] 决策树与随机森林(Decision Tree&Random Forest)

[ML学习笔记] 决策树与随机森林(Decision Tree&Random Forest)


决策树

决策树算法以树状结构表示数据分类的结果。每一个决策点实现一个具备离散输出的测试函数,记为分支。html

一棵决策树的组成:根节点、非叶子节点(决策点)、叶子节点、分支node

算法分为两个步骤:1. 训练阶段(建模) 2. 分类阶段(应用)python


熵的概念

设用P(X)表明X发生的几率,H(X)表明X发生的不肯定性,则有:P(X)越大,H(X)越小;P(X)越小,H(X)越大。算法

信息熵的一句话解释是:消除不肯定性的程度。熵 =$ -\sum_{i=1}^nP_i\log(P_i)$dom

当熵较小时表示集合较纯,分类效果较好。所以,构造树的基本想法是随着树深度的增长,节点的熵迅速下降,下降的速度越快越好,这样才有望获得一棵高度最矮的决策树。函数


如何划分

为了知足上述基本想法,想要选取一个划分标准来为当前集合分类,须要定义一个指标来评判分类效果。学习

常见的有如下三种指标:测试

ID3:信息增益(划分前熵值 - 划分后熵值)
C4.5:信息增益率(信息增益 / 划分前的熵值)
CART:Gini系数spa

最传统的作法就是选取信息增益最大的特征做为划分节点(ID3),但它在一些状况下不适用,好比当存在某些特征的取值不少、每一个取值对应的样本数据不多(如id值,会将N个用户划分为N类),此时虽然信息增益大,但其实和样本的划分关系不大(泛化能力弱)。所以引入信息增益率(信息增益 / 划分前的熵值)。3d

CART分类使用基尼指数(Gini)来选择最好的数据分割的特征,Gini描述的是纯度,与信息熵的含义类似。Gini系数 \(Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp^2\) (同熵同样,值较小时分类效果好)。

引入评价函数:\(C(T)=\sum_{t\in leaf}N_t*H(t)\)\(H(t)\)表示熵值或Gini系数值,\(N_t\)表示叶节点中的样本数 (评价函数值越小越好)。


其余

如何处理连续型的属性:离散化,将连续型属性的值分为不一样的区间,依据是比较各个分裂点获得Gain值的大小。

缺失数据的考虑:忽略,即在计算增益时仅考虑那些具备属性值的记录。

当决策树过高、分支太多时很容易过拟合(在训练集上划分为100% 但在测试集上效果很差),因而引入剪枝操做:

  • 预剪枝:在构建决策树的过程当中,提早中止。如限制深度、限制当前集合的样本个数的最低阈值。
  • 后剪枝:在决策树构建好后才开始剪枝。如从新定义评价函数 \(C_\alpha(T)=C(T)+\alpha\cdot\mid T_{leaf}\mid\)(限制叶子节点个数,手动设置\(\alpha\)以控制影响程度),在建树完成以后对每一个节点比较剪枝和不剪枝的效果。


随机森林

随机森林就是经过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,本质是一种集成学习(Ensemble Learning)方法。

从直观角度来解释,每棵决策树都是一个分类器,那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了全部的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。

随机森林体现了两方面的随机

  • 样本随机 不使用所有数据集,而是随机放回采样(有必定几率避免选到异常点,使得树的效果更好)
  • 特征随机 不使用所有特征,而是随机选取一部分特征(有必定几率避开使用传统信息增益出问题的特征)

详细可参看 [Machine Learning & Algorithm] 随机森林(Random Forest)


sklearn库中的决策树算法

使用sklearn自带的决策树方法简单代码以下:

from sklearn import tree
     
    mode = tree.DecisionTreeClassifier(criterion='gini')
     
    mode.fit(X,Y)
    y_test = mode.predict(x_test)

参数解释:

1.criterion gini or entropy 选择基尼系数或熵值做为评判标准

2.splitter best or random 在连续的特征中须要作切分 前者是在全部特征中找最好的切分点 后者是在部分特征中(数据量大的时候)

3.max_features None(全部),log2,sqrt,N 当候选特征较多时须要做出选择 特征小于50的时候通常使用全部的

4.max_depth 指定最大深度(预剪枝时使用) 数据少或者特征少的时候能够无论这个值,若是模型样本量多,特征也多的状况下,能够尝试限制下

5.min_samples_split 若是某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分若是样本量不大,不须要管这个值。若是样本量数量级很是大,则推荐增大这个值。(预剪枝时使用)

6.min_samples_leaf 这个值限制了叶子节点最少的样本数,若是某叶子节点数目小于样本数,则会和兄弟节点一块儿被剪枝,若是样本量不大,不须要管这个值,大些如10W但是尝试下5

7.min_weight_fraction_leaf 这个值限制了叶子节点全部样本权重和的最小值,若是小于这个值,则会和兄弟节点一块儿被剪枝默认是0,就是不考虑权重问题。通常来讲,若是有较多样本有缺失值,或者分类树样本的分布类别误差很大,就会引入样本权重

8.max_leaf_nodes 经过限制最大叶子节点数,能够防止过拟合,默认是"None”,即不限制最大的叶子节点数。若是加了限制,算法会创建在最大叶子节点数内最优的决策树。若是特征很少,能够不考虑这个值,可是若是特征分红多的话,能够加以限制具体的值能够经过交叉验证获得。

9.class_weight 指定样本各种别的的权重,主要是为了防止训练集某些类别的样本过多致使训练的决策树过于偏向这些类别。这里能够本身指定各个样本的权重若是使用“balanced”,则算法会本身计算权重,样本量少的类别所对应的样本权重会高。

10.min_impurity_split 这个值限制了决策树的增加,若是某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点再也不生成子节点。即为叶子节点 。

相关文章
相关标签/搜索