作者 | 梁唐
大家好,日拱一卒,我是梁唐。
我们今天继续学习《机器学习实战》一书,之前我们已经聊完了第一章当中关于机器学习背景知识和基本概念。进入第二章,书中给了我们一个亲自动手建立端到端机器学习项目的案例,让我们从案例当中亲身体会机器学习模型的应用。
书中将一个算法工程师的工作分成了几个大的步骤,这只是一个案例,可能和当今互联网公司中的实际情况不完全一致。但大体上还是差不多的,可以拿来当做一个参考。
所谓的观察大局,意思是说对于项目的背景、待解决的问题、数据的特点、应用场景、用户习惯等等方面做一个全面的了解。
不用的问题拥有不同的背景,需要使用不同的技术,可能会遇到不同的问题。总之在机器学习的应用领域几乎没有什么是固定的,太多的内容需要依靠算法工程师自身的经验以及实际情况随机应变。但随机应变不是瞎变,需要有事实和逻辑依据。
事实和逻辑依据怎么来的?其实就是从对大局的观察、问题和数据的分析当中得来的。
这当然也是至关重要的一个部分,没有数据就没有模型,自然也就无从解决问题了。
关于这点之前也粗略地提到过,对于像是搜广推这样有明确反馈数据的场景来说,搜集数据不算是太大的问题。而对于其他需要依赖人工标注的场景来说,则会构成瓶颈。
对于想要自学的同学来说,可以使用一些公开免费的数据集,或者是类似kaggle、天池大数据这样的竞赛网站中的数据。
数据分析,以及从数据分析中获得结论。相比于技术来说,更考验对数据当中调理以及逻辑的洞悉能力以及敏感,当然也离不开经验。
数据分析是算法工程师工作当中非常重要的一步,很多想法不经过验证永远只是想法,只有经过数据验证才是可行的方案。
包括数据处理、特征生成加工、压缩或者是关键信息提取等步骤。
选择模型、实现模型,之后使用训练集进行训练得出结果。
调整参数、优化算法等,从而达到最好的训练效果。
书中列举了几个常见的公开免费的数据集,我们可以使用其中的数据来帮助我们学习机器学习相关算法以及做相关实验。
网址:http://archive.ics.uci.edu/ml/index.php
来源纽约大学欧文分校,经常作为标准测试剂出现在许多机器学习相关的论文当中。很多机器学习的经典案例都是来源于这个数据集。
网址:https://www.kaggle.com/datasets
经典机器学习比赛平台kaggle的数据集,除了提供数据之外,kaggle还提供完善的环境供开发者使用。不仅如此,kaggle还提供一定额度免费使用的GPU资源。
亚马逊的数据集,相对来说比上面两个更冷门一些。
除了这三个比较著名的公开数据集之外,还有:
还可以参考一些论坛社区中的总结:
在这个章节当中,我们做加州地区房价的预测,要用到的数据是1990年美国加州地区的房价数据。这份数据源于Statlib数据库。Statlib是卡耐基梅隆大学的开源数据集,我们先做一个简单的了解,具体怎么获取会在之后用到的时候再介绍。
在kaggle当中也收录了这份数据,https://www.kaggle.com/datasets/camnugent/california-housing-prices
面对这样的数据集,我们要做哪些事情来观察大局呢?别着急,我们从主到次一点一点来说。
首先要做的当然是明确目标,我们为什么要做这个模型,我们希望通过这个模型得到什么样的效果?
在这个案例当中,我们可以假设我们是某家公司的算法工程师,现在老板给了我们这样一个项目。那么我们首先要做的,当然是明确这个项目的目标。站在一个稍微比较大的视角上看待这个问题。
我们要对房价进行预测,那么显然,我们的目标是精准。我们模型的预测结果和真实结果越接近,说明效果越好。所以我们的目标就是预测结果尽量精确,误差尽量小。
在这个问题当中目标很明确,但不是所有的情况都是如此。很多时候老板传输的往往是一个业务目标,比如某某指标增长,某某业绩增加。但具体落实在技术上或者是模型上的目标,则就需要我们根据理解和能力来制定了。
当我们的模型做好了之后,它会应用在哪里?它依赖哪些上游,又会在哪些下游投放?上下游的合作方式和模式是怎样的?
虽然这里我们并没有一个老板或者其他信息来源,但我们依然可以设想一下,公司里的合作关系大概是怎样的。我们会有哪些上游和下游,我们做出来的这个模型最终会应用在哪里。
对于这些问题,书上给出了一个样例作为参考:
我们会有一个上游部分替我们搞定数据的获取以及存储,我们负责用模型对还没有出价的房屋给出预估出价。拿到了出价之后,给到下游投资分析团队进行分析,最后帮助公司做出商业决策。
虽然这只是一个例子,但已经和当前互联网公司中的情况非常相似了。大多数算法团队的下游就是直接负责盈利或面向用户的业务方,算法工程师是距离业务方最近的技术团队。
商业公司当中,离钱越近说明越重要,所以我们可以知道,算法团队在商业上以及公司里的价值都是非常高的。
作为一个合格的算法工程师,只是专注在模型和数据当中是不够的,还需要对上下游的技术架构有一定的了解。
比如上游的数据是怎样生成的,经过了怎样的处理流程。这其中最大的瓶颈或者是难点是什么,针对这些难点使用了哪些技术栈来解决,解决之后的效果如何。这些都是值得我们关心的问题。
理解了这些不仅更能有助于我们发现问题、理解当前的问题场景,还能提升我们对于整个系统架构设计的能力,为以后向更高level的职位进发打下基础。
关于这个案例的前期准备部分内容差不多就是这些,在下一篇文章当中我们将会从搜集数据开始正式实战。感兴趣的小伙伴不妨期待一下。