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


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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   对于每个个人而言,如果知识+经验+能力+态度均优,则职位和薪资肯定会是非常不错。也就是我结合自身20多年质量管理工作检验所总结的一句话:胜在认知、赢在思维、贵在认真。至于在品质管理方面如何日积月累锻炼出不俗造诣则可以从以下逐步提升。  在职场中,有非常多的质量工作岗位,如:检验员、质量工程师、体系工程师、质量科长、质量经理、质量审核员、质量总监、质量专家、质量顾问等等。不同的岗位有着不同的质量知识储备,但有一点是毋庸置疑的,那就是每个人的质量知识都是从无到有,从有到多,从多到精,都是通过日积月累的持续学习所获得的。本文的意图是希望通过清晰简单的方式指导零基础、薄弱基础的质量从业人员逐步学习...
            0 0 1006
            分享
          •   在国内的测试行业里面,很多情况下就是“为了做自动化测试而去做自动化测试”这就是典型的本末倒置。无论你在测试的过程中采取什么样的方案和手段,核心都是为了业务去服务的,脱离业务,手段再厉害也没有用。  不得不说,很多情况下,我们的老板们对于自动化并没有一个合理的预期。很多老板想的是:搞了自动化测试就可以不用手工测试了嘛,然后再招几个价钱低的测试就行了。这是大错特错的。  关于领导认知层面的问题:  1、不清楚自动化测试目标是什么,对于达到目标所要进行的投入也没有计划;  2、盲目幻想,认为自动化测试能够省钱,想着搞起来自动化,省掉多少多少人力成本;  3、自动化测试如果做的成功的话,是可以节省...
            0 0 939
            分享
          • 1.请做一下自我介绍吧面试题要点:考察你的语言表达能力,以及获取你的基本信息和大致情况。分析:包含内容有名字+工作经历+做过的项目。一定要提前准备好,保证表达的流畅。控制在1分钟左右。注意:不要说离职原因,不要说转行,不要给自己挖坑。--外企项目,英文自我介绍-内容也差不多。参考示例:我叫xxx,16年从xx学校xxx专业毕业,毕业至今从事测试工作,到现在有3年了。3年中我待过2家公司,第一家是一个x,主要业务是做xx的。我最近的一家公司吧,主要是做互联网金融业务的,它有web端和APP端的项目,我这两个项目都有参与测试。我负责的主要测试内容包括在web和APP端前端页面还没有完成之前,完成产...
            0 0 1098
            分享
          • 随着客户业务扩张,一个微信已经满足不了需求,需要在手机上同时登录两个微信,用来联系用户。这个时候我们的一些软件需要用到分享到微信的场景时,就不得不考虑双开微信这个特殊性。双开微信时,第二个微信有如下限制:1、图片无法分享到第二个微信,链接,文本可以。分享图片会提示分享成功,但是实际对话框中没有这个图片。这个问题后来可以通过更新友盟SDK解决。2、第二种,分享到微信之后的行为监控,是只要调用微信分享接口就可以。还是需要监控分享后有没有真正的发给好友或者发送到朋友圈,一般游戏送机会或者积分对第二种要求比较严格。测试的时候如何应对,首先,需要区分哪些问题是微信本身不支持,哪些问题是软件限制,这种情况...
            1 1 14243
            分享
          •   前言  面试的时候,经常会临场出题:给你一个xxx, 如何测试, 或者说如何写测试用例?xxx可以是圆珠笔,水杯,电梯等生活中常见的场景。  那么给你一个支付的二维码,如何写测试用例呢?  二维码扫码支付  如下图,给你这个个人收款的二维码,如何测试?  首先要知道什么是二维码? 二维码实际上就是一个 url 地址,当手机扫码后,会根据二维码上的黑和白(黑色的色素块代表1,白色的色素块代表0)区域解析成 url 地址。  然后再分析下使用场景,这里实际上涉及到一个收款方,一个支付方。收款方生成二维码,支付方拿着手机去扫码。  知道使用场景了,接着拆分功能点,从字面上"二维码扫码支...
            13 11 3663
            分享
      • 51testing软件测试圈微信