基于树的学习算法是十分流行且应用广泛的一类非参数化的有监督学习算法,这些算法既可用于分类又可用于回归。基于树的学习算法的基础是包含一系列决策规则(例如,“如果他们是男性……”)的决策树。这些决策规则看起来很像一棵倒置的树,第一个决策规则在顶部,随后的决策规则在其下面展开。在决策树中,每个决策规则产生一个决策节点,并创建通向新节点的分支。终点处没有决策规则的分支被称为叶子节点(leaf)。

决策树型模型普及的一个原因是它们的可解释性很强。实际上,通过绘制完整的决策树可以创建一个非常直观的模型。从这个基本的树系统可以引出各种各样的扩展,包括随机森林和堆叠(stacking)模型。本章将介绍如何训练、处理、调整、可视化和评估基于树的模型。

训练决策树分类器

  • 问题描述

使用决策树训练分类器。

  • 解决方案

使用 scikit-learn 中的 DecisionTreeClassifier :# 加载库from sklearn.tree import DecisionTreeClassifierfrom sklearn import datasets# 加载数据
iris = datasets.load_iris()features = iris.datatarget = iris.target# 创建决策树分类器对象decisiontree = DecisionTreeClassifier(random_state=0)# 训练模型model = decisiontree.fit(features, target)

  • 讨论

决策树的训练器会尝试找到在节点上能够最大限度降低数据不纯度(impurity)的决策规则。度量不纯度的方式有许多, DecisionTreeClassifier 默认使用基尼不纯度(Giniimpurity):

树和森林:深度学习不是唯一的选择_java

其中,G(t)是节点 t 的基尼不纯度,p i 是在节点 t 上第 i 类样本的比例。寻找使不纯度降低的决策规则的过程会被递归执行,直到所有叶子节点都变为纯节点(即仅包含一种分类)或达到某个终止条件。在 scikit-learn 中, DecisionTreeClassifier 的使用方式与其他学习算法类似,首先用 fit方法训练模型,然后就可以用训练好的模型来预测一个样本的分类 :# 创建新样本observation = [[ 5, 4, 3, 2]]# 预测样本的分类model.predict(observation)array([1])也可以使用 predict_proba 方法查看该样本属于每个分类(预测的分类)的概率 :# 查看样本分别属于三个分类的概率model.predict_proba(observation)array([[ 0., 1., 0.]])最后,如果想使用其他的不纯度度量方式,可以修改参数 criterion :# 使用 entropy 作为不纯度检测方法创建决策树分类器对象
decisiontree_entropy = DecisionTreeClassifier(criterion='entropy', random_state=0)# 训练模型model_entropy = decisiontree_entropy.fit(features, target)

  • 延伸阅读

 《决策树学习》(Princeton 大学官网,http://bit.ly/2FqJxlj)

训练决策树回归模型

  • 问题描述

训练一个基于决策树的回归模型。

  • 解决方案

使用 scikit-learn 中的 DecisionTreeRegressor :# 加载库from sklearn.tree import DecisionTreeRegressorfrom sklearn import datasets# 加载仅有两个特征的数据boston = datasets.load_boston()features = boston.data[:,0:2]target = boston.target# 创建决策树回归模型对象decisiontree = DecisionTreeRegressor(random_state=0)# 训练模型model = decisiontree.fit(features, target)

  • 讨论

决策树回归模型与决策树分类模型的工作方式类似,不过前者不会使用基尼不纯度或熵的概念,而是默认使用均方误差(MSE)的减少量来作为分裂规则的评估标准 :

树和森林:深度学习不是唯一的选择_java_02

其中,y是样本的真实值,减号后面是样本的预测值。在 scikit-learn 中,决策树回归模型可以用 DecisionTreeRegressor 构建。模型训练完以后可以用它对样本的值进行预测 :# 创建新样本observation = [[0.02, 16]]# 预测样本值model.predict(observation)array([ 33.])同决策树分类器 DecisionTreeClassifier 一样,用参数 criterion 可以选择分裂质量(split quality)的度量方式。例如,可以用平均绝对误差(MAE)的减少量作为分裂标准来构造决策树模型 :# 使用 MAE 创建决策树回归模型decisiontree_mae=DecisionTreeRegressor(criterion="mae", random_state=0)# 训练模型model_mae = decisiontree_mae.fit(features, target)

  • 延伸阅读

scikit-learn 文档 :决策树回归(http://bit.ly/2GR63AZ)

可视化决策树模型

  • 问题描述

可视化一个决策树模型。

  • 解决方案

将决策树模型导出为 DOT 格式并可视化 :# 加载库import pydotplusfrom sklearn.tree import DecisionTreeClassifierfrom sklearn import datasetsfrom IPython.display import Imagefrom sklearn import tree# 加载数据
iris = datasets.load_iris()features = iris.datatarget = iris.target# 创建决策树分类器对象decisiontree = DecisionTreeClassifier(random_state=0)# 训练模型model = decisiontree.fit(features, target)# 创建 DOT 数据dot_data = tree.export_graphviz(decisiontree, out_file=None,                                                  feature_names=iris.feature_names,                                                  class_names=iris.target_names)# 绘制图形graph = pydotplus.graph_from_dot_data(dot_data)# 显示图形Image(graph.create_png())

树和森林:深度学习不是唯一的选择_java_03

  • 讨论

可以将整个模型可视化,是决策树分类器的优点之一,这也使决策树成为机器学习中解释性最好的模型之一。在本解决方案中,模型以 DOT 格式(一种图形描述语言)导出,然后被绘制成图形。如果查看根节点,可以看到决策规则是,如果花瓣宽度小于或等于 0.8 就转到左分支,否则就转到右分支。同时,我们还可以看到基尼不纯度指数为 0.667 ,样本数量为 150 ,每个分类中的样本数量分布为 [50,50,50] ,如果在该节点停止,将得到样本的预测分类为 setosa 。我们还可以知道在该节点处,依靠单个决策规则( petal width (cm) <= 0.8 )能够完美地识别所有的 setosa 类样本。此外,添加一个基于同一个特征的决策规则( petal width (cm) <= 1.75 ),决策树能够对 150 个样本中的 144 个正确分类。这使得花瓣宽度成为一个非常重要的特征!如果要在其他应用或者报告中使用该决策树,可以将可视化后的决策树导出为 PDF 格式或 PNG 格式 :# 创建 PDFgraph.write_pdf("iris.pdf")True# 创建 PNGgraph.write_png("iris.png")True本文的解决方案对决策树分类模型进行了可视化操作,这种方法也可以用于决策树回归模型。注意 :macOS 用户可能需要安装 GraphViz 才能运行上述代码。可以使用 Homebrew命令( brew install graphviz )进行安装。有关 Homebrew 的安装说明,请访问Homebrew 的官方网站。

  • 延伸阅读

Homebrew(https://brew.sh)