数据分析实战 45 讲
陈旸
清华大学计算机博士
123928 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
第二模块:数据分析算法篇 (20讲)
第四模块:数据分析工作篇 (2讲)
数据分析实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

18丨决策树(中):CART,一棵是回归树,另一棵是分类树

节点的表面误差率增益值
代价复杂度
偏差做判断
基尼系数
信息增益率
信息增益
CCP方法
DecisionTreeRegressor
DecisionTreeClassifier
创建回归树
创建分类树
基尼系数计算
属性选择
寻找纯净的划分
选择属性划分
衡量不确定度
绝对值偏差均值
二乘偏差均值
波士顿房价数据集
准确率
iris数据集
CART算法
C4.5算法
ID3算法
剪枝
使用方法
工作流程
基尼系数
二叉树
Classification And Regression Tree
基于偏差做判断
预测连续值
基于基尼系数做判断
输出样本的类别
处理离散数据
CART回归树
CART分类树
差异
CART算法
回归树
分类树
示例
决策树

该思维导图由 AI 生成,仅供参考

上节课我们讲了决策树,基于信息度量的不同方式,我们可以把决策树分为 ID3 算法、C4.5 算法和 CART 算法。今天我来带你学习 CART 算法。CART 算法,英文全称叫做 Classification And Regression Tree,中文叫做分类回归树。ID3 和 C4.5 算法可以生成二叉树或多叉树,而 CART 只支持二叉树。同时 CART 决策树比较特殊,既可以作分类树,又可以作回归树。
那么你首先需要了解的是,什么是分类树,什么是回归树呢?
我用下面的训练数据举个例子,你能看到不同职业的人,他们的年龄不同,学习时间也不同。如果我构造了一棵决策树,想要基于数据判断这个人的职业身份,这个就属于分类树,因为是从几个分类中来做选择。如果是给定了数据,想要预测这个人的年龄,那就属于回归树。
分类树可以处理离散数据,也就是数据种类有限的数据,它输出的是样本的类别,而回归树可以对连续型的数值进行预测,也就是数据在某个区间内都有取值的可能,它输出的是一个数值。

CART 分类树的工作流程

通过上一讲,我们知道决策树的核心就是寻找纯净的划分,因此引入了纯度的概念。在属性选择上,我们是通过统计“不纯度”来做判断的,ID3 是基于信息增益做判断,C4.5 在 ID3 的基础上做了改进,提出了信息增益率的概念。实际上 CART 分类树与 C4.5 算法类似,只是属性选择的指标采用的是基尼系数。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

