理解CART决策树

CART算法

原理

CART全称为Classification and Regression Tree。

回归树

相比ID3,CART遍历所有的特征和特征值,然后使用二元切分法划分数据子集,也就是每个节点都只会分裂2个分支。接着计算数据子集的总方差来度量数据子集的混乱程度,总方差越小数据子集越纯,最后选择总方差最小的划分方式对应的特征和特征值,而二元切分的依据就是将小于等于这个特征值和大于这个特征值的数据划分为两块。这里说的总方差一般就是通过数据子集的样本输出值的均方差 * 数据子集的样本个数来计算。最后的输出结果是取各叶子节点数据的中位数或均值。

分类树

相比ID3,CART一般选择基尼不纯度来代替信息增益的方式度量数据子集的不纯度。基尼不纯度越小,数据纯度越高。相比回归树,分类树对于离散或者连续特征的处理都是采用二元切分的方式,但是在数据子集的混乱程度的计算上,是用基尼不纯度替代总方差的方式。

基尼不纯度的定义:从一个数据集中随机选取子项,度量其被错误的划分到其他组里的概率。

先不着急理解这句话,先看下面对基尼不纯度的表达式的解释。

  • 假设一个数据集中有K个类别,第k个类别的概率为p_k, 则基尼系数的表达式为:

    上面的公式中,p_k表示第k个类别出现的概率,那么1-p_k显然就是当前数据集中,除了第k个类别以外的其他所有类别出现的概率,所以两者相乘就是当前数据集中,第k个类别和其他所有类别都出现的概率,这个概率越高,数据集越不纯。
    现在再看上面的定义,应该就好理解了吧。
  • 对于个给定的样本D,假设有K个类别, 第k个类别的数量为CkCk,则样本D的基尼系数表达式为:
  • 对于样本D,如果根据特征A的某个值a,把D分成D1和D2两部分,则在特征A的条件下,D的基尼系数表达式为:

算法库调用

在scikit-learn库中的决策树算法是使用了调优过的CART算法,既可以做分类,又可以做回归。

代码

分类树对应DecisionTreeClassifier,回归树对应DecisionTreeRegressor。代码示例和参数说明如下:

from sklearn.tree import DecisionTreeClassifier
clf_dt = DecisionTreeClassifier()
clf_dt.fit(train_X, train_y)
predictions_dt = clf_dt.predict(test_X)[:,None]

参数

参数 DecisionTreeClassifier DecisionTreeRegressor
criterion 特征选择标准。可以使用"gini"或者"entropy",前者代表基尼系数,后者代表信息增益。一般说使用默认的基尼系数"gini"就可以了,即CART算法。除非你更喜欢类似ID3, C4.5的最优特征选择方法。? 可以使用"mse"或者"mae",前者是均方差,后者是和均值之差的绝对值之和。推荐使用默认的"mse"。一般来说"mse"比"mae"更加精确。除非你想比较二个参数的效果的不同之处。
splitter 特征划分点选择标准。可以使用"best"或者"random"。前者在特征的所有划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。默认的"best"适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐"random"? 同左。
max_features 划分时考虑的最大特征数。 可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2Nlog2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N??√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。 同左。
max_depth ?决策树的最大深度。默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。 同左。
min_samples_split 内部节点再划分所需最小样本数。这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。?默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。我之前的一个项目例子,有大概10万样本,建立决策树时,我选择了min_samples_split=10。可以作为参考。 同左。
min_samples_leaf 叶子节点最少样本数。 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。?默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。之前的10万样本项目使用min_samples_leaf的值为5,仅供参考。
min_weight_fraction_leaf 叶子节点最小的样本权重和。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。?默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。 同左。
max_leaf_nodes 最大叶子节点数。通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。 同左。
class_weight 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,或者用“balanced”,如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的"None" 不适用于回归树。
min_impurity_split 节点划分最小不纯度。这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点不再生成子节点。即为叶子节点?。 同左。
presort 数据是否预排序。这个值是布尔值,默认是False不排序。一般来说,如果样本量少或者限制了一个深度很小的决策树,设置为true可以让划分点选择更加快,决策树建立的更加快。如果样本量太大的话,反而没有什么好处。问题是样本量少的时候,我速度本来就不慢。所以这个值一般懒得理它就可以了。 同左。

决策树可视化

安装graphviz

可视化需要先安装graphviz,这是一个开源的图形可视化软件,官网:https://graphviz.gitlab.io,下载适合自己操作系统的文件即可。

如果是windows操作系统,可以点此下载安装包。安装完成记得设置一下环境变量将 xxx/Graphviz2.38/bin/加入PATH

安装python插件:

pip install graphviz
pip install?pydotplus

代码示例

