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

CART 算法,英文全称叫做 Classification And Regression Tree,中文叫做分类回归树。ID3 和 C4.5 算法能够生成二叉树或多叉树,而 CART 只支持二叉树。一同 CART 决议计划树比较特别,既能够作分类树,又能够作回归树。
我用下面的练习数据举个比方,你能看到不同作业的人,他们的年龄不同,学习时间也不同。如果我结构了一棵决议计划树,想要根据数据判别这个人的作业身份,这个就属于分类树,由于是从几个分类中来做挑选。如果是给定了数据,想要猜测这个人的年龄,那就属于回归树。

《数据分析实战 45 讲》 学习笔记 Day 11

分类树能够处理离散数据,也便是数据品种有限的数据,它输出的是样本的类别,而回归树能够对接连型的数值进行猜测,也便是数据在某个区间内都有取值的可能,它输出的是一个数值。
CART 分类树的作业流程
经过上一讲,咱们知道决议计划树的中心便是寻觅纯净的区分,因而引入了纯度的概念。在特点挑选上,咱们是经过核算“不纯度”来做判别的,ID3 是根据信息增益做判别,C4.5 在 ID3 的基础上做了改进,提出了信息增益率的概念。实践上 CART 分类树与 C4.5 算法相似,仅仅特点挑选的方针选用的是基尼系数。你可能在经济学中听过说基尼系数,它是用来衡量一个国家收入距离的常用方针。当基尼系数大于 0.4 的时分,阐明财富差异悬殊。基尼系数在 0.2-0.4 之间阐明分配合理,财富距离不大。基尼系数本身反应了样本的不确定度。当基尼系数越小的时分,阐明样本之间的差异性小,不确定程度低。分类的进程本身是一个不确定度下降的进程,即纯度的提高进程。所以 CART 算法在结构分类树的时分,会挑选基尼系数最小的特点作为特点的区分。咱们接下来详解了解一下基尼系数。基尼系数不好懂,你最好跟着比方一同手动核算下。假定 t 为节点,那么该节点的 GINI 系数的核算公式为:

《数据分析实战 45 讲》 学习笔记 Day 11

这里 p(Ck|t) 表明节点 t 属于类别 Ck 的概率,节点 t 的基尼系数为 1 减去各类别 Ck 概率平方和。经过下面这个比方,咱们核算一下两个调集的基尼系数别离为多少:调集 1:6 个都去打篮球;调集 2:3 个去打篮球,3 个不去打篮球。针对调集 1,一切人都去打篮球,所以 p(Ck|t)=1,因而 GINI(t)=1-1=0。针对调集 2,有一半人去打篮球,而另一半不去打篮球,所以,p(C1|t)=0.5,p(C2|t)=0.5,GINI(t)=1-(0.50.5+0.50.5)=0.5。经过两个基尼系数你能够看出,调集 1 的基尼系数最小,也证明样本最稳定,而调集 2 的样本不稳定性更大。在 CART 算法中,根据基尼系数对特征特点进行二元割裂,假定特点 A 将节点 D 区分成了 D1 和 D2,如下图所示:

《数据分析实战 45 讲》 学习笔记 Day 11

所以在特点 A 的区分下,节点 D 的基尼系数为:

《数据分析实战 45 讲》 学习笔记 Day 11
节点 D 被特点 A 区分后的基尼系数越大,样本调集的不确定性越大,也便是不纯度越高。

怎么运用 CART 算法来创立分类树

经过上面的解说你能够知道,CART 分类树实践上是根据基尼系数来做特点区分的。在 Python 的 sklearn 中,如果咱们想要创立 CART 分类树,能够直接运用 DecisionTreeClassifier 这个类。创立这个类的时分,默认状况下 criterion 这个参数等于 gini,也便是按照基尼系数来挑选特点区分,即默认选用的是 CART 分类树。下面,咱们来用 CART 分类树,给 iris 数据集结构一棵分类决议计划树。iris 这个数据集,我在 Python 可视化中讲到过,实践上在 sklearn 中也自带了这个数据集。根据 iris 数据集,结构 CART 分类树的代码如下: `

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_iris

预备数据集

iris=load_iris()

获取特搜集和分类标识

features = iris.data labels = iris.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)` 首要 train_test_split 能够协助咱们把数据集抽取一部分作为测验集,这样咱们就能够得到练习集和测验集。运用 clf = DecisionTreeClassifier(criterion=‘gini’) 初始化一棵 CART 分类树。这样你就能够对 CART 分类树进行练习。运用 clf.fit(train_features, train_labels) 函数,将练习集的特征值和分类标识作为参数进行拟合,得到 CART 分类树。运用 clf.predict(test_features) 函数进行猜测,传入测验集的特征值,能够得到测验成果 test_predict。最终运用 accuracy_score(test_labels, test_predict) 函数,传入测验集的猜测成果与实践的成果作为参数,得到准确率 score。咱们能看到 sklearn 帮咱们做了 CART 分类树的运用封装,运用起来仍是很便利的。
CART 回归树的作业流程
CART 回归树区分数据集的进程和分类树的进程是一样的,仅仅回归树得到的猜测成果是接连值,而且评判“不纯度”的方针不同。在 CART 分类树中选用的是基尼系数作为规范,那么在 CART 回归树中,怎么点评“不纯度”呢?实践上咱们要根据样本的混乱程度,也便是样本的离散程度来点评“不纯度”。样本的离散程度具体的核算方法是,先核算一切样本的均值,然后核算每个样本值到均值的差值。咱们假定 x 为样本的个别,均值为 u。为了核算样本的离散程度,咱们能够取差值的肯定值,或许方差。其间差值的肯定值为样本值减去样本均值的肯定值:

