大家往往会选择一本数据科学相关书籍或者完成一门在线课程来学习和掌握机器学习。但是,实际情况往往是,学完之后反而并不清楚这些技术怎样才能被用在实际的项目流程中。就像你的脑海中已经有了一块块”拼图“(机器学习技术),你却不知道如何讲他们拼起来应用在实际的项目中。如果你也遇见过同样的问题,那么这篇文章应该是你想要的。本系列文章将介绍一个针对真实世界实际数据集的完整机器学习解决方案,让您了解所有部分如何结合在一起。
本系列文章按照一般机器学习工作流程逐步进行:
问题定义
编码之前的第一步是了解我们试图解决的问题和可用的数据。在这个项目中,我们将使用纽约市的公共可用建筑能源数据
(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数据类型:
一旦相应列都转换成了数字,我们就可以开始进行数据分析。
尽管删除信息需要格外小心,但对于那些缺失值的比例很高的列,它们对于模型的训练很有可能是没有意义的。删除这些列的具体阈值取决于具体问题,对于本项目来说,我们选择删除缺失值超过50%的列。
然后,我们还需要对异常值做处理。那些异常值可能是由于数据输入中的拼写错误或者错误统计等等原因造成的,或者一些不是上述两个原因但是对模型训练没有好处的极端值。对于这个项目,我们将根据极端异常值(extreme outliers)的定义(https://www.itl.nist.gov/div898/handbook/prc/section1/prc16.htm)来处理异常值:
探索性数据分析(EDA)
现在,我们已经完成了数据清洗这个略微乏味的步骤。接下来就可以对我们的数据进行探索性分析了。探索性数据分析(EDA)是分析数据集以总结其主要特征的方法,通常使用可视化的方法。
简而言之,EDA的目标是了解我们的数据可以告诉我们什么,以帮助我们合理选择和使用数据特征。
从上图可以看出能源之星得分(ENERGY STAR Score)分布是不均匀的,最高分100分和最低分1分有占很大一部分。然而,能源之星得分是一个百分位数,我们希望看到一个统一的分布,每个得分分配给相同数量的建筑物。
如果我们回到能源之星得分的定义,我们会看到它是基于“自我报告的能量使用”,这可能就解释了为什么会有这么多非常高的分数。要求建筑物所有者报告自己的能源使用情况就像要求学生在测试中报告自己的分数一样,高分往往会居多。因此,这可能不是衡量建筑物能效的最客观标准。
如果我们有无限空闲时间,我们可也许能想要调查为什么这么多建筑物有非常高或非常低的分数,甚至可以通过选择这些建筑物并分析它们的共同点。但是,我们的目标只是预测分数,而不是设计更好的建筑物评分方法。所以,我们可以在我们的报告中记下分数具有可疑分布,但我们主要关注的还是分数预测。
密度图可视化了单个变量的分布,它也可以被看作是一个平滑的直方图。我们可以按类别对密度图进行着色,以查看变量对分布影响。下面的代码创建了一个可视化不同建筑物类型(仅限于具有超过100个数据点的建筑物类型)的能源之星得分密度图:
我们可以看到建筑类型对能源之星评分有重大影响。办公楼往往有较高的分数,而酒店的分数较低。这告诉我们,我们应该在建模中包含建筑类型这一类,因为它确实对目标有影响。作为一类变量,我们将不得不对建筑物类型进行独热编码。
一个类似的绘制可以用来可视化自治市镇的能源之星得分如下:
自治市镇对建筑类型的评分似乎没有太大的影响。尽管如此,我们也希望将其纳入我们的模型中,因为各区之间存在细微的差异。
我们可以使用皮尔逊(Pearson)相关系数量化变量之间的关系。皮尔逊(Pearson)相关系数是衡量两个变量之间的线性关系的强度和方向的一种方法。+1分是表示完美的线性正相关关系,-1分是表示完美的负线性关系。相关系数的几个值如下所示:
虽然相关系数无法捕捉非线性关系,但它是开始分析变量之间如何取得相关性的好方法。在Pandas中,我们可以轻松计算出数据列之间的相关性:
与目标的最正相关(上)和最负相关(下):
从上图可以看出成最负相关的几项类别变量几乎都与能源使用强度(EUI)有关。能源使用强度(EUI)是表示建筑物的能源使用量是其规模或其他特性的函数(越低越好)。直观地说,这些相关性是有意义的:随着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)