from sklearn.datasets import load_iris
from sklearn import tree
import pydotplus
import os
# 如果执行程序总是找不到Graphviz命令,可以加入下面这行代码,注意修改路径为你的正确的Graphviz/bin目录的路径
os.environ["PATH"] += os.pathsep + 'H:/program_files/Graphviz2.38/bin'
# 训练模型
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
# 用pydotplus生成iris.pdf
dot_data = tree.export_graphviz(clf, out_file=None,
                                feature_names=iris.feature_names,
                                class_names=iris.target_names,
                                filled=True, rounded=True,
                                special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("iris.pdf")

查看pdf文件

参考资料

https://www.cnblogs.com/pinard/p/6056319.html

https://blog.csdn.net/JJBOOM425/article/details/79997440

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_tree.pyx

ok,本篇就这么多内容啦~,感谢阅读O(∩_∩)O。

原文地址:https://www.cnblogs.com/anai/p/12160820.html

时间: 2024-10-13 11:36:15

理解CART决策树的相关文章

(二)《机器学习》(周志华)第4章 决策树 笔记 理论及实现——“西瓜树”——CART决策树

CART决策树 (一)<机器学习>(周志华)第4章 决策树 笔记 理论及实现--"西瓜树" 参照上一篇ID3算法实现的决策树(点击上面链接直达),进一步实现CART决策树. 其实只需要改动很小的一部分就可以了,把原先计算信息熵和信息增益的部分换做计算基尼指数,选择最优属性的时候,选择最小的基尼指数即可. #导入模块 import pandas as pd import numpy as np from collections import Counter #数据获取与处理

机器学习回顾篇(8):CART决策树算法

注:本系列所有博客将持续更新并发布在github和gitee上,您可以通过github.gitee下载本系列所有文章笔记文件. 1 引言 上一篇博客中介绍了ID3和C4.5两种决策树算法,这两种决策树都只能用于分类问题,而本文要说的CART(classification and regression tree)决策树不仅能用于分类问题,也能用于回归问题. 与ID3算法和C4.5算法相比,CART 还有个特性就是其所有非叶子结点都只有两个子树,也就是说在根据特征属性分裂数据集时,无论该特征属性有多

决策树归纳一般框架(ID3,C4.5,CART)

感性认识决策树 构建决策树的目的是对已有的数据进行分类,得到一个树状的分类规则,然后就可以拿这个规则对未知的数据进行分类预测. 决策树归纳是从有类标号的训练元祖中学习决策树. 决策树是一种类似于流程图的树结构,其中每个内部节点(非树叶结点)表示一个属性上的测试,每个分支代表该测试上的一个输出,而每个树叶结点(或终端结点)存放一个类标号.树的最顶层结点是根结点.一个典型的决策树如下图所示, 该决策树是通过下表所示的训练元组和它们对应的类标号得到的, 为什么决策树如此流行 决策树分类器的构造不需要任

机器学习经典算法详解及Python实现--CART分类决策树、回归树和模型树

摘要: Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Regression Tree),本文介绍了CART用于离散标签分类决策和连续特征回归时的原理.决策树创建过程分析了信息混乱度度量Gini指数.连续和离散特征的特殊处理.连续和离散特征共存时函数的特殊处理和后剪枝:用于回归时则介绍了回归树和模型树的原理.适用场景和创建过程.个人认为,回归树和模型树

用决策树(CART)解决iris分类问题

首先先看Iris数据集 Sepal.Length--花萼长度 Sepal.Width--花萼宽度 Petal.Length--花瓣长度 Petal.Width--花瓣宽度 通过上述4中属性可以预测花卉属于Setosa,Versicolour,Virginica 三个种类中的哪一类 决策树 by CART 决策树有挺多种,这里讲下CART CART的执行过程是这样的: 用特征值k和下限tk二分子集 不断二分,直到到达最大深度或者划分不能再减少不纯度为止 这一下sklearn都会自动帮我们完成,我们

02-23 决策树CART算法

[TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ 决策树CART算法 决策树C4.5算法虽然对决策树ID3算法做了很大的改良,但是缺点也是很明显的,无法处理回归问题.使用较为复杂的熵来作为特征选择的标准.生成的决策树是一颗较为复杂的多叉树结构,CART算法针对这些问题又做了进一步的优化. 一.决策树CART算法学习目标 基尼指数和熵 CART算法对连续值和特

ID3、C4.5、CART、RandomForest的原理

决策树意义: 分类决策树模型是表示基于特征对实例进行分类的树形结构.决策树可以转换为一个if_then规则的集合,也可以看作是定义在特征空间划分上的类的条件概率分布. 它着眼于从一组无次序.无规则的样本数据(概念)中推理出决策树表示形式的分类规则.假设这里的样本数据应该能够用“属性—结论”.决策树学习旨在构建一个与训练数据拟合很好,并且复杂度小的一个可以自动对数据进行分类的树形结构,是树形结构的知识表示,可以直接转换为分类规则.因为从可能的决策树中直接选取最优决策树是NP完全问题,现实中采用启发

决策树(回归树)分析及应用建模

一.CART决策树模型概述(Classification And Regression Trees) 决策树是通过一系列规则对数据进行分类的过程.它提供一种在什么条件下会得到什么值的类似规则的方法.??决策树算法属于有指导的学习,即原数据必须包含预测变量和目标变量.决策树分为分类决策树(目标变量为分类型数值)和回归决策树(目标变量为连续型变量).分类决策树叶节点所含样本中,其输出变量的众数就是分类结果:回归树的叶节点所含样本中,其输出变量的平均值就是预测结果.? 决策树是一种倒立的树结构,它由内

手把手生成决策树(dicision tree)

手把手生成决策树(dicision tree) 主要參考资料: Peter HARRINGTON.机器学习实战[M].李锐,李鹏,曲亚东,王斌译.北京:人民邮电出版社, 2013. 李航.统计学习方法[M].北京:清华大学出版社, 2012 原文链接:http://blog.csdn.net/xuelabizp/article/details/50979469 1.什么是决策树 决策树是一种主要的分类和回归方法.本文主要解说用于分类的决策树. 决策树就是依据相关的条件进行分类的一种树形结构,比方