阅读书籍为《Hands-On Machine Learning with Scikit-Learn & TensorFlow》王静源等翻译的中文译版《机器学习实战,基于 Scikit-Learn 和 TensorFlow》
本章主要内容有:
- 代码实现决策树分类和回归
- 代码实现决策树可视化
- 决策树分类和回归的原理
- sklearn中的CART训练算法
决策树(DecisionTree):是一种多功能的机器学习算法,可以用来实现分类,回归问题和多输出问题;决策树是随机森林的基本组成部分,多个决策树组成一个随机森林;决策树不需要对数据进行特征缩放或集中。决策树很容易解释理解,实现起来也很简单,但决策树对数据旋转十分敏感,对训练细节也很敏感。
1.决策树分类和决策树回归
决策树分类
sklearn通过DecisionTreeClassification函数来构建决策树,完成分类任务;
使用 鸢尾花数据集
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
决策树回归
sklearn通过DecisionTreeRegression函数来构建决策树,完成回归任务;
tree_reg = DecisionTreeRegressor()
tree_reg.fit(iris.data, iris.target)
2.决策树可视化
一般调用决策树export_graphviz函数先输出一个图形定义文件
然后使用graphviz的dot函数进行图形定义文件(.dot文件)到图的转化
dot转化后也可以输出保存为PDF等多种类型
export_graphviz(
tree_clf,
out_file="iris_tree.dot",
feature_names=["petal length ", "petal width"],
class_names=iris.target_names,
rounded=True,
filled=True
)
可视化这部分没有按照书上说的使用命令行实现,我使用GraphViz的bin目录下gvedit.exe直接转换生成。
3.决策树分类和回归的原理
-
分类决策树分析
有一朵鸢尾花,想要将其归类。那么从根结点开始:首先询问花瓣长度是否小于2.45厘米?若小于则将其归入setosa类,若不小,再询问花瓣宽度是否小于1.75厘米,若小于则将其归入Versicolor类,否则就是第三类Virginica;
各指标参数介绍:
Samples属性记录当前类别实例数;
Value数组记录当前类别中各类实例数量:比如value[0, 49, 5]表示当前类别的实例中,类别1有0个,(当前类别)类别2有49个,类别3有5个。(以在中间的叶子结点为例);
Gini属性:gini = 1- (0/54)2-(49/54)2-(5/54)^2=0.168(以在中间的叶子结点为例)这个属性被称为基尼不纯度用来衡量实例中分错类的程度; -
回归决策树分析
回归树与分类树的区别在于:每个节点的结果是一个预测值。
各指标参数介绍:
Samples属性记录当前类别实例数;
Value属性:当前叶节点关联的实例中的平均目标值;
MSE属性:当前结点的均方误差;
4.sklearn中的CART训练算法
SkLearn使用分类与回归树简称CART算法来训练决策树。算法原理:首先使用单个特征K和阈值t(例如花瓣的长度阈值)将训练集分为两个子集。然后在使用相同的逻辑继续分裂子集,直到抵达最大深度(这块由超参数max_depth控制),或者到达不能再继续降低不纯度的分类就停止。
K和t由最小化成本函数计算而得,成本函数如下:
1.m left/right:表示左右实例数量;
2.G left/right:表示左右的实例不纯度;
3.也可以通过附加的min_samples_split, min_samples_leaf,min_weigth_fraction_left和max_leaf_nodes来控制停止;
衡量不纯度的另一种方法–信息熵:
一般默认基尼不纯度来衡量纯度,不过也可以通过为超参数赋值“entropy”进行信息熵衡量纯度;此方法来源于热力学中熵的概念。在当前业务领域中纯度衡量的信息熵公式如下:
信息熵与基尼不纯度的区别:
信息熵趋向于创建更平衡的树,基尼不纯度倾向于从树枝中分裂出最常见的类别;
防止过拟合-正则化超参数:
树的结构将跟随训练集变化,如果不加以限制,则会出现严重拟合的情况,这里我们通过控制一些超参数来避免这样的情况:
max_depth:控制树的深度;
min_samples_split(分裂前节点必须由的最小样本数),min_samples_leaf(叶子结点必须有的最小样本数量),min_weigth_fraction_left(加权实例总数的占比)和max_leaf_nodes(最大叶结点数):控制树的形状。
通过以上,可以明显感到决策树很容易解释理解,实现起来也很简单,但决策树对数据旋转十分敏感,对训练细节也很敏感。有明显的不稳定性。对此,下一章随机森林将通过对许多树的预测进行平均来限制这种不稳定性。