scikit-learn机器学习常用算法原理及编程实战(五)

决策树

决策树是最经典的机器学习模型之一。预测速度快,可以处理类别型数据和连续型数据。通过本章读者可以掌握以下内容:

  • 信息熵及信息增益的概念,以及决策树的分裂的原则;
  • 决策树的创建及剪枝算法;
  • scikit-learn中决策树算法的相关参数;
  • 使用决策树预测泰坦尼克号幸存者实例;
  • scikit-learn中模型参数选择的工具及使用方法;
  • 聚合算法及随机森林算法的原理。

    算法原理

    决策树是一个类似于流程图的树结构,分支节点表示对一个特征进行测试,根据测试结果进行分类,树叶节点代表一个类别。

    信息增益

    信息熵(Entropy)的概念,解决了信息的量化问题。一条信息的信息量和它的不确定性有直接关系。一个问题不确定性越大,需要了解的信息就越多,其信息熵就越大。信息熵的计算公式为:
    \[H(X)=-\sum_{x\in X}P(x)log_2P(x)\]
    \(P(x)\)表示事件\(x\)出现的概率。
    构建决策树时,先遍历所有的特征,分别计算,使用这个特征划分数据集前后信息熵的变化值,然后选择信息熵变化幅度最大的那个特征,来优先作为数据集划分依据。即选择信息增益最大的特征作为分裂节点。
    1240

    决策树的创建

  • 决策树的构建过程,就是从训练数据集中归纳出一组分类规则,使它与训练数据矛盾较小的同时具有较强的泛化能力。有了信息增益来量化地选择数据集的划分特征,使决策树的创建过程变得容易了。决策树的创建基本上分以下几步:
    (1)计算数据集划分前的信息熵
    (2)遍历所有未作为划分条件的特征,分别计算根据每个特征划分数据集后的信息熵
    (3)选择信息增益最大的特征,并使用这个特征作为数据划分节点来划分数据
    (4)递归地处理被划分后的所有子数据集,从未被选择的特征里继续选择最优数据划
    分特征来划分子数据集。
  • 递归过程的结束条件
    • 所有特征都用完了,即没有新的特征可以用来进一步划分数据集
    • 划分后的信息增益足够小了(需要事先选择信息增益的门限值来作为结束递归的条件)使用信息增益作为特征选择指标的决策树构建算法,称为ID3算法
      1.离散化
      连续特征离散化
      2.正则项
      计算划分后的子数据集的信息熵时,加上一个与类别个数成正比的正则项,来作为最后的信息恼。这样,当算法选择的某个类别较多的特征,使信息熵较小时,由于受到类别个数的正则项惩罚,导致最终的信息熵也比较大。这样通过合适的参数,可以使算法训练得到某种程度的平衡。
      另外一个解决办法是使用信息增益比来作为特征选择的标准。
      3.基尼不纯度
      信息熵是衡量信息不确定性的指标,实际上也是衡量信息“纯度”的指标。除此之外,基尼不纯度(Gini impurity)也是衡量信息不纯度的指标,其计算公式为:
      \[Gini(D)=\sum_{x\in X}P(x)(1-P(x))=1-\sum_{x\in X}P(x)^2\]
      \(P(x)\)是样本属于\(x\)这个类别的概率。
      基尼不纯度
      CART算法使用基尼不纯度作为特征选择标准,CART也是一种决策树构建算法。

      剪枝算法

      使用决策树模型拟合数据时,容易造成过拟合。解决过拟合的方法是对决策树进行剪枝处理。决策树的剪枝有两种思路:前剪枝(Pre-Pruning)和后剪枝(Post-Pruning)
      1.前剪枝
      前剪枝是在构造决策树的同时进行剪枝。在决策树的构建过程中,如果无法进一步降低信息熵的情况下,就会停止创建分支。为了避免过拟合,可以设定一个阈值,信息熵减小的数量小于这个阈值,即使还可以继续降低熵,也停止继续创建分支。这种方法称为前剪枝。还有一些简单的前剪枝方法,如限制叶子节点的样本个数,当样本个数小于一定的阈值时,即不再继续创建分支。
      2.后剪枝
      后剪枝是指决策树构造完成后进行剪枝。剪枝的过程是对拥有同样父节点的一组节点进行检查,判断如果将其合并,信息熵的增加量是否小于某一阈值。如果小于阈值,则这一组节点可以合并一个节点。后剪枝是目前较普遍的做法。后剪枝的过程是删除一些子树,然后用子树的根节点代替,来作为新的叶子节点。这个新叶子节点所标识的类别通过大多数原则来确定,即把这个叶子节点里样本最多的类别,作为这个叶子节点的类别。
      后剪枝算法有很多种,其中常用的一种称为降低错误率剪枝法(Reduced-Error Pruning)。其思路是,自底向上,从己经构建好的完全决策树中找出一个子树,然后用子树的根节点代替这棵子树,作为新的叶子节点。叶子节点所标识的类别通过大多数原则来确定。这样就构建出一个新的简化版的决策树。然后使用交叉验证数据集来测试简化版本的决策树,看看其错误率是不是降低了。如果错误率降低了,则可以使用这个简化版的决策树代替完全决策树,否则还是采用原来的决策树。通过遍历所有的子树,直到针对交叉验证数据集,无法进一步降低错误率为止。

