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

上节课我们讲了决策树,基于信息度量的不同方式,我们可以把决策树分为 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
- 深入了解
- 翻译
- 解释
- 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据分析实战 45 讲》,新⼈⾸单¥59
《数据分析实战 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/) 看看。
编辑回复: 关于决策树可视化,大家可以看看这个。
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
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
27 - xfoolinID3 是通过信息增益,选取信息增益最大的特征;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
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
3 - 雨先生的晴天scikit learn package 确实非常好用,很简洁。推荐大家也去官网看一看,请问一下怎样可以把decision tree 可视化呀?
编辑回复: 评论中有人对决策树可视化做了解释,你可以看下。采用的是graphviz这个库,你需要先安装,然后使用。
2 - Mi compaero de armas老师您好,请问采用CART算法时,如果离散型属性的值不止两种还能使用CART算法吗
作者回复: 可以用CART算法,另外GBDT里面默认使用的是CART,这是个在数据分析,机器学习中常用的模型
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
作者回复: 代码正确
1 - 许宇宝老师,看了两遍还是不明白分类的这个决策树是依据什么画出来的?
作者回复: take it easy
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
1
收起评论