• 0
  • 0
分享
  • 一个完整的机器学习项目在Python中的演练——软件测试圈
  • 饭团🍙 2021-01-07 13:24:14 字数 4137 阅读 976 收藏 0

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

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

  1. 数据清洗和格式化

  2. 探索性数据分析

  3. 特色工程和选择

  4. 在性能指标上比较几种机器学习模型

  5. 对最佳模型执行超参数调整

  6. 评估测试集合中的最佳模型

  7. 解释模型结果

  8. 得出结论和文件工作

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

问题定义

       编码之前的第一步是了解我们试图解决的问题和可用的数据。

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

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

       监督:由于我们可以访问特征和目标,我们的目标是培养可以学习两者之间映射的模型

       回归:能源之星得分是一个连续变量

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

数据清洗

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

       实际数据

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

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

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

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

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

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

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

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

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

       缺失数据和异常值

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

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

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

  • 低于第一四分位数(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–上三角部分使用散点图,对角线使用直方图以及下三角形使用二维核密度图和相关系数。

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

       本次主要介绍了流程中的前两部分,敬请期待后边的剖析。


作者:磐创 AI

原文链接:https://panchuangai.blog.csdn.net/article/details/80427437


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   如果您决定要成为一名自动化测试人员,那肯定会犯错,尤其是在进行复杂的自动化测试的时候。如果您想避免错误并精通自动化测试,请学习他人的错误。考虑到这一点,下面总结了大多数自动化测试人员犯的九个常见错误,但你不必这样做。  在开始之前,请记住100%自动化是一个神话,我们始终需要做一些手动测试。  1.自动化一切  我的第一个任务是做一个Web应用程序的Selenium自动化测试脚本。为了给我的导师留下深刻的印象,我还接手了另一个模块的自动化测试任务,几天后我就自闭了。  事实证明,那个模块不太适合去实现自动化,因为它可能会导致许多误报和漏报。这浪费了我很多时间也影响了我的名声。至少我觉得没有...
            0 0 1814
            分享
          • 一、web页面元素定位工具介绍1、打开google浏览器,按F12进入开发者模式,如下图:2、用鼠标点击下图红色框中的箭头——然后鼠标移动到web页面的元素上(此处为百度框),会自动定位到对应的html代码,如下图:二、web页面元素的8种定位方法:1、通过元素的id属性来定位元素——id是唯一标识(每个id都是不一样的)driver.find_element_by_id("kw")1 from selenium import webdriver 2 driver=webdriver.Chrome() 3 driv...
            10 10 4032
            分享
          •   如何写接口自动化?这个问题,但凡涉足过自动化测试的人员都能娓娓道来。Requests、urlib、jmeter、curl等等,不在话下。那么,如何获取接口的url、参数、响应等信息呢?!答案就更是随口而出:看接口文档、swagger/apifox等管理工具接口定义。再不济,如果是web应用,通过浏览器看接口请求啊。的确如此,有“一万”种方法可以帮助我们获取到想要的接口信息。  可是,接口文档和接口定义/说明的有无,往往取决于开发人员的自觉性。我们虽然能够要求,但也不能百分百确定一定能够获得。因此,通过浏览器等工具获取请求接口就成了我们常用的手段。  我们以访问“51testing”网站为例...
            0 0 391
            分享
          • 大数据测试挑战自动化大数据的自动化测试需要有技术专长的人员。此外,自动化工具未配备处理测试期间出现的意外问题虚拟化它是测试的整体阶段之一。虚拟机延迟会在实时大数据测试中产生时序问题。在大数据中管理图像也是一个麻烦。大数据集需要验证更多的数据,需要更快的速度;需要自动化测试工作;需要能够跨不同平台进行测试。大数据性能测试挑战多样化的技术:每个子组件属于不同的技术,需要孤立测试特定工具的不可用性:没有单个工具可以执行端到端测试。例如,NoSQL可能不适合消息队列测试脚本:需要为测试场景和测试用例设计高水的脚测试环境:由于数据量大,需要特殊的测试环境监控解决方案:存在可监控整个环境的有限解决方案诊断...
            0 0 869
            分享
          •   什么是功能测试?  进行功能测试以确保应用程序的功能符合需求规范。这是黑盒测试,不涉及应用程序源代码的详细信息。在执行功能测试时,重点应放在应用程序主要功能的用户友好性上。  要首先执行功能测试,我们需要识别测试输入并使用选定的测试输入值计算预期结果。然后执行测试用例,并将实际数据与预期结果进行比较。  功能测试类型  让我们看一下针对移动应用程序的不同类型的功能测试。  单元测试  在单元测试中,在开发阶段将测试软件应用程序的各个组件。单元测试通常由开发人员而不是测试人员完成。测试一段代码形式的功能以验证准确性。驱动程序,单元测试框架,模拟对象和存根用于执行单元测试。  单元测试通常是自...
            14 14 2237
            分享
      • 51testing软件测试圈微信