在之前介绍过决策树的ID3算法实现,今天主要来介绍决策树的另一种实现,即CART算法

Contents

   1. CART算法的认识

   2. CART算法的原理

   3. CART算法的实现

1. CART算法的认识

Classification And Regression Tree,即分类回归树算法,简称CART算法,它是决策树的一种实现,通

常决策树主要有三种实现,分别是ID3算法,CART算法和C4.5算法。

CART算法是一种二分递归分割技术,把当前样本划分为两个子样本,使得生成的每个非叶子结点都有两个分支,

因此CART算法生成的决策树是结构简洁的二叉树。由于CART算法构成的是一个二叉树,它在每一步的决策时只能

是“是”或者“否”,即使一个feature有多个取值,也是把数据分为两部分。在CART算法中主要分为两个步骤

(1)将样本递归划分进行建树过程

(2)用验证数据进行剪枝

2. CART算法的原理

上面说到了CART算法分为两个过程,其中第一个过程进行递归建立二叉树,那么它是如何进行划分的 ?

代表单个样本的个属性,表示所属类别。CART算法通过递归的方式将维的空间划分为不重

叠的矩形。划分步骤大致如下

(1)选一个自变量,再选取的一个值维空间划分为两部分,一部分的所有点都满足

另一部分的所有点都满足,对非连续变量来说属性值的取值只有两个,即等于该值或不等于该值。

(2)递归处理,将上面得到的两部分按步骤(1)重新选取一个属性继续划分,直到把整个维空间都划分完。

在划分时候有一个问题,它是按照什么标准来划分的 ? 对于一个变量属性来说,它的划分点是一对连续变量属

性值的中点。假设个样本的集合一个属性有个连续的值,那么则会有个分裂点,每个分裂点为相邻

两个连续值的均值。每个属性的划分按照能减少的杂质的量来进行排序,而杂质的减少量定义为划分前的杂质减

去划分后的每个节点的杂质量划分所占比率之和。而杂质度量方法常用Gini指标,假设一个样本共有类,那么

一个节点的Gini不纯度可定义为

其中表示属于类的概率,当Gini(A)=0时,所有样本属于同类,所有类在节点中以等概率出现时,Gini(A)

最大化,此时

有了上述理论基础,实际的递归划分过程是这样的:如果当前节点的所有样本都不属于同一类或者只剩下一个样

本,那么此节点为非叶子节点,所以会尝试样本的每个属性以及每个属性对应的分裂点,尝试找到杂质变量最大

的一个划分,该属性划分的子树即为最优分支。

下面举个简单的例子,如下图

在上述图中,属性有3个,分别是有房情况,婚姻状况和年收入,其中有房情况和婚姻状况是离散的取值,而年

收入是连续的取值。拖欠贷款者属于分类的结果。

假设现在来看有房情况这个属性,那么按照它划分后的Gini指数计算如下

而对于婚姻状况属性来说,它的取值有3种,按照每种属性值分裂后Gini指标计算如下

最后还有一个取值连续的属性,年收入,它的取值是连续的,那么连续的取值采用分裂点进行分裂。如下

根据这样的分裂规则CART算法就能完成建树过程。

建树完成后就进行第二步了,即根据验证数据进行剪枝。在CART树的建树过程中,可能存在Overfitting,许多

分支中反映的是数据中的异常,这样的决策树对分类的准确性不高,那么需要检测并减去这些不可靠的分支。决策

树常用的剪枝有事前剪枝和事后剪枝,CART算法采用事后剪枝,具体方法为代价复杂性剪枝法。可参考如下链接

剪枝参考:http://www.cnblogs.com/zhangchaoyang/articles/2709922.html

3. CART算法的实现

以下代码是网上找的CART算法的MATLAB实现。

