选自enlight.nyc,作者:WILLIAM KOEHRSEN,机器之心编译,参与:Panda。随机森林是一种强大的机器学习模型,得益于各种强大的库,现在人们可以很轻松地调用它,但并不是每一个会使用该模型的人都理解它的工作方式。数据科学家 William Koehrsen 用 Python 实现并解释了决策树和随机森林的工作过程。
引言
感谢 Scikit-Learn 这样的库,让我们现在可以非常轻松地使用 Python 实现任何机器学习算法。事实上操作起来很简单,我们往往无需了解任何有关模型内部工作方式的任何知识就能使用它。尽管我们并不需要理解所有细节,但了解一些有关模型训练和预测方式的思路仍然会有很大的帮助。这使得我们可以在模型表现不如预期时对模型进行诊断,或解释我们的模型做决策的方式——这能帮助我们说服他人使用我们的模型。
本文将介绍如何使用 Python 构建和使用随机森林。我们不只是简单地展示代码,而会尽力解释模型的工作方式。我们将从一个解决简单问题的单个决策树开始,然后逐渐深入,最终完成一个针对某个真实世界数据科学问题的随机森林。本文所涉及的完整代码可参阅这个 GitHub 上的 Jupyter Notebook:https://github.com/TryEnlight/Machine-Learning-Projects/blob/master/Random%20Forest%20Tutorial.ipynb
理解决策树
决策树是随机森林的构建模块,本身是一种相当直观的模型。我们可以将决策树看作是询问有关数据的问题的流程图,并最终导向一个预测类别(在回归任务上则是连续值)。这是一种可解释的模型,因为其决策方式类似于我们在现实生活中做法:我们询问一系列有关数据的问题,直到我们最终达成决策。
决策树的主要技术细节在于如何构建有关数据的问题。决策树的构建方式是构建能最大限度降低基尼不纯度(Gini Impurity)的问题。
我们稍后一点会谈到基尼不纯度,现在你只需要知道,这意味着决策树会尽力构建尽可能纯的节点,其中有很高比例的样本(数据点)都来自同一个类别。
基尼不纯度和决策树构建可能有些难以理解,所以首先我们构建一个决策树,然后我们通过一些简单的数学来进行解释。
一个简单问题的决策树
我们先从一个如下所示的非常简单的二元分类任务开始:
我们的数据仅有两个特征(预测变量)。这里共有 6 个数据点,2 种不同的标签。
尽管这个问题很简单,但却无法实现线性分割,也就是说我们不能在这些数据之间用一条直线将各个点划分到对应的类别。但是,我们可以画出一系列直线来分开这两个类别,这实际上就是决策树在构建系列问题时的做法。
为了创建决策树,并在数据上进行训练(拟合),我们可以使用 Scikit-Learn:
from sklearn.tree import DecisionTreeClassifier
# Make a decision tree and train
tree = DecisionTreeClassifier(random_state=RSEED)
tree.fit(X, y)
这就是全部了!
在训练过程中,我们会向模型提供特征和标签,使其能够学习基于这些特征对数据点进行分类。我们没有针对这个简单问题的测试集,但在进行测试时,我们只向模型提供特征,然后让其给出对标签的预测。
我们可以在训练数据上测试模型的准确度:
print(f'Model Accuracy: {tree.score(X, y)}')