《数据分析实战 45 讲》 学习笔记 Day 11

方差为每个样本值减去样本均值的平方和除以样本个数:

《数据分析实战 45 讲》 学习笔记 Day 11

所以这两种节点区分的规范,别离对应着两种方针函数最优化的规范,即用最小肯定差错(LAD),或许运用最小二乘差错(LSD)。这两种方法都能够让咱们找到节点区分的方法,一般运用最小二乘差错的状况更常见一些。咱们能够经过一个比方来看下怎么创立一棵 CART 回归树来做猜测。
怎么运用 CART 回归树做猜测
这里咱们运用到 sklearn 自带的波士顿房价数据集,该数据集给出了影响房价的一些方针,比方犯罪率,房产税等,最终给出了房价。根据这些方针,咱们运用 CART 回归树对波士顿房价进行猜测,代码如下:
`

encoding=utf-8

from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split from sklearn.datasets import load_boston from sklearn.metrics import r2_score,mean_absolute_error,mean_squared_error from sklearn.tree import DecisionTreeRegressor

预备数据集

boston=load_boston()

探究数据

print(boston.feature_names)

获取特搜集和房价

features = boston.data prices = boston.target

随机抽取33%的数据作为测验集,其余为练习集

train_features, test_features, train_price, test_price = train_test_split(features, prices, test_size=0.33)

创立CART回归树

dtr=DecisionTreeRegressor()

拟合结构CART回归树

dtr.fit(train_features, train_price)

猜测测验集中的房价

predict_price = dtr.predict(test_features)

测验集的成果点评

print(‘回归树二乘差错均值:’, mean_squared_error(test_price, predict_price)) print(‘回归树肯定值差错均值:’, mean_absolute_error(test_price, predict_price)) `
咱们来看下这个比方,首要加载了波士顿房价数据集,得到特搜集和房价。然后经过 train_test_split 协助咱们把数据集抽取一部分作为测验集,其余作为练习集。运用 dtr=DecisionTreeRegressor() 初始化一棵 CART 回归树。运用 dtr.fit(train_features, train_price) 函数,将练习集的特征值和成果作为参数进行拟合,得到 CART 回归树。运用 dtr.predict(test_features) 函数进行猜测,传入测验集的特征值,能够得到猜测成果 predict_price。最终咱们能够求得这棵回归树的二乘差错均值,以及肯定值差错均值。咱们能看到 CART 回归树的运用和分类树相似,仅仅最终求得的猜测值是个接连值。
CART 决议计划树的剪枝CART 决议计划树的剪枝首要选用的是 CCP 方法,它是一种后剪枝的方法,英文全称叫做 cost-complexity prune,中文叫做代价复杂度。这种剪枝方法用到一个方针叫做节点的外表差错率增益值,以此作为剪枝前后差错的定义。用公式表明则是:

《数据分析实战 45 讲》 学习笔记 Day 11

其间 Tt 代表以 t 为根节点的子树,C(Tt) 表明节点 t 的子树没被裁剪时子树 Tt 的差错,C(t) 表明节点 t 的子树被剪枝后节点 t 的差错,|Tt|代子树 Tt 的叶子数,剪枝后,T 的叶子数减少了|Tt|-1。所以节点的外表差错率增益值等于节点 t 的子树被剪枝后的差错变化除以剪掉的叶子数量。由于咱们期望剪枝前后差错最小,所以咱们要寻觅的便是最小值对应的节点,把它剪掉。这时分生成了第一个子树。重复上面的进程,继续剪枝,直到最终只剩下根节点,即为最终一个子树。得到了剪枝后的子树调集后,咱们需求用验证集对一切子树的差错核算一遍。能够经过核算每个子树的基尼指数或许平方差错,取差错最小的那个树,得到咱们想要的成果。总结今天我给你讲了 CART 决议计划树,它是一棵决议计划二叉树,既能够做分类树,也能够做回归树。你需求记住的是,作为分类树,CART 选用基尼系数作为节点区分的根据,得到的是离散的成果,也便是分类成果;作为回归树,CART 能够选用最小肯定差错(LAD),或许最小二乘差错(LSD)作为节点区分的根据,得到的是接连值,即回归猜测成果。最终咱们来收拾下三种决议计划树之间在特点挑选规范上的差异:ID3 算法,根据信息增益做判别;C4.5 算法,根据信息增益率做判别;CART 算法,分类树是根据基尼系数做判别。回归树是根据差错做判别。实践上这三个方针也是核算“不纯度”的三种核算方法。在东西运用上,咱们能够运用 sklearn 中的 DecisionTreeClassifier 创立 CART 分类树,经过 DecisionTreeRegressor 创立 CART 回归树。你能够用代码自己跑一遍我在文稿中举到的比方。

《数据分析实战 45 讲》 学习笔记 Day 11