[plain] view plaincopy
  1. CART
  2. function D = CART(train_features, train_targets, params, region)
  3. % Classify using classification and regression trees
  4. % Inputs:
  5. % features - Train features
  6. % targets     - Train targets
  7. % params - [Impurity type, Percentage of incorrectly assigned samples at a node]
  8. %                   Impurity can be: Entropy, Variance (or Gini), or Missclassification
  9. % region     - Decision region vector: [-x x -y y number_of_points]
  10. %
  11. % Outputs
  12. % D - Decision sufrace
  13. [Ni, M]    = size(train_features);
  14. %Get parameters
  15. [split_type, inc_node] = process_params(params);
  16. %For the decision region
  17. N           = region(5);
  18. mx          = ones(N,1) * linspace (region(1),region(2),N);
  19. my          = linspace (region(3),region(4),N)' * ones(1,N);
  20. flatxy      = [mx(:), my(:)]';
  21. %Preprocessing
  22. [f, t, UW, m]   = PCA(train_features, train_targets, Ni, region);
  23. train_features  = UW * (train_features - m*ones(1,M));;
  24. flatxy          = UW * (flatxy - m*ones(1,N^2));;
  25. %Build the tree recursively
  26. disp('Building tree')
  27. tree        = make_tree(train_features, train_targets, M, split_type, inc_node, region);
  28. %Make the decision region according to the tree
  29. disp('Building decision surface using the tree')
  30. targets = use_tree(flatxy, 1:N^2, tree);
  31. D = reshape(targets,N,N);
  32. %END
  33. function targets = use_tree(features, indices, tree)
  34. %Classify recursively using a tree
  35. if isnumeric(tree.Raction)
  36. %Reached an end node
  37. targets = zeros(1,size(features,2));
  38. targets(indices) = tree.Raction(1);
  39. else
  40. %Reached a branching, so:
  41. %Find who goes where
  42. in_right    = indices(find(eval(tree.Raction)));
  43. in_left     = indices(find(eval(tree.Laction)));
  44. Ltargets = use_tree(features, in_left, tree.left);
  45. Rtargets = use_tree(features, in_right, tree.right);
  46. targets = Ltargets + Rtargets;
  47. end
  48. %END use_tree
  49. function tree = make_tree(features, targets, Dlength, split_type, inc_node, region)
  50. %Build a tree recursively
  51. if (length(unique(targets)) == 1),
  52. %There is only one type of targets, and this generates a warning, so deal with it separately
  53. tree.right      = [];
  54. tree.left       = [];
  55. tree.Raction    = targets(1);
  56. tree.Laction    = targets(1);
  57. break
  58. end
  59. [Ni, M] = size(features);
  60. Nt      = unique(targets);
  61. N       = hist(targets, Nt);
  62. if ((sum(N < Dlength*inc_node) == length(Nt) - 1) | (M == 1)),
  63. %No further splitting is neccessary
  64. tree.right      = [];
  65. tree.left       = [];
  66. if (length(Nt) ~= 1),
  67. MLlabel   = find(N == max(N));
  68. else
  69. MLlabel   = 1;
  70. end
  71. tree.Raction    = Nt(MLlabel);
  72. tree.Laction    = Nt(MLlabel);
  73. else
  74. %Split the node according to the splitting criterion
  75. deltaI = zeros(1,Ni);
  76. split_point = zeros(1,Ni);
  77. op = optimset('Display', 'off');
  78. for i = 1:Ni,
  79. split_point(i) = fminbnd('CARTfunctions', region(i*2-1), region(i*2), op, features, targets, i, split_type);
  80. I(i) = feval('CARTfunctions', split_point(i), features, targets, i, split_type);
  81. end
  82. [m, dim] = min(I);
  83. loc = split_point(dim);
  84. %So, the split is to be on dimention 'dim' at location 'loc'
  85. indices = 1:M;
  86. tree.Raction= ['features(' num2str(dim) ',indices) >  ' num2str(loc)];
  87. tree.Laction= ['features(' num2str(dim) ',indices) <= ' num2str(loc)];
  88. in_right    = find(eval(tree.Raction));
  89. in_left     = find(eval(tree.Laction));
  90. if isempty(in_right) | isempty(in_left)
  91. %No possible split found
  92. tree.right      = [];
  93. tree.left       = [];
  94. if (length(Nt) ~= 1),
  95. MLlabel   = find(N == max(N));
  96. else
  97. MLlabel = 1;
  98. end
  99. tree.Raction    = Nt(MLlabel);
  100. tree.Laction    = Nt(MLlabel);
  101. else
  102. %...It's possible to build new nodes
  103. tree.right = make_tree(features(:,in_right), targets(in_right), Dlength, split_type, inc_node, region);
  104. tree.left  = make_tree(features(:,in_left), targets(in_left), Dlength, split_type, inc_node, region);
  105. end
  106. end

在Julia中的决策树包:https://github.com/bensadeghi/DecisionTree.jl/blob/master/README.md