算法参数

scikit-leam使用sklean.tree.DecisionTreeClassifier 类来实现决策树分类算法。其中几个典型的参数解释如下。
官方文档:https://scikit-learn.org/stable/modules/tree.html#classification

  • criterion:特征选择算法。一种是基于信息熵,另外一种是基于基尼不纯度。这两种算法的差异性不大,对模型的准确性没有太大的影响。相对而言,信息熵运算效率会低一些,因为它有对数运算。
  • splitter:创建决策树分支的选项,一种是选择最优的分支创建原则,另外一种是从排名靠前的特征中,随机选择一个特征来创建分支,这个方法和正则项的效果类似,可以避免过拟合问题。
  • max_depth:指定决策树的最大深度。通过指定该参数,用来解决模型过拟合问题。
  • min_samples_split:这个参数指定能创建分支的数据集的大小,默认是2。如果一个节点的数据样本个数小于这个数值,则不再创建分支。这也是一种前剪枝的方法。
  • min_samples_leaf:创建分支后的节点样本数量必须大于等于这个数值,否则不再创建分支。这也是一种前剪枝的方法。
  • max_leaf_nodes:除了限制最小的样本节点个数,该参数可以限制最大的样本节点个数。
  • min_impurity_split:可以使用该参数来指定信息增益的阈值。决策树在创建分支时,信息增益必须大于这个阈值,否则不创建分支。

实例:预测泰坦尼克号幸存者

数据集地址:https://www.kaggle.com/c/titanic/data
代码示例:https://github.com/DyerLee/scikit-learn-Machine_Learning/blob/master/ch07.02.ipynb

集成算法

集合算法(Ensemble)是一种元算法(Meta-algorithm),它利用统计学采样原理,训练出成百上千个不同的算法模型。当需要预测一个新样本时,使用这些模型分别对这个样本进行预测,然后采用少数服从多数原则,决定新样本的类别。集合算法可以有效地解决过拟合问题。在scikit-learn里,所有的集合算法都实现在sklearn.ensemble包里。

自助聚合算法Bagging

自助聚合一般称为Bagging,它是Bootstrap Aggregating的缩写。它的核心思想是,采用有放回的采样规则,从\(m\)个样本的原数据集里进行\(n(n\leq m)\)次采样,构成一个包含\(n\)个样本的新训练数据集, 然后拿这个新训练数据集来训练模型。重复上次过程\(B\)次,得到\(B\)个模型。当有新样本需要进行预测时,拿这\(B\)个模型分别对这个样本进行预测, 然后采用投票方式(分类问题)或求平均值方式(回归问题)得到新样本的预测值。
所谓的有放回采样规则是指,在\(m\)个数据集里,随机取出一个样本放到新数据集里,然后把这个样本放回原数据集,继续随机采样,直到达到采样次数\(n\)为止。由此可见,随机采样出的数据集里可能有重复数据,并且原数据集里,不一定每个数据都会出现在新采样出的数据集里。
单一模型往往容易对数据噪声敏感,从而造成高方差(High Variance)。自助聚合算法可以降低对数据噪声的敏感性,从而提高模型准确性和稳定性。这种方法不需要额外地输入,只是简单地对同一个数据集训练出多个模型即可实现。当然,这并不是说没有代价,自助聚合算法一般会增加模型训练的计算量。
在scikit-learn里,由BaggingClassifier和BaggingRegressor分别实现分类和回归的Bagging算法。

