一个完整的机器学习项目在Python中的演练(一)

磐石

大家往往会选择一本数据科学相关书籍或者完成一门在线课程来学习和掌握机器学习。但是,实际情况往往是,学完之后反而并不清楚这些技术怎样才能被用在实际的项目流程中。就像你的脑海中已经有了一块块”拼图“(机器学习技术),你却不知道如何讲他们拼起来应用在实际的项目中。如果你也遇见过同样的问题,那么这篇文章应该是你想要的。本系列文章将介绍一个针对真实世界实际数据集的完整机器学习解决方案,让您了解所有部分如何结合在一起。

本系列文章按照一般机器学习工作流程逐步进行:

  1.  数据清洗与格式处理
  2.  探索性数据分析
  3.  特征工程和特征选取
  4.  机器学习模型性能指标评估
  5.  微调最佳模型(超参数)
  6.  在测试集上评估最佳模型
  7.  解释模型结果
  8.  总结分析

通过完成所有流程,我们将看到每个步骤之间是怎么联系起来的,以及如何在Python中专门实现每个部分。该项目可在GitHub上找到,附实现过程。第一篇文章将涵盖步骤1-2,其余的内容将在后面的文章中介绍。

问题定义

编码之前的第一步是了解我们试图解决的问题和可用的数据。在这个项目中,我们将使用纽约市的公共可用建筑能源数据

(http://www.nyc.gov/html/gbee/html/plan/ll84_scores.shtml)

目标:使用能源数据建立一个模型,可以预测建筑物的能源之星评分ENERGY STAR Score)并剖析结果以找出影响评分的因素。

我们可以拿到的数据中包括能源之星得分这一项,这使得这是一个监督回归机器学习任务:

  • 监督:由于我们可以访问特征和目标,我们的目标是培养可以学习两者之间映射的模型
  • 回归:能源之星得分是一个连续变量

我们想要开发的是一个准确 (它可以预测能量之星得分并接近真实值)且解释的模型 (我们可以理解模型这种预测)。那么,当我们明确这两点之后,在我们深入挖掘数据并构建模型的过程中我们就有个更明确的标准来指引我们的决策。

数据清洗

与大多数数据科学课程所使用的数据不同,真实数据很混乱,并非每个数据集都是没有缺失值或异常值的。这意味着在我们开始分析之前,我们需要清洗数据并将其转换为可读取的格式。数据清洗是大多数数据科学问题中必不可少的一部分。

首先,使用pandas(Dataframe)读取数据并查看:

实际数据

这是一个含60列数据的完整数据的子集。我们可以看出几个问题:首先,虽然我们知道我们想要预测的是能源之星得分(ENERGY STAR Score),但我们不清楚每一列的含义。尽管这也许不是个很必要问题,我们通常可以在不了解其他变量含义的情况下创建一个可能准确的模型,但我们希望更关注于模型的可解释性,并且至少了解到某些列可能很重要。

当最初得到这个任务时,我先是关注到数据文件的名称:

并开始搜索“Local_Law_84”相关资料,了解到这是一项纽约市要求所有具有一定规模的建筑物报告其能源使用的法律。然后还查询到了数据中对应每一列的含义。在这个过程中,耐心是很有必要的。

我们并不需要去研究所有的列的准确含义,但能源之星得分(ENERGY STAR Score)是我们必须精确了解·的。它被描述为:

来自每个报告年度所提交的能源使用情况报告,1~100的百分制排名(分数越高越好)。能源之星得分(ENERGY STAR Score)是对建筑物能源效率的相对度量。

到这里我们已经解决了第一个问题,接下来再分析下第二个问题–那些被填充”Not Available“的缺失值。我们可以使用以下dataframe.info()方法来查看列的数据类型:

可以看到,其中有一些明确包含数字(例如ft²)的列被存储为objects。我们不能对字符串进行数值分析,所以这些数据需要转换为数值数据类型。

这里使用下面一小段Python代码,将所有“Not Available”条目替换为”不是数字”(np.nan),然后将相关列转换为float数据类型:

一旦相应列都转换成了数字,我们就可以开始进行数据分析。

缺失数据和异常值

除了异常的数据类型外,处理真实数据时的另一个常见问题是数据缺失。这些数据缺失往往是由很多因素造成,在我们训练机器学习模型之前必须填写或删除。首先,让我们了解每列中有多少缺失值。(代码参见github)

尽管删除信息需要格外小心,但对于那些缺失值的比例很高的列,它们对于模型的训练很有可能是没有意义的。删除这些列的具体阈值取决于具体问题,对于本项目来说,我们选择删除缺失值超过50%的列。

