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

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

基于信息度量的不同方式,把决策树分为ID3算法、C4.5算法和CART算法,CART算法叫做分类回归树,ID3和C4.5算法可以生成二叉树或多叉树,而CART只支持二叉树,既可以作分类树,又可以作回归树

什么是分类树?什么是回归树?

决策树(中):CART,一颗是回归树,另一颗是分类树_第1张图片

能看到不同职业的人,年龄也不同,学习时长也不同,如果构造一颗决策树,想要基于数据判断这个人职业身份,就属于分类树,因为是从几个分类中来做选择,如果给定了数据,想要预测这个人的年龄,那就属于回归树。

所谓分类树就是面向分类的,每个决策树最末端的叶子结点出来的是一个分类标签,不是0就是1或者2等类别。回归树就是面向回归的,回归就是拟合函数一样,输出连续值,比如根据一大堆当天的特征输出明天的气温,气温是每个样本唯一输出的值,只不过输出的值根据特征的不一样输出值不一样而已,但是它们输出的意义是一样的,那就是都是气温。
分类树可以处理离散数据,也就是数据种类有限的数据,它输出的是样本的类别,而回归树可以对连续型的数值进行预测,也就是数据在某个区间内都有取值的可能,它输出的是一个数值

CART分类树的工作流程

决策树的核心就是寻找纯净的划分,在属性选择上,通过统计“不纯度”来判断的,ID3是基于信息增益做判断,C4.5在ID3基础上做引进,提出了信息增益率的概念,CART分类树属性选择的指标采用的是基尼系数,基尼系数本身反映了样本的不确定度,当基尼系数越小的时候说明样本之间的差异性小,不确定程度低,分类的过程本身是一个不确定度降低的过程,即纯度提升过程,所以CART算法在构造分类树的时候,会选择基尼系数最小的属性作为属性的划分

img

节点t的基尼系数为1减去各类别CK概率平方和,p(Ck|t)表示节点t属于类别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.5*0.5+0.5*0.5)=0.5,集合1的基尼系数最小,证明样本最稳定,在CART算法中,基于基尼系数对特征属性进行二元分裂,属性A将节点D划分为D1、D2

D:(9个打篮球,3个不打篮球) -> D1:6个打篮球

​ D2:3个打篮球,3个不打

节点D的基尼系数等于子节点D1和D2的归一化基尼系数之和img

归一化基尼系数代表的是每个子节点的基尼系数乘以该节点占整体父亲节点D中的比例,所以在属性A的划分下,节点D的基尼系数为:

img

节点D被属性A划分后的基尼系数越大,样本集合的不确定性越大,就是不纯度越高

如何使用CART算法来创建分类树

CART分类树可以在Python的sklearn中,创建CART分类树,直接使用DecisionTreeClassifier这个类,创建这个类的时候,默认criterion这个参数等于gini,就是按照基尼系数来选择属性划分,即默认采用CART分类树

用CART分类树,给iris数据集构造一颗分类决策树

# 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)

CART分类树准确率 0.9600

train_test_split抽取一部分作为测试集,可以得到测试集合训练集

使用clf=DecisionTreeClassifier(criterion=‘gini’)初始化一棵CART分类树,就可以对分类树进行训练

使用clf.fit(train_features,train_labels) 将训练集的特征值和分类标识作为参数进行拟合,得到CART分类树

使用clf.predict(test_features)进行预测,传入测试集的特征值,得到测试结果test_predict

最后使用accuracy_score(test_labels,test_predict)传入测试集的预测结果与实际结果作为参数得到准确率score

CART回归树的工作流程

CART回归树划分数据集的过程和分类树的过程是一样的,只是回归树得到的预测结果是连续值,且评判“不纯度”的指标不同,在CART回归树中,根据样本的混乱程度就是样本的离散程度来评价“不纯度”

样本的离散程度的计算方式是先计算所有样本的均值,然后计算每个样本值到均值的差值,假设x为样本的个体,均值为μ,为了统计样本的离散程度,可以取差值的绝对值,或者方差

差值的绝对值为样本值减去样本均值的绝对值|x-μ|,方差为每个样本值减去样本均值的平方和除以样本个数

img

两种节点划分的标准分别对应两种目标函数最优化的标准,即用最小绝对偏差LAD,或者用最小二乘偏差LSD,通常使用LSD更常见一些

如何使用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)) 

[‘CRIM’ ‘ZN’ ‘INDUS’ ‘CHAS’ ‘NOX’ ‘RM’ ‘AGE’ ‘DIS’ ‘RAD’ ‘TAX’ ‘PTRATIO’ ‘B’ ‘LSTAT’]
回归树二乘偏差均值: 23.80784431137724
回归树绝对值偏差均值: 3.040119760479042

首先加载了波士顿房价数据集,得到特征集和房价。通过train_test_split抽取一部分当做测试集,其余作为训练集,使用dtr=DecisionTreeRegressor()初始化一棵CART回归树,使用dtr.fit(train_features,train_price)函数将训练集的特征值和结果作为参数进行拟合,得到CART回归树,使用dtr.predict(test_features)进行预测,传入测试集的特征值,得到预测结果predict_price,最后求得这棵回归树的二乘偏差均值以及绝对值偏差均值

CART决策树的剪枝

采用CCP方法,是一种后剪枝的方法,叫做代价复杂度,这种剪枝方式用到一个指标叫做节点的表面误差率增益值,依次作为剪枝前后误差的定义

决策树(中):CART,一颗是回归树,另一颗是分类树_第2张图片

Tt表示以t为根节点的子树,C(Tt)表示节点t的子树没被裁减时子树Tt的误差,C(t)表示节点t的子树被剪枝后节点t的误差,|Tt|代子树Tt的叶子树,剪枝后,T的叶子树减少了|Tt|-1

外链图片转存中…(img-MoUK3joS-1584929702408)]

Tt表示以t为根节点的子树,C(Tt)表示节点t的子树没被裁减时子树Tt的误差,C(t)表示节点t的子树被剪枝后节点t的误差,|Tt|代子树Tt的叶子树,剪枝后,T的叶子树减少了|Tt|-1

你可能感兴趣的:(数据分析实战,跟宝宝一起学习)