正向激励算法boosting

其算法原理是,初始化时,针对有\(m\)个训练样本的数据集,给每个样本都分配一个初始权重,然后使用这个带权重的数据集来训练模型。训练出这个模型后,针对这个模型预测错误的样本,增加其权重值,然后拿这个新的带权重的数据集来训练出一个新模型。重复上述过程\(B\)次,训练出\(B\)个模型。它与Bagging算法的区别如下:

  • 采样规则不同,Bagging算法是采用有放回的随机采样规则。而boosting是使用增大错误预测样本的权重的方法,这一方法相当于加强对错误预测的样本的学习力度,从而提高模型准确性。
  • 训练方式不同,Bagging算法可以并行训练多个模型。而boosting算法能串行训练,因为下一个模型依赖于上一个模型的预测结果。
  • 模型权重不同,Bagging算法训练出来的B个模型权重是一样的。而boosting算法训练出来的模型本身带有权重信息,在对新样本进行预测时,每个模型的权重是不一样的。单个模型的权重由模型训练的效果来决定,即准确性高的模型权重更高。
    boosting算法实现有很多种,其中最著名的是AdaBoost算法。在scikit-learn里由AdaBoostClassifier和AdaBoostRegressor分别实现分类和回归算法。

    随机森林

    随机森林在自助聚合算法的基础上更进一步,对特征应用自助聚合算法。即,每次训练时,不拿所有的特征来训练,而是随机选择一个特征的子集来进行训练。随机森林算法有两个关键参数,一是构建的决策树的个数\(t\),二是构建单棵决策树特征的个数\(f\)。假设,针对一个有\(m\)个样本、\(n\)个特征的数据集,则其算法原理如下:

    1.单棵决策树的构建
  • 采用有放回采样,从原数据集中经过\(m\)次采样,获取到一个有\(m\)个样本的数据集(这个数据集里可能有重复的样本)。
  • \(n\)个特征里,采用无放回采样规则,从中取出\(f\)个特征作为输入特征。
  • 在新数据集上(即\(m\)个样本,\(f\)个特征的数据集上),构建决策树。
  • 重复上述过程\(t\)次,构建出\(t\)棵决策树。

    2.随机森林的分类结果

    生成\(t\)棵决策树之后,对于每个新的测试样例,综合多棵决策树的预测结果来作为随机森林的预测结果。具体为,如果目标为数字类型,取\(t\)棵决策树的预测值的平均值作为预测结果;如果目标为分类问题,采取少数服从多数,取单棵树分类结果最多的那个类别作为整个随机森林的分类结果。
    思考: 为什么随机森林要选取特征的子集来构建决策树?
    假如某个输入特征对预测结果是强关联的,那么如果选择全部的特征来构建决策树时,这个特征都会在所有的决策树里体现。由于这个特征和预测结果强关联,会造成所有的决策树都强烈地反映这个特征的“倾向”性,从而导致无法很好地解决过拟合问题。我们在讨论线性回归算法时,通过增加正则项来解决过拟合问题,它的原理就是确保每个特征都对预测结果有少量的贡献,从而避免单个特征对预测结果有过大贡献导致的过拟合问题。
    在scikit-learn里,由RandomForestClassifier和RandomForestRegressor分别实现随机森林的分类和回归算法。

    Extra Trees算法

    随机森林在构建决策树的过程中,会使用信息熵(或基尼不纯度),然后选择信息增益最大的特征来进行分裂。而ExtraTrees是直接从这些特征里随机选择一个特征来分裂,从而避免了过拟合问题。
    在scikit-learn里,由ExtraTreesClassifier和ExtraTreesRegressor分别实现ExtraTrees分类和回归算法。

转载于:https://www.cnblogs.com/DyerLee/p/10881022.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值