如何在Python中构建决策树回归模型

2022-11-16 12:51:15 浏览数 (2)

标签:Python

本文讲解什么是决策树回归模型,以及如何在Python中创建和实现决策树回归模型,只需要5个步骤。

需要3个库:pandas,sklearn,matplotlib。可以使用pip命令安装:

pip install pandas sklearn matplotlib

其中,

pandas:用于数据整理。

sklearn:用于机器学习模型。

matplotlib:数据可视化。

步骤1:决策树模型的工作原理

决策树通常是由根节点、决策节点和叶节点组成的二叉树,是一棵上下颠倒的树,树根在顶部,叶子在树的底部。

图1

从树的根(顶部)开始,使用多个不同的条件以几种不同的方式分割训练数据。在每个决策中,节点都是以某种方式分割数据的条件,叶节点表示最终结果。这个术语听起来很复杂,但在现实生活中,你可能已经见过很多次决策树了。下面是一个非常简单的决策树示例,可用于预测你是否应该买房。

图2

决策树回归模型构建该决策树,然后使用它预测新数据点的结果。虽然上图2是一个二叉(分类)树,但决策树也可以是一个可以预测数值的回归模型,它们特别有用,因为易于理解,可以用于非线性数据。然而,如果树变得太复杂和太大,就有过度拟合的风险。如果我们遇到这个问题,可以考虑减少树的深度,以帮助避免过度拟合。

步骤2:获取数据

我们将使用sklearn包含的数据集之一——加州住房数据。该数据集无需下载,只需从sklearn导入即可。

该数据集来自1990年美国人口普查。每行代表一个人口普查街区组,这是美国人口普查局发布样本数据的最小地理单元。每个街区组通常有600-3000人。

图3

数据集采用字典格式,包含实际数据和一些元数据,如下图4所示。

图4

数据字典

data:包含8个特征值(自变量)。

target:目标价值是房屋价值的中位数,单位为几十万美元(100000美元)。

target_name:这是房屋价值的中位数。

feature_names:MedInc–街区组中的收入中值。HouseAge-房屋屋龄中值。AveRooms–每户的平均房间数。AveBedrms–每户的平均卧室数量。Population–街区组中的人口。AveOccup–家庭成员的平均数量。Latitude–街区组纬度。Longitude–街区组经度。

让我们把数据放到pandas数据框架中。这里使用变量X来表示所有特征(表),使用变量y来表示目标值(数组)。

图5

我们试图预测的目标值是加利福尼亚地区的房屋价值中值,以几十万美元表示。y包含X中所有房屋的所有房屋中值。

以下是数据:

图6

分类数据与数字数据

在开始构建模型之前,通常需要清理数据。例如,应该删除任何缺失值的数据点,并注意任何分类特征而不是数字特征。幸运的是,这个数据集已经清理完毕,所有数据都是数字。

决策树模型适用于数值和分类数据。然而,对于分类数据,需要执行独热编码(即将分类数据转换为独热数字数组)。

步骤3:拆分数据

通常不会使用所有数据来训练模型。这里的目标是避免过度拟合。几乎总是应该将数据分为两部分:训练集和测试集。

sklearn有一个功能,可以为我们分割数据。还可以指定分割百分比。训练和测试的默认值分别为75%和25%。然而,对于这个模型,我们将90%用于训练,10%用于测试。

图7

训练集(X_train和y_train)–这是将用于教授(训练)模型如何进行预测的数据集。

测试集(X_test和y_test)——在训练了模型之后,将使用该数据集测试它在预测训练集中尚未看到的新数据点时的准确性。其目的是测试我们使用训练集建立的模型是否可以很好地推广。

random_state=0参数用于确保结果可重复。否则,每次运行代码时,我们都会得到不同的分割。

如果没有测试数据,我们的模型将过度拟合训练数据——这意味着我们的模型在预测训练集中的值方面会变得太好,并且无法准确预测看不见的新数据点。

步骤4:用Python构建决策树回归模型

sklearn使创建机器学习模型变得非常容易。我们可以使用DecisionTreeRegressor构造函数创建模型。现在,只使用默认参数(将所有参数留空)。

图8

这创建了我们的决策树回归模型,现在我们需要使用训练数据对其进行“训练”。可以使用sklearn.fit方法来实现这一点,用于查找输入变量和目标变量之间的关系。

因为需要训练数据来训练模型,所以将其作为参数传递。

图9

检查模型的准确性

现在我们训练了这个模型,我们需要看看使用测试数据它实际上有多精确。sklearn有一个内置的方法score,它为我们提供了模型的确定系数(R^2)。有时人们也将其称为准确性,这表示预测正确的频率。

图10

最佳的R^2分数为1.0。无论特征值如何,始终预测相同值的模型的R^2得分为0。分数有时也可能为负值。我们希望模型的分数在0.0到1.0之间,越接近1.0越好。

正如我们所看到的,我们的模型在预测方面一般,只有57.8%的准确率,但它肯定会更好。有时,使用sklearn默认参数构建模型仍然会产生一个好的模型;然而,情况并非总是如此。

步骤5:微调(Python)sklearn中的决策树回归模型

为了使我们的模型更精确,可以尝试使用超参数。

超参数是我们可以更改的模型中经过深思熟虑的方面。在该模型中,可以通过使用DecisionTreeRegressor构造函数中的关键字参数来指定超参数。

可以对每个超参数使用不同的输入,看看哪些组合可以提高模型的分数。由于决策树模型的最大问题之一是,如果树太大,可以从限制树的最大深度开始。

图11

由于这不是一个很大的改进,我们可以不断修改深度,看看是否可以使我们的模型更准确。经过一些实验,深度为10会将准确性提高到67.5%:

图12

在研究其他超参数之前,让我们快速回顾一下如何建立决策树机器学习模型:

1.从树的根开始,使用多个不同的条件以几种不同的方式分割训练数据。

2.对于每一个拆分,都有一个分数来量化拆分的“好”程度。例如,将数据拆分为50-50的条件不是很好的拆分。计算分割质量的特定函数也是我们可以指定的超参数。

3.这个过程对每个内部决策节点重复,直到我们到达一个叶子节点。叶子节点的组成部分也是一个我们可以指定的超参数。

其他超参数

可以修改其他一些超参数来限制树的大小,包括:

1.min_samples_split:指定分割内部节点的最小样本数。默认值为2,因此增加该值将限制树的大小。

2.min_samples_leaf:指定叶节点上需要多少个样本。默认值为1,因此增加该值也会限制树的大小。

3.max_leaf_nodes:控制模型可以生成的叶节点数。减少叶节点将有助于防止过度拟合。

4.max_features:指定每次分割时将考虑的最大特征数。默认值是数据集中的特征数,减小该值有助于防止过度拟合。

经过一些实验,发现这组超参数产生了更精确的模型:

图13

我们不需要逐个测试每个参数的多个值,而是可以自动化此过程,并使用每个参数的不同值的组合来搜索最佳分数(以后再详细介绍)。

特征重要性

可以研究的另一个方面是特征重要性,这是一个定量度量,衡量每个特征对模型结果的影响程度。使用matplotlib和scikit的内置方法feature_importances,可以可视化哪些特征最重要。

图14

图15

可以看到,收入中位数是对房屋价值中位数影响最大的特征。

至此,我们只用5个步骤就使用Python sklearn库构建了一个简单的决策树回归模型。

注:本文学习整理自pythoninoffice.com,供有兴趣的朋友学习参考。

0 人点赞