决策树之CART算法相关推荐

  1. 决策树一一CART算法(第三部分)

    决策树一一CART算法(第三部分) CART-回归树模型 ​ 如果输出变量是 连续 的,对应的就是 回归 问题,对于决策树而言,输出的信息一定就是叶子结点,所以需要将连续变量按照一定的要求划分. 回归 ...

  2. 决策树一CART算法(第四部分)

    决策树一CART算法(第四部分) CART树的剪枝:算法步骤 输入:CART算法生成的决策树. 输出:最优决策树T 设K=0,T=T0K=0,T=T_0K=0,T=T0​ ,从完整的决策树出发 ​ k ...

  3. 【机器学习基础】数学推导+纯Python实现机器学习算法5:决策树之CART算法

    目录 CART概述 回归树 分类树 剪枝 Python实现示例:分类树 在数学推导+纯Python实现机器学习算法4:决策树之ID3算法中笔者已经对决策树的基本原理进行了大概的论述.本节将在上一讲的基 ...

  4. 决策树(CART算法)针对中文文本分类

    改编自博客: http://blog.csdn.net/github_36326955/article/details/54891204 根据下面的参考了链接可知,sklearn中的决策树用的是CAR ...

  5. 决策树之CART 算法(回归树,分类树)

    CART 算法,英文全称叫做 Classification And Regression Tree,中文叫做分类回归树. ID3 和 C4.5 算法可以生成二叉树或多叉树,而 CART 只支持二叉树. ...

  6. 【机器学习】通过ID3,C4.5,CART算法构建决策树

    决策树 (一).决策树的简介 (二).构造决策树的三种构造方法 1.基于信息增益生成决策树(ID3算法) 2.基于信息增益率生成决策树(C4.5算法) 3.基于基尼指数生成决策树(CART算法) 总结 ...

  7. python 实现CART算法决策树

    有用请点赞,没用请差评. 欢迎分享本文,转载请保留出处. 本次代码是基于上一节决策树ID3\C45修改过来的,建议两篇博客一起看.具体算法原理等有时间了再写. # -*- coding:utf-8 - ...

  8. 决策树CART算法、基尼系数的计算方法和含义

    决策树CART算法--基尼系数 决策树的CART算法使用基尼系数来选择划分属性.一个数据集的纯度可以用基尼系数来度量 Gini(D)=∑k=1∣y∣∑k′≠kpkpk′=1−∑k=1∣y∣pk2\be ...

  9. 决策树数学原理(ID3,c4.5,cart算法)

    上面这个图就是一棵典型的决策树.我们在做决策树的时候,会经历两个阶段:构造和剪枝. 构造 简单来说,构造的过程就是选择什么属性作为节点的过程,那么在构造过程中,会存在三种节点: 根节点:就是树的最顶端 ...

  10. 分类算法之决策树CART算法

    1. CART算法的认识 Classification And Regression Tree,即分类回归树算法,简称CART算法,它是决策树的一种实现,通常决策树主要有三种实现,分别是ID3算法,C ...

最新文章

  1. python中使用html前端页面显示图像预测结果(改进)
  2. angular directive 深入理解
  3. 采用dlopen、dlsym、dlclose dlopen dlerror加载动态链接库【总结】
  4. plsql窗口文件怎么找回_电脑文件丢失怎么找回?知道原因和方法很关键
  5. java空间租用_java影片租赁平台
  6. 吴裕雄 python 神经网络——TensorFlow 图、张量及会话
  7. postman安装_Postman插件的应用与实战(二)
  8. Android adb logcat使用技巧
  9. Windows Server Version 1709 管理之入门篇
  10. vs2010中引入boost库
  11. PAT (Basic Level) Practice1004 成绩排名
  12. 这几个概念你可能还是没搞清require、import和export
  13. CSS 相邻选择器(七)
  14. Linux之YUM方式安装SVN
  15. 【Android 四大组件之Content Provider】一文吃透 BroadcastReceiver 广播接收器
  16. 跟计算机断层扫描相关的技术,数字化X线摄影设备、计算机断层扫描设备和相关方法与流程...
  17. E280-2G4T12S(SX1280)_STM21F1X驱动分享
  18. 视觉惯性单目SLAM (五)矩阵微积分
  19. python修改图片大小为30kb_关于python:生成小于10KB且未丢失比例的图像缩略图
  20. Python地理数据处理 十五:基于arcpy的批量操作

热门文章

  1. 石油大学计算机课程,2018年石油高校计算机类课程MOOC共建研讨会在我校召开
  2. unity 打包时 StreamingAssets文件的数目过多
  3. 1、高动态范围成像介绍
  4. 程序员的8个职业发展方向,了解一下!
  5. 案例:模拟京东快递单号查询 字体放大显示
  6. TeamViewer 被发现用于(检测为)商业用途解决方案(亲测有效 )
  7. CFA一级学习笔记--衍生品(二)--定价与估值
  8. SnapGene快速入门,界面及常用操作教程
  9. 计算机配置怎么造假,骗局揭秘:卖你一台假电脑 再送你一个假鲁大师
  10. matlab l 汉字字符串,Matlab中汉字编码的操作