基于树的学习算法是十分流行且应用广泛的一类非参数化的有监督学习算法,这些算法既可用于分类又可用于回归。基于树的学习算法的基础是包含一系列决策规则(例如,“如果他们是男性……”)的决策树。这些决策规则看起来很像一棵倒置的树,第一个决策规则在顶部,随后的决策规则在其下面展开。在决策树中,每个决策规则产生一个决策节点,并创建通向新节点的分支。终点处没有决策规则的分支被称为叶子节点(leaf)。
决策树型模型普及的一个原因是它们的可解释性很强。实际上,通过绘制完整的决策树可以创建一个非常直观的模型。从这个基本的树系统可以引出各种各样的扩展,包括随机森林和堆叠(stacking)模型。本章将介绍如何训练、处理、调整、可视化和评估基于树的模型。
训练决策树分类器
使用决策树训练分类器。
使用 scikit-learn 中的 DecisionTreeClassifier :
# 加载库
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
# 加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
# 创建决策树分类器对象
decisiontree = DecisionTreeClassifier(random_state=0)
# 训练模型
model = decisiontree.fit(features, target)
决策树的训练器会尝试找到在节点上能够最大限度降低数据不纯度(impurity)的决策规则。度量不纯度的方式有许多, DecisionTreeClassifier 默认使用基尼不纯度(Giniimpurity):
其中,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 DecisionTreeRegressor
from 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)的减少量来作为分裂规则的评估标准 :
其中,yi 是样本的真实值,减号后面是样本的预测值。在 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 pydotplus
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
from IPython.display import Image
from sklearn import tree
# 加载数据
iris = datasets.load_iris()
features = iris.data
target = 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())
可以将整个模型可视化,是决策树分类器的优点之一,这也使决策树成为机器学习中解释性最好的模型之一。在本解决方案中,模型以 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 格式 :
# 创建 PDF
graph.write_pdf("iris.pdf")
True
# 创建 PNG
graph.write_png("iris.png")
True
本文的解决方案对决策树分类模型进行了可视化操作,这种方法也可以用于决策树回归模型。
注意 :macOS 用户可能需要安装 GraphViz 才能运行上述代码。可以使用 Homebrew命令( brew install graphviz )进行安装。有关 Homebrew 的安装说明,请访问Homebrew 的官方网站。
Homebrew(https://brew.sh)
本文节选自新书《Python机器学习手册:从数据预处理到深度学习》。决策树算法的思想,是与人类日常决策过程非常相似的——不断用二分法来做分支决策,直到得到匹配度最高的答案。它由澳大利亚计算机科学家Ross Quinlan提出,灵感来自判断象棋残局中一方是否会在两步棋后被将死。
当然,阅读原文推送给你的远不止此,它有200个独立解决方案,可以解决几乎所有日常开发中可能遇到的机器学习问题。不管你是正在应聘数据科学家,还是初登职场的准AI工程师,将这样一本Cookbook摆在案头都是明智之举。
内容简介:《Python机器学习手册:从数据预处理到深度学习》采用基于任务的方式来介绍如何在机器学习中使用Python。书中有近200个独立的解决 方案,针对的都是数据科学家或机器学习工程师在构建模型时可能遇到的常见任务,涵盖从简 单的矩阵和向量运算到特征工程以及神经网络的构建。所有方案都提供了相关代码,读者可以 复制并粘贴这些代码,用在自己的程序中。本书不是机器学习的入门书,适合熟悉机器学习理论和概念的读者阅读。你可以将本书作 为案头参考书,在机器学习的日常开发中遇到问题时,随时借鉴书中代码,快速解决问题。