然后,我们还需要对异常值做处理。那些异常值可能是由于数据输入中的拼写错误或者错误统计等等原因造成的,或者一些不是上述两个原因但是对模型训练没有好处的极端值。对于这个项目,我们将根据极端异常值(extreme outliers)的定义(https://www.itl.nist.gov/div898/handbook/prc/section1/prc16.htm)来处理异常值:

  • 低于第一四分位数(Q1) – 3 *四分位差
  • 高于第三四分位数(Q3) + 3 *四分位差

(有关删除列值和异常值的代码,请参阅github)。在数据清洗和异处理异常值之后,我们剩下11,000多个buildings和49个features。

探索性数据分析(EDA)

现在,我们已经完成了数据清洗这个略微乏味的步骤。接下来就可以对我们的数据进行探索性分析了。探索性数据分析(EDA)是分析数据集以总结其主要特征的方法,通常使用可视化的方法。

简而言之,EDA的目标是了解我们的数据可以告诉我们什么,以帮助我们合理选择和使用数据特征。

单变量图(EDA中使用的典型图形技术之一)

我们的目标是预测能源之星得分ENERGY STAR Score(在我们的数据集中被重命名为score),所以我们可以从检查这个单变量(ENERGY STAR Score)的分布开始。直方图是一种可视化单个变量分布的简单而有效的方法,使用matplotlib很容易就可以实现。

从上图可以看出能源之星得分(ENERGY STAR Score)分布是不均匀的,最高分100分和最低分1分有占很大一部分。然而,能源之星得分是一个百分位数,我们希望看到一个统一的分布,每个得分分配给相同数量的建筑物。

如果我们回到能源之星得分的定义,我们会看到它是基于“自我报告的能量使用”,这可能就解释了为什么会有这么多非常高的分数。要求建筑物所有者报告自己的能源使用情况就像要求学生在测试中报告自己的分数一样,高分往往会居多。因此,这可能不是衡量建筑物能效的最客观标准。

如果我们有无限空闲时间,我们可也许能想要调查为什么这么多建筑物有非常高或非常低的分数,甚至可以通过选择这些建筑物并分析它们的共同点。但是,我们的目标只是预测分数,而不是设计更好的建筑物评分方法。所以,我们可以在我们的报告中记下分数具有可疑分布,但我们主要关注的还是分数预测

寻找关系

剖析功能和目标之间的关系是EDA的主要步骤之一。与目标相关的变量对模型很有用。检查目标上的分类变量(仅采用有限的一组值)的效果的一种方法是通过使用该seaborn库的密度图。

密度图可视化了单个变量的分布,它也可以被看作是一个平滑的直方图。我们可以按类别对密度图进行着色,以查看变量对分布影响。下面的代码创建了一个可视化不同建筑物类型(仅限于具有超过100个数据点的建筑物类型)的能源之星得分密度图:

我们可以看到建筑类型对能源之星评分有重大影响。办公楼往往有较高的分数,而酒店的分数较低。这告诉我们,我们应该在建模中包含建筑类型这一类,因为它确实对目标有影响。作为一类变量,我们将不得不对建筑物类型进行独热编码。

一个类似的绘制可以用来可视化自治市镇的能源之星得分如下:

自治市镇对建筑类型的评分似乎没有太大的影响。尽管如此,我们也希望将其纳入我们的模型中,因为各区之间存在细微的差异。

我们可以使用皮尔逊(Pearson)相关系数量化变量之间的关系。皮尔逊(Pearson)相关系数是衡量两个变量之间的线性关系的强度和方向的一种方法。+1分是表示完美的线性正相关关系,-1分是表示完美的负线性关系。相关系数的几个值如下所示:

虽然相关系数无法捕捉非线性关系,但它是开始分析变量之间如何取得相关性的好方法。在Pandas中,我们可以轻松计算出数据列之间的相关性:

与目标的最正相关(上)和最负相关(下):

从上图可以看出成最负相关的几项类别变量几乎都与能源使用强度(EUI)有关。能源使用强度(EUI)是表示建筑物的能源使用量是其规模或其他特性的函数(越低越好)。直观地说,这些相关性是有意义的:随着EUI的增加,能源之星评分趋于下降。

双变量图

我们使用散点图来表现两个连续变量之间的关系,这样可以在点的颜色中包含分类变量等附加信息。例如,下面的图表就体现了建筑物类型的能源之星评分对比Site EUI:

通过这个图,我们可以看出-0.7的相关系数变化。随着Site EUI减少,能源之星得分增加,这种关系在建筑类型中保持稳定。

我们最后讨论一下成对图(Pairs Plot)。这是一种很好的探索性分析工具,它可以让我们看到多个变量对之间的关系以及单个变量的分布。在这里,我们使用seaborn可视化库和PairGrid函数来创建Pais Plot–上三角部分使用散点图,对角线使用直方图以及下三角形使用二维核密度图和相关系数。

我们通过查找一行与列相交的位置,查看变量之间的交互关系。除了看起来很酷之外,这些图可以帮助我们决定在建模中包含哪些变量。

本次主要介绍了流程中的前两部分,敬请期待后边的剖析。(编译自:https://towardsdatascience.com/a-complete-machine-learning-walk-through-in-python-part-one-c62152f39420)

 

 

Related posts

Leave a Comment