作者:William Koehrsen
翻译:和中华
校对:李润嘉
本文约6000字,建议阅读15分钟。
本文从单棵决策树讲起,然后逐步解释了随机森林的工作原理,并使用sklearn中的随机森林对某个真实数据集进行预测。
如今由于像Scikit-Learn这样的库的出现,我们可以很容易地在Python中实现数百种机器学习算法。它们是如此易用,以至于我们通常都不需要任何关于模型底层工作机制的知识就可以使用它们。虽然没必要了解所有细节,但了解某个机器学习模型大致是如何工作的仍然有帮助。这使得我们可以在模型表现不佳时进行诊断,或者解释模型是如何做决策的,这一点至关重要,尤其当我们想要说服别人相信我们的模型时。
在本文中,我们将介绍如何在Python中构建和使用随机森林(Random Forest)。除了查看代码之外,我们还将尝试了解此模型的工作原理。因为随机森林由许多决策树(decision tree)组成,所以我们先来了解一下单个决策树如何在一个简单的问题上进行分类。随后,我们将使用随机森林来解决一个现实世界中的数据科学问题。本文的完整代码在GitHub上以Jupyter Notebook的形式提供。
注意:本文最初出现在enlight上,这是一个社区驱动的开源平台,为那些希望学习机器学习的人提供教程。
理解决策树
决策树是随机森林的基本构成要素,而且是一种直观的模型。我们可以将决策树视为一系列关于数据的是/否问题,从而最终得出一个预测类别(或回归情况下的连续值)。 这是一个可解释的模型,因为它非常像我们人类进行分类的过程:在我们做出决定之前(在理想世界中),我们会对可用数据进行一系列的询问。
决策树的技术细节在于如何形成关于数据的问题。在CART算法中,通过确定问题(称为节点的分裂)来构建决策树,这些问题在得到应答时会导致基尼不纯度(Gini Impurity)的最大减少。这意味着决策树试图形成包含来自单个类的高比例样本(数据点)的节点,这个过程通过在能将数据干净地划分为不同类的特征中找到适当的值来实现。
我们稍后会谈谈基尼不纯度的更底层细节,但首先,让我们构建一个决策树,以便我们能够在高层次上理解它。
简单问题上的决策树
我们将从一个非常简单的二元分类问题开始,如下所示:
目标是把数据点划分到各自所属的类
我们的数据只有两个特征(预测变量),x1和x2,共有6个数据点(样本),被分为2个不同的标签。虽然这个问题很简单,但它不是线性可分的(linearly separable),这意味着我们不能绘制一条通过数据的直线来对点进行分类。
然而,我们可以绘制一系列直线,将数据点划分入多个框,我们称这些框为节点。 事实上,这就是决策树在训练期间所做的事情。实际上决策树是通过构造许多线性边界而构建的一个非线性模型。
我们使用Scikit-Learn来创建决策树并在数据上训练(拟合)。
在训练过程中,我们为模型提供特征和标签,以帮助它学习如何根据特征对点进行分类。(针对这个简单问题我们没有测试集,在测试时,我们只为模型提供特征值并让它对标签进行预测。)
我们可以在训练数据上测试模型的准确性:
可以看到它获得了我们所期望的100%的准确性,这是因为我们给了它训练的答案(y),并且没有限制树的深度。事实证明,在训练数据中过强的学习能力可能是一个缺点,因为它可能导致过拟合(overfitting),我们将在稍后对此进行讨论。