决策树

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

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

    算法原理

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

    信息增益

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

    决策树的创建

  • 决策树的构建过程,就是从训练数据集中归纳出一组分类规则,使它与训练数据矛盾较小的同时具有较强的泛化能力。有了信息增益来量化地选择数据集的划分特征,使决策树的创建过程变得容易了。决策树的创建基本上分以下几步:
    (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

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

  1. TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书

    作者:蒋子阳 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2019-01-01 TensorFlow深度学习算法原理与编程实战 人工智能机器学习技术丛书 ISBN:97875170682 ...

  2. 《机器学习:算法原理与编程实践》的读书笔记:SMO部分最难,大部分代码基于Scikit-Learn,决策树其实用处不大

    机器学习:算法原理与编程实践 目录 [隐藏] 1 机器学习的基础 2 中文文本分类 3 决策树的发展 4 推荐系统原理 5 梯度寻优 6 神经网络初步 7 预测的技术与哲学 8 万能分类器:SVM 9 ...

  3. OpenCV4机器学习算法原理与编程实战(附部分模型下载地址)

    一直想找本书,能在机器学习复杂的算法原理和高效的编程实战之间达到合适的平衡:让感兴趣的同学拿到就有能用的代码,还有基本原理的介绍,因为了解原理才知道什么时候用什么算法最合适,以及如何调整参数. 一直没 ...

  4. halcon机器视觉算法原理与编程实战_快速弄懂机器学习里的集成算法:原理、框架与实战...

    作者:  博观厚积 简书专栏:https://www.jianshu.com/u/2f376f777ef1 1. 关于集成学习算法 集成学习算法,通俗地讲就是:三个臭皮匠,顶个诸葛亮,这在很多地方都有 ...

  5. 机器学习常用算法原理及优缺点

    KNN 核心思想是: 物以类聚,人以群分 根据两点距离公式,计算距离,选择距离最小的前k个点,并返回分类结果. 假设一个未知样本数据x需要归类,总共有ABC三个类别,那么离x距离最近的有k个邻居,这k ...

  6. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD...

    4.5.1 SVD算法回顾 A = U∑VT 其中:A是N*M的矩阵,U是M*M的方阵(里面向量正交,称为左奇异向量),∑是一个M*N的矩阵,VT是一个N*N的矩阵(里面向量正交,右奇异向量) 那么奇 ...

  7. 郑捷《机器学习算法原理与编程实践》学习笔记(第七章 预测技术与哲学)7.1 线性系统的预测...

    7.1.1 回归与现代预测 7.1.2 最小二乘法 7.1.3 代码实现 (1)导入数据 def loadDataSet(self,filename): #加载数据集X = [];Y = []fr = ...

  8. 机器学习——常用算法的总结

    机器学习常用算法总结 机器学习--常用算法的总结 学习方式 一.监督式学习: 1.分类 2.回归 补充--线性回归与逻辑回归 二.非监督式学习: 三.半监督式学习: 四.强化学习: 算法类似性 一.回 ...

  9. 【机器学习】算法原理详细推导与实现(七):决策树算法

    [机器学习]算法原理详细推导与实现(七):决策树算法 在之前的文章中,对于介绍的分类算法有逻辑回归算法和朴素贝叶斯算法,这类算法都是二分类的分类器,但是往往只实际问题中yyy不仅仅只有{0,1}\{0 ...

最新文章

  1. 一文看懂70年的人工智能简史
  2. 基于python的大数据分析实战学习笔记-pandas(数据分析包)
  3. 美团点评SQL优化工具SQLAdvisor开源
  4. java程序_Java程序员必备----Java命令大全
  5. excel appliacation 不能分配角色_用了5年Excel,换了这个神奇的报表工具,不禁感叹:国产真香...
  6. [react-router] React-Router怎么获取URL的参数?
  7. “约见”面试官系列之常见面试题第三篇说说常用的es6语法(建议收藏)
  8. 计算机网络重要机制(一)可靠数据传输
  9. python process_Python Process/Thread 概念整理
  10. 案例分析:倾斜值传入导致 SQL 资源消耗升高
  11. 想用最新追剧的影视图片作为手机壁纸桌面就到高图网
  12. 如何有效实现软件的需求管理(1)
  13. 拓端tecdat|R语言分位数回归、GAM样条曲线、指数平滑和SARIMA对电力负荷时间序列预测
  14. ivms 4200 linux_iVMS-4200E 海康威视微服务器系列NVR 集成海康硬件和软件实现灵活的一站式解决方案_...
  15. 洛谷P1792 [国家集训队]种树 题解
  16. Win11系统svchost.exe一直在下载怎么办?
  17. 超详细分解c 语言——实现扫雷游戏(详解)
  18. JavaScript的escape和encodeURI
  19. [转]辨别常见与不常见音乐文件格式的质量好坏!
  20. SAP MB5B报表ALV显示

热门文章

  1. c++ 一个函数包括多个返回值判断_go语言学习笔记(10)-函数、包的使用
  2. php 5.6 zend opcache,使用Zend OpCache 提高 PHP 5.5+ 性能
  3. html5头像裁剪,移动端 上传头像 并裁剪功能(h5)
  4. Spring mvc @ RequestMapping
  5. docker 安装hadoop
  6. mysql limitorderby
  7. C语言 显示器键盘io
  8. Matplotlib 三维图像 入门
  9. Linux学习总结(65)——Linux 服务器安全强化的七个步骤
  10. Docker学习总结(50)——Docker 微服务优雅关闭