使用像Scikit-Learn这样的库,现在很容易在Python中实现数百种机器学习算法。这很容易,我们通常不需要任何关于模型如何工作的潜在知识来使用它。虽然不需要了解所有细节,但了解机器学习模型是如何工作的仍然有用。这使我们可以在模型表现不佳时进行诊断,或者解释模型如何做出决策,如果我们想让别人相信我们的模型,这是至关重要的。
在本文中,我们将介绍如何在Python中构建和使用Random Forest。除了查看代码之外,我们还将尝试了解此模型的工作原理。因为由许多决策树组成的随机森林,我们首先要了解单个决策树如何对一个简单的问题进行分类。然后,我们将努力使用随机森林来解决现实世界的数据科学问题。本文的完整代码在GitHub上以Jupyter Notebook的形式提供【1】。
理解决策树
一个决策树是一个随机森林的基石,是一个直观的模型。我们可以将决策树视为一系列是/否问题,询问我们的数据最终导致预测类(或回归情况下的连续值)。这是一个可解释的模型,因为它可以像我们一样进行分类:(在理想世界中)在我们做出决定之前,我们会询问有关可用数据的一系列问题。
决策树的技术细节是如何形成有关数据的问题。在CART算法中,通过确定问题(称为节点的分裂)来构建决策树,这些问题在被回答时导致基尼杂质的最大减少。这意味着决策树试图通过在将数据干净地划分为类的特征中查找值来形成包含来自单个类的高比例样本(数据点)的节点。
我们稍后将讨论关于Gini杂质的低级细节,但首先,让我们构建一个决策树,以便我们能够在高层次上理解它。
关于简单问题的决策树
我们将从一个非常简单的二进制分类问题开始,如下所示:
我们的数据仅具有两个特征(预测变量),具有6个数据点,分成2个不同的标签。虽然这个问题很简单,但它不是线性可分的,这意味着我们不能通过数据绘制一条直线来对点进行分类。
然而,我们可以绘制一系列直线,将数据点划分为多个框,我们称之为节点。实际上,这就是决策树在训练期间所做的事情。有效地,决策树是通过构造许多线性边界而构建的非线性模型。
要创建决策树并对数据进行训练(fit),我们使用Scikit-Learn。
from sklearn.tree import DecisionTreeClassifier
# Make a decision tree and train
tree = DecisionTreeClassifier(random_state=RSEED)
tree.fit(X, y)
在训练过程中,我们为模型提供特征和标签,以便学习根据特征对点进行分类。(我们没有针对这个简单问题的测试集,但在测试时,我们只为模型提供功能并让它对标签进行预测。)
我们可以在训练数据上测试我们模型的准确性:
print(fModel Accuracy: {tree.score(X, y)})
Model Accuracy: 1.0
我们看到它获得100%的准确性,这是我们所期望的,因为我们提供了训练的答案(y)并没有限制树的深度。事实证明,完全学习训练数据的能力可能是决策树的缺点,因为它可能会导致过度拟合