习概念及其对业务目标的影响是非常重要的。
算法的选择
在问题定义上的一个小变动可能需要有一个完全不同的算法来解决,或者至少要使用不同的数据输入来构建不同的模型。一个能够为用户识别照片类型的约会网站可以使用无监督学习技术(比如聚类)来识别常见的主题。而如果要向特定的某个人推荐潜在的约会对象,则网站可能要使用基于输入的监督学习,输入数据需具体到个人,例如他们已经看过的照片。
特征的选择
机器学习模型识别数据中的模式。输入到模型中的数据被组织成特征(也称为变量或属性):这些特征都是相关的、大部分独立的数据片段,描述了你想要预测或识别的现象的某些方面。
以前文提到的那家希望优先考虑贷款申请人外展服务的公司为例。如果我们将问题定义为“根据客户转换的可能性优先考虑”,我们将会得到包括类似客户对公司各种外展活动的响应率等特征。如果我们将问题定义为“优先考虑最可能偿还贷款的客户”,我们就不会得到这些特征,因为它们与评估客户的可能性无关。
目标函数的选择
目标函数是你要优化的目标,或者是模型试图预测的结果。例如,如果你向用户推荐他们可能感兴趣的商品,则模型的输出可能是用户在看到商品时点击该商品的概率,也可能是用户购买商品的概率。目标函数的选择主要取决于业务目标,在这个例子中,你对用户的参与感兴趣(目标函数可能是点击或停留的时间)还是对营业收入感兴趣(目标函数是购买)?另一个要考虑的关键因素是数据的可用性:对于要学习的算法,你必须提供大量“标记”为正(用户看到并点击的产品)或负(用户看到的产品,但没有点击)的数据点。
二、如何开发机器学习模型?
摘要: 创建一个优秀的机器学习模型跟创建其他产品是一样的:首先从构思开始,把要解决的问题和一些潜在的解决方案放在一起考虑。一旦有了明确的方向,就可以对解决方案进行原型化,然后对它进行测试以确定是否满足需求,不妨看看本文是如何一步一步实现的。
建模步骤一览
从较高的层次上来讲,创建一个优秀的机器学习模型跟创建其他任何产品是一样的:首先从构思开始,把要解决的问题和一些潜在的解决方案放在一起考虑。一旦有了明确的方向,就可以对解决方案进行原型化,然后对它进行测试以确定是否满足需求。你需要在构思、原型设计和测试之间不断地迭代,直到你的解决方案足够好,并能够投入市场,此时你就可以将其产品化,并发布出去。现在,我们来看看每个阶段的细节吧。
由于数据是机器学习的重要组成部分,因此我们需要在产品开发过程之上进行数据分层,因此我们的流程如下所示:
- 构思。让待解决的关键问题和针对解决方案的潜在数据输入保持一致。
- 数据准备。以一种有用的格式收集和获取数据,以便对模型进行理解和学习。
- 原型与测试。建立一个或一组模型来解决问题,测试它们执行和迭代的程度,直到有一个模型能得到令人满意的结果。
- 产品化。让模型以及数据收集与处理稳定化、规模化,以便在生产环境中生成有用的输出。
构思
这个阶段的目标是要让模型解决的关键问题、目标函数和潜在的输入作为一个整体与模型保持一致。
- 与问题保持一致。如前所述,机器学习可用于解决真正的业务问题。请确保你的团队和公司中的所有利益相关者就你正在解决的问题以及如何使用解决方案达成一致。
- 选择目标函数。待解决的问题决定了模型的目标是什么。模型试图预测的目标函数是什么?你是否在查找数据中的模式?例如,将照片集按照某种特征分成多个组。
- 定义质量指标。你如何衡量模型的质量?在没有看到真正结果的时候,一般很难预见可接受的质量,但目标的定向性对此是有帮助的。
- 集思广益所有可能的输入。你的目标是确定哪些数据可以帮你解决问题或者做出决定。最有帮助的问题是:“专家会如何处理这个问题”。考虑一下解决方案将以什么样的变量或者数据为基础。每一个可能影响人类判断的因素是否都应该测试。请尽可能广泛地搜集这些问题的答案。了解关键因素可能需要有商业方面专业的知识,这是企业或者产品人员需要在此阶段中频繁参与的重要原因之一。数据团队将不得不将这些潜在的输入转化为模型特征。请注意,为了将输入转换为特征,可能需要额外的处理,后面我们会详细讨论这个。
数据准备
本阶段的目标是收集原始数据,并将其作为原型模型的输入。你可能需要对原始数据进行复杂的转换才能使其成为输入数据。例如,假设你的某个特征是消费者对品牌的看法:你首先需要找到消费者谈论品牌的相关来源。如果品牌名称包括常用词(例如“苹果”),则需要将品牌名称与一般情况下的含义(与水果有关)区分开来,然后再通过观点分析模型来运行,所有这些都要在构建原型之前完成。并非所有的特征构建起来都很复杂,但有些可能需要耗费大量的工作。
让我们来更详细地了解一下这个阶段需要做什么:
- 以最快的速度收集数据。首先,确定缺少了哪些数据。在某些情况下,你可能需要对必要的输入分解到“构建块”级别,或者是到代理级别,这样才能更方便地获取到数据。一旦确定下来缺少哪些数据,就要以最快捷、最简单的方法去获取。对于不可扩展的方法,比如手工下载或购买数据样本,即使代价有点高但可能却是最实际的方法。在这个阶段采集太多的数据通常没有太大的意义,因为你不了解数据是否有用,哪种格式***,等等。商业人士应该参与到这个阶段中来,因为他们可以协助数据专家们从大量的渠道获取到原本不太容易获取的数据。请注意,在监督学习算法中,你不仅需要用于模型特征的数据,你还需要为模型的目标函数提供数据点,以进行训练、验证以及测试模型。回到房价那个例子,为了建立一个预测房价的模型,你需要一些包含房价的房屋信息!
- 数据清洗与规范化。在这个阶段中,数据科学或工程团队将承担起主要的工作职责。他们将投入大部分的精力把构思和原始数据转化为实际的模型。数据集需要进行检查和清洗,以避免使用不良数据以及不相关的异常值等等。同时,数据还可能会以不同的比例进行转换,以使其更容易地与其他数据集一致,并能一起使用。特别是在处理文字和图像的时候,通常需要对数据进行预处理,以提取相关的信息。例如,将太多太大的图像插入模型可能会导致信息过量而无法处理,因此你可能需要降低图片的质量、使用图像的其中一部分或仅使用对象轮廓。对于文本,你可能需要检测与文本相关的实体,进行观点分析,查找常用的n-gram(经常用于表示一定数量单词的序列)或执行各种其他的转换。这些通常可由现成的库来实现,无需重新发明轮子。
原型与测试
这个阶段的目标是获得一个模型的原型,测试并对它进行迭代,直到能够得到一个足够好并且能够用于生产的的模型。
- 构建原型。一旦数据准备完毕,数据科学团队就可以开始研究实际的模型了。这个阶段涉及到大量的实验,比如选择最相关的特征、测试多种算法等。这并不是一个简单的任务,获得用于生产模型在时间计划上并不好把控。
- 验证和测试原型。在这个阶段中,数据科学家的职责就是要确保最终生成的模型尽可能的好。他们将根据预定义的质量度量标准来评估模型的性能,比较不同算法下模型的性能,调整各种参数并对最终的模型进行性能测试。对于监督学习,需要确定模型预测的结果是否能够满足你的需求。对于无监督学习,根据问题的不同,有多种不同的性能评估技术。以聚类为例,你可以轻松地绘制出在多个维度上聚类的对象。如果算法使用了关键字来标记文档,那么关键字是否有意义呢?在打标记失败或重要用例丢失的情况下,是否有明显的差距呢?这并不能代替更加科学的方法,但在实践上有助于快速改进。
- 迭代。此时,你需要与团队一起来决定是否需要进一步的迭代。该模型与你的预期有多少相符?它是否表现得足够好,让你目前的业务状况得到显著的改善?是否有特别薄弱的方面?是否需要更多的数据点?你能想到其他特征来提高性能吗?是否有替代数据源可以提高模型的输入质量?等等。这些都需要集思广益。
产品化
当原型模型能够很好地解决业务问题,并能进入生产的时候,你就来到了这个阶段。请注意,如果尚未准备好进行全面的产品化,你需要首先确定模型要扩展的比例。比如说,对于一个电影推荐工具:你可能是先对少数用户提供推荐服务,但要为每个用户提供完整的使用体验,在这种情况下,模型就要根据每个用户的相关性对数据库中的每个电影进行排序。与仅推荐动作电影相比,这是另一个不同的扩展要求。
现在,我们来探讨一下有关将模型生产化的更多的技术细节:
- 增加数据覆盖率。在很多情况下,你可以用比生产中更少更有限的数据来构建原型。例如,你可以根据特定客户来构建原型,然后将其扩展到整个客户群。
- 扩展数据收集。一旦验证了哪些数据对模型有用,你需要构建一种可扩展的方式来收集和获取数据。在原型设计阶段,以手动方式来收集数据还是可以的,但是对于生产,你应该尽可能地自动化。
- 刷新数据。创建一个随时间刷新数据的机制,以更新现有值或添加新信息。除非由于某种原因不能保留历史数据,否则系统应该要以某种方式来持续积累更多的数据。
- 扩展模型。这个包含了数据科学和工程学两个方面的内容。从数据科学的角度来讲,如果你更改了基础数据,例如扩大了客户群的数量,就需要重新训练和测试模型。在特定数据集上工作良好的模型并不一定能适用于更广泛或其他不同的数据集。从架构上来讲,模型需要能够在数据不断增长的基础上及时扩展以进行更频繁地运行。在电影推荐示例中,可能会有更多的用户、更多的电影以及有关每个用户喜好的更多信息。
- 检查特殊值。虽然模型也许在整体上可以很好地扩展,但在某些很小但很重要的情况下可能就无法正常工作了。例如,电影推荐的平均使用效果可能还不错,但对于家长来说,如果他们用自己的账号为孩子选择了电影,那么推荐系统就会显示儿童电影。这是一个产品设计问题,你需要在产品中将父母自己的建议与为孩子的建议分开来,但是,这并不是模型可以告诉你的。
到目前为止,我所描述的是一个概念性的流程。在现实中,界限一般比较模糊,你经常需要在不同阶段之间来回走动。你可能会对数据的供给不满意,从而考虑重来,或者在模型产品化之后,你发现模型并不能很好的工作,你不得不退回去重新构建原型。