CART算法是一种灵活的决策树算法,既可用于分类树,也可用于回归树。在分类树中,CART算法使用基尼系数来评估属性的划分纯度,通过基尼系数对特征属性进行二元分裂,从而构建分类树。而在回归树中,CART算法使用最小二乘偏差(LSD)来评价不纯度,通过计算样本的离散程度来划分节点,得到连续值的预测结果。读者可以通过Python的sklearn库来实现CART分类树和回归树的构建和预测,使用DecisionTreeClassifier和DecisionTreeRegressor类即可轻松完成。文章详细介绍了CART算法的工作流程和使用方法,对于想要学习决策树算法的读者来说,是一篇值得阅读的技术文章。此外,文章还介绍了CART决策树的剪枝方法,即CCP方法,以及三种决策树在属性选择标准上的差异。文章以清晰的实例代码和运行结果展示了CART算法的使用方法和准确率,为读者提供了实践操作的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据分析实战 45 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(64)

  • 最新
  • 精选
  • rainman
    置顶
    对于 CART 回归树的可视化,可以先在电脑上安装 graphviz;然后 pip install graphviz,这是安装python的库,需要依赖前面安装的 graphviz。可视化代码如下: ---- from sklearn.tree import export_graphviz import graphviz # 参数是回归树模型名称,不输出文件。 dot_data = export_graphviz(dtr, out_file=None) graph = graphviz.Source(dot_data) # render 方法会在同级目录下生成 Boston PDF文件,内容就是回归树。 graph.render('Boston') ---- 具体内容可以去 sklearn(https://scikit-learn.org/stable/modules/generated/sklearn.tree.export_graphviz.html) 和 graphviz(https://graphviz.readthedocs.io/en/stable/) 看看。

    编辑回复: 关于决策树可视化,大家可以看看这个。

    2019-02-15
    37
  • 小熊猫
    ID3:以信息增益作为判断标准,计算每个特征的信息增益,选取信息增益最大的特征,但是容易选取到取值较多的特征 C4.5:以信息增益比作为判断标准,计算每个特征的信息增益比,选取信息增益比最大的特征 CART:分类树以基尼系数为标准,选取基尼系数小的的特征 回归树以均方误差或绝对值误差为标准,选取均方误差或绝对值误差最小的特征 练习题: from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn import tree from sklearn.metrics import accuracy_score import graphviz # 准备手写数字数据集 digits = datasets.load_digits() # 获取特征和标识 features = digits.data labels = digits.target # 选取数据集的33%为测试集,其余为训练集 train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33) # 创建CART分类树 clf = tree.DecisionTreeClassifier() # 拟合构造CART分类树 clf.fit(train_features, train_labels) # 预测测试集结果 test_predict = clf.predict(test_features) # 测试集结果评价 print('CART分类树准确率:', accuracy_score(test_labels, test_predict)) # 画决策树 dot_data = tree.export_graphviz(clf, out_file=None) graph = graphviz.Source(dot_data) graph.render('CART//CART_practice_digits') CART分类树准确率: 0.8636363636363636

    作者回复: Good Job

    2019-02-15
    16
  • jake
    首先想问一个问题 就是在讲到基尼系数那里 有一个图那里的例子 什么D: 9个打篮球 3个不打篮球那里 那里的D的基尼系数用到了子节点归一化基尼系数之和这个方法求 请问D的基尼系数不能直接用 上面那个公式 也就是"1 - [p(ck|t)]^2"那个公式计算吗 我用这个公式计算出D的基尼系数为 1 - (9/12 * 9/12 + 3/12 * 3/12) = 6/16。 我也想问一下上面那个同学提的这个问题

    编辑回复: 单纯看节点D的基尼系数,采用公式:1 - [p(ck|t)]^2,也就是Gini(D)=1 - (9/12 * 9/12 + 3/12 * 3/12) = 0.375 同时,文章也计算了关于节点D,在属性A划分下的基尼系数的情况: Gini(D, A)=|D1|/|D|*Gini(D1) + |D2|/|D|*Gini(D2)=6/12*0+6/12*0.5=0.25 所以Gini(D)=0.375, Gini(D, A)=0.25

    2019-02-24
    2
    7
  • xfoolin
    ID3 是通过信息增益,选取信息增益最大的特征;C4.5 是通过信息增益率,选取,CART 是通过基尼系数,选取基尼系数最小的特征。 from sklearn.model_selection import train_test_split#训练集和测试集 from sklearn.metrics import mean_squared_error#二乘偏差均值 from sklearn.metrics import mean_absolute_error#绝对值偏差均值 from sklearn.datasets import load_digits#引入 digits 数据集 from sklearn.metrics import accuracy_score#测试结果的准确性 from sklearn import tree import graphviz #准备数据集 digits = load_digits() #获取数据集的特征集和分类标识 features = digits.data labels = digits.target #随机抽取 33% 的数据作为测试集,其余为训练集 train_features,test_features,train_labels,test_labels = \ train_test_split(features,labels,test_size = 0.33,random_state = 0) #创建 CART 分类树 clf = tree.DecisionTreeClassifier(criterion = 'gini') #拟合构造分类树 clf = clf.fit(train_features,train_labels) #用 CART 分类树做预测 test_predict = clf.predict(test_features) #预测结果与测试集作对比 score = accuracy_score(test_labels,test_predict) #输出准确率 print('准确率 %.4f'%score) dot_data = tree.export_graphviz(clf,out_file = None) graph = graphviz.Source(dot_data) #输出分类树图示 graph.view()

    作者回复: Good Job

    2019-02-19
    4
  • Lee
    # encoding=utf-8 from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_digits # 准备数据集 digits=load_digits() # 获取特征集和分类标识 features = digits.data labels = digits.target # 随机抽取 33% 的数据作为测试集,其余为训练集 train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0) # 创建 CART 分类树 clf = DecisionTreeClassifier(criterion='gini') # 拟合构造 CART 分类树 clf = clf.fit(train_features, train_labels) # 用 CART 分类树做预测 test_predict = clf.predict(test_features) # 预测结果与测试集结果作比对 score = accuracy_score(test_labels, test_predict) print("CART 分类树准确率 %.4lf" % score) CART 分类树准确率 0.8620

    作者回复: Good Job

    2019-01-24
    3
  • 雨先生的晴天
    scikit learn package 确实非常好用,很简洁。推荐大家也去官网看一看,请问一下怎样可以把decision tree 可视化呀?

    编辑回复: 评论中有人对决策树可视化做了解释,你可以看下。采用的是graphviz这个库,你需要先安装,然后使用。

    2019-01-27
    2
  • Mi compaero de armas
    老师您好,请问采用CART算法时,如果离散型属性的值不止两种还能使用CART算法吗

    作者回复: 可以用CART算法,另外GBDT里面默认使用的是CART,这是个在数据分析,机器学习中常用的模型

    2019-11-19
    1
  • Ronnyz
    第二问 ``` from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_digits digits = load_digits() # print(digits) features=digits.data labels = digits.target train_features,test_features,train_labels,test_labels=train_test_split(features,labels,test_size =0.33,random_state=0) clf = DecisionTreeClassifier(criterion='gini') clf=clf.fit(train_features,train_labels) predict_labels=clf.predict(test_features) print('分类准确度:',accuracy_score(test_labels,predict_labels)) ``` 分类准确度: 0.8619528619528619

    作者回复: 代码正确

    2019-11-11
    1
  • 许宇宝
    老师,看了两遍还是不明白分类的这个决策树是依据什么画出来的?

    作者回复: take it easy

    2019-07-18
    1
  • 羊小看
    1、为什么CRAT的基尼系数比C4.5的信息增益率好呢?既然sklearn库默认用的基尼系数,应该是这个好一些吧? 2、from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.tree import DecisionTreeClassifier #from sklearn.datasets import load_iris from sklearn.datasets import load_digits # 准备数据集 #iris=load_iris() digits=load_digits() # 获取特征集和分类标识 #features = iris.data #labels = iris.target features = digits.data labels = digits.target # 随机抽取 33% 的数据作为测试集,其余为训练集 train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0) # 创建 CART 分类树 clf = DecisionTreeClassifier(criterion='gini') # 拟合构造 CART 分类树 clf = clf.fit(train_features, train_labels) # 用 CART 分类树做预测 test_predict = clf.predict(test_features) # 预测结果与测试集结果作比对 score = accuracy_score(test_labels, test_predict) print("CART 分类树准确率 %.4lf" % score) CART 分类树准确率 0.8636

    作者回复: Good Job

    2019-05-10
    1
收起评论
显示
设置
留言
64
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部