通过该图,我们可以直观地看到 -0.7 的相关系数是什么样的。随着站点 EUI 的降低,能源之星得分会增加,这种关系在各种建筑类型中保持稳定。

配对网格
天气标准 EUIcore天气标准 EUIcore

特征工程和选择

特征工程和选择通常可以在机器学习问题上投入的时间提供最大的回报。首先我们来定义一下这两个任务是什么:

机器学习模型只能从我们提供的数据中学习,因此确保数据包含与我们的任务相关的所有信息至关重要。如果我们不向模型提供正确的数据,那么我们就会让它失败,我们不应该指望它能够学习!

对于这个项目,我们将采取以下特征工程步骤:

  • One-hot 编码分类变量(行政区和属性使用类型)
  • 添加数值变量的自然对数变换

One-hot 编码对于在模型中包含分类变量是必要的。机器学习算法无法理解“办公室”这一建筑类型,因此如果该建筑是办公室,我们必须将其记录为 1,否则记录为 0。

添加转换后的特征可以帮助我们的模型学习数据中的非线性关系。取平方根、自然对数或特征的各种幂是数据科学中的常见做法,并且可以基于领域知识或在实践中最有效的方法。这里我们将包括所有数值特征的自然对数。

以下代码选择数字特征,对这些特征进行对数转换,选择两个分类特征,对这些特征进行 one-hot 编码,并将这两个集合连接在一起。这看起来工作量很大,但在 Pandas 中相对简单!

在此过程之后,我们有超过 11,000 个观测值(建筑物)和 110 个列(特征)。并非所有这些特征都可能对预测能源之星得分有用,因此现在我们将转向特征选择以删除一些变量。

特征选择

我们的数据中有 110 个特征,其中许多特征都是冗余的,因为它们彼此高度相关。例如,以下是站点 EUI 与天气标准化站点 EUI 的关系图,其相关系数为 0.997。

彼此强相关的特征被称为共线,删除这些特征对中的一个变量通常可以帮助机器学习模型泛化并更具可解释性。 (我应该指出,我们正在讨论特征与其他特征的相关性,而不是与目标的相关性,这有助于我们的模型!)

有多种方法可以计算特征之间的共线性,其中最常见的方法之一是方差膨胀因子。在这个项目中,我们将使用b相关系数来识别和去除共线特征。如果一对特征之间的相关系数大于 0.6,我们将删除其中一个。对于实现,请查看笔记本(以及这个 Stack Overflow 答案)

虽然这个值可能看起来是任意的,但我尝试了几个不同的阈值,并且这个选择产生了最好的模型。机器学习是一个经验领域,通常涉及实验和寻找效果最好的方法!特征选择后,我们总共剩下 64 个特征和 1 个目标。

# 删除所有具有 na 值的列
features = features.dropna(axis=1, how = 'all')
打印(特征.形状)(11319, 65)

建立基线

我们现在已经完成了数据清理、探索性数据分析和特征工程。开始建模之前要采取的最后一步是建立一个朴素基线。这本质上是一个猜测,我们可以将其与我们的结果进行比较。如果机器学习模型没有击败这个猜测,那么我们可能不得不得出结论,机器学习对于该任务来说是不可接受的,或者我们可能需要尝试不同的方法。

对于回归问题,合理的朴素基线是猜测测试集中所有示例的训练集目标的中值。这为任何模型的超越设定了一个相对较低的门槛。

我们将使用的指标是 平均绝对误差 (mae) 测量预测的平均绝对误差。回归有很多指标,但我喜欢 Andrew Ng 的建议,即选择一个指标,然后在评估模型时坚持使用它。平均绝对误差很容易计算并且可以解释。

在计算基线之前,我们需要将数据分为训练集和测试集:

  1. 训练集 特征是我们在训练期间向模型提供的内容以及答案。模型的目标是学习特征和目标之间的映射。
  2. 测试集 特征用于评估训练后的模型。该模型不允许查看测试集的答案,并且必须仅使用特征进行预测。我们知道测试集的答案,因此我们可以将测试预测与答案进行比较。

我们将使用 70% 的数据进行训练,30% 的数据用于测试:

# 分为 70% 训练集和 30% 测试集
X, X_test, y, y_test = train_test_split(特征, 目标,
测试大小=0.3,
随机状态 = 42)

现在我们可以计算朴素基线性能:

基线猜测分数为 66.00
测试集的基线性能:MAE = 24.5164

测试集上的朴素估计偏差了大约 25 个点。分数范围为 1-100,因此这代表着 25% 的误差,这是一个相当低的超越门槛!

结论

在本文中,我们演练了机器学习问题的前三个步骤。定义问题后,我们:

  1. 清理并格式化原始数据
  2. 执行探索性数据分析以了解数据集
  3. 开发了一组我们将用于我们的模型的功能

最后,我们还完成了建立基线的关键步骤,我们可以根据该基线来判断我们的机器学习算法。

第二篇文章(可在此处获取)将展示如何使用 Scikit-Learn 评估机器学习模型、选择最佳模型并执行超参数调整以优化模型。第三篇文章涉及模型解释和报告结果,请参见此处。

一如既往,我欢迎反馈和建设性批评,可以通过 Twitter @koehrsen_will 联系我。