决策树算法实现

决策树算法实现_第1张图片
ID3,c4.5只用于做分类,得到的结果是连续值;
cart既可以做分类,也可以做回归,得到的结果是连续值。

CART 分类树

在 Python 的 sklearn 中默认采用的是 CART 分类树。
下面,我们来用 CART 分类树,给 iris 数据集构造一棵分类决策树。在 Python 的 sklearn 中,如果我们想要创建 CART 分类树,可以直接使用 DecisionTreeClassifier 这个类。创建这个类的时候,默认情况下 criterion 这个参数等于 gini,也就是按照基尼系数来选择属性划分,即默认采用的是 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)

决策树算法实现_第2张图片

首先 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。

CART 回归树

CART 回归树划分数据集的过程和分类树的过程是一样的,,只是回归树得到的预测结果是连续值,而且评判“不纯度”的指标不同。
在 CART 分类树中采用的是基尼系数作为标准来评价“不纯度”,在CART回归树中则采用样本的离散程度来评价不纯度。
具体计算方式:
假设 x 为样本的个体,均值为 u,为了统计样本的离散程度,我们可以取差值的绝对值,或者方差。

决策树算法实现_第3张图片
在这里插入图片描述

所以这两种节点划分的标准,分别对应着两种目标函数最优化的标准,即用最小绝对偏差(LAD),或者使用最小二乘偏差(LSD)。
通常,LSD划分方法多一点。

我们使用到 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)) 

决策树算法实现_第4张图片

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

分类树与回归树类似,只是回归树最终得到连续值。

CART 决策树的剪枝

剪枝是改善过拟合非常常用的方法。CART 决策树的剪枝主要采用的是 CCP 方法,它是一种后剪枝的方法。这种剪枝方式用到一个指标叫做节点的表面误差率增益值,以此作为剪枝前后误差的定义
决策树算法实现_第5张图片

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

所以节点的表面误差率增益值等于节点 t 的子树被剪枝后的误差变化除以剪掉的叶子数量。
得到了剪枝后的子树集合后,我们需要用验证集对所有子树的误差计算一遍。可以通过计算每个子树的基尼指数或者平方误差,取误差最小的那个树,得到我们想要的结果。
决策树算法实现_第6张图片

你可能感兴趣的:(DM,python)