上图白板展示了一系列机器学习项目启动
机器学习覆盖的范围十分广泛。这篇文章将整体描述机器学习适用的典型问题,提供实现机器学习项目雏形的框架。
首先厘清一些定义。
机器学习、人工智能和数据科学区别何在?
这三个主题没有明确的定义,因而有些难以理解。为防止误解,我们将问题简化。读者可以认为本文提到的机器学习就是发现数据中的规律,以理解某些问题或者预测未来事件。
希望读者在阅读以下步骤时能边学边做,检验结果。在实践中学习。
一条机器学习管道可以被分解成三个主要步骤:数据收集、数据建模和模型运用。这三个步骤相互影响、环环相扣。
启动项目时,你可能走入如下循环:收集数据,对其建模,发现收集到的数据质量较差,重新收集数据,建模,运用这一模型,发现它并不管用,重新建模,运用,发现新模型仍然没用,再次收集数据……
等等,模型是什么?运用又是什么?如何收集数据?
好问题。
收集数据的方式取决于问题。下文将展示一些例子,读者也可以看看电子表中的顾客购买记录。
建模就是运用机器学习算法从收集到的数据中寻找知识。
普通算法和机器学习算法的区别是什么?
普通的算法就像菜谱,是把原料转换为美味菜肴的一系列指令。
机器学习的特殊之处在于,原始条件是材料和菜肴,而非指令。机器学习算法研究原料和菜肴,给出转换所需的指令。
机器学习算法多种多样,不同算法解决不同问题的性能不同,但是它们的目标一致,即寻找数据中的模式或者指令集。
运用就是实际应用找到的指令集。运用的形式多种多样,既可以是在网络商店中向顾客推荐商品,也可以是为医疗机构寻找更好的疾病检测方案。
不同项目中每个步骤的具体细节不尽相同,但是原理基本相似。
本文重点讲解数据建模。假设读者已经收集到了数据,正准备用它构建一个机器学习模型。这个过程可以分为以下几步:
机器学习项目可以分为三步,数据收集,建模和模型运用。本文主要关注建模阶段,并假设读者已经拥有数据。
1. 问题定义——要解决的商业问题是什么?如何把它转化为机器学习问题?
2. 数据——既然机器学习是在数据中洞察规律,那么数据是什么类型的?它如何与问题产生关联?数据是结构性的还是无结构的?静态的还是动态的?
3. 模型评估——怎么样才算成功?准确率95%的机器学习模型够好吗?
4. 变量——需要使用哪一部分数据?已知信息如何影响数据使用?
5. 建模——选择哪个模型?如何改进?如何比较不同模型的性能?
6. 实验——还可以做什么尝试?模型的表现符合预期吗?已知信息如何影响其他步骤?
下面深入讨论上述问题。
1. 问题定义——把商业问题改写成机器学习问题
判断能否运用机器学习,第一步是把待解决的商业问题转化为机器学习问题。
有监督学习、无监督学习、迁移学习和强化学习是四种主要的机器学习技术(此处为了行文简单,省略了半监督学习)。其中监督学习、无监督学习和迁移学习最常应用于商业项目。
有监督学习
- 已知数据和类标的机器学习称为监督学习。机器学习算法旨在研究影响类标的因素。监督发生在训练阶段。如果算法猜错了类标,它会尝试自我修正。
- 比如,如果试图检测某人是否患有心脏病,可以把100份匿名病历作为数据,是否患有心脏病作为类标。
- 机器学习算法可以研究病历(输入)以及病人是否患有心脏病(输出),然后判断病历中的哪些指标导致心脏病。
- 训练好算法之后,就可以把新病历(输入)传给算法,算法将预测患者是否患有心脏病(输出)。算法返回的结果只是患病概率的大小,它并不绝对。
- 算法会告诉你:“基于观察,这个人的病历和心脏病人的病历相似度达到70%。”
无监督学习
有数据而没有类标的机器学习称为无监督学习。以在线电子游戏商店的顾客支付记录为例。可能希望使用这些数据将顾客分组,从而提供个性化服务。可以使用机器学习算法来完成这一任务。
观察分组之后人为给出类标。有些组可能对电脑游戏感兴趣,有些组则更喜欢独立游戏,还有的组只购买打折游戏。这一过程称为聚类。
一定要记住算法不提供类标,它只是寻找相似顾客间的规律。类标需要专业人士运用专业知识给出。
迁移学习
迁移学习改进已有机器学习模型发现的规律,将其用于学习新问题。
从零开始训练机器学习模型可能浪费大量金钱和时间。好在并不总是需要自己搭建模型。有时机器学习算法在一类数据中找到的规律可以用于另一类数据。
比如一家汽车保险公司想要搭建一个文本分类模型,以判断保险申请人是否需要承担事故责任。
可以使用一个通读过维基百科并且记住了单词间规律(比如哪些词可能搭配出现)的已有模型。使用保险申请书(数据)及其结果(类标)对模型进行微调,就可以把它运用于你的问题。
商业项目中所用到的机器学习技术很可能属于以上三个类别。
接下来再把它们细分为分类、回归和推荐。
- 分类——预测事物所属的类别。比如顾客是否会购买某种商品,或者某人是否患有心脏病。注意,类别可以多于两种。把事物分为两类称为二元分类,分为三类及以上称为多元分类。多标签指的是同一事物可以同时属于多类。
- 回归——预测具体数值。比如房屋的售价,或者下个月访问网站的人数。
- 推荐——向某人推荐某物。比如基于购买记录为顾客推荐商品,或者基于阅读记录向读者推荐书目。
了解了这些,下一步就是用机器学习术语描述商业问题。
沿用刚才的汽车保险案例。保险公司的员工每天需要阅读成千上万的申请书,并判断申请人是否应该承担事故责任。
但现在申请的数量逐渐超出员工处理能力。而公司拥有成千上万的申请书记录,每一份都标注了申请人是否应负事故责任。
机器学习能派上用场吗?
读者想必已经知道答案。但还是来验证一下。这一问题能归到上述的三类问题——分类、回归或者聚类之中吗?
重新描述这一问题。
一家汽车保险公司希望把收到的保险申请分为申请人应负责任和申请人无责任两类。
看到分类这个关键词了吗?
分析结果是,这可能是个潜在的机器学习分类问题。“潜在”是因为机器学习也可能无法解决这个问题。
把商业问题转化为机器学习问题时,尽量由浅入深。在起始阶段,超过一个句子的问题描述都是多余的。必要时再把问题复杂化。
2. 数据——数据是什么类型的?它如何与问题产生关联?
已拥有或者需要收集的数据取决于待解决的问题。
已有的数据可能是结构数据或者非结构数据。这两种数据又可以分别分为静态或动态数据。
- 结构数据——比如由许多行和列构成的表格,记录顾客交易信息的电子表,存储病历的数据库。数据可能是数值,比如平均心率;也可能是类别,比如性别;或者等级,比如胸痛程度。
- 非结构数据——无法被简单地制成表格的数据,比如图片、音频文件和自然语言文本。
- 静态数据——现存的、无法改变的历史数据。比如顾客购买记录。
- 动态数据——经常更新的数据,可能更改旧纪录或不断添加新纪录。
这四类数据可能彼此重叠。
静态的结构化信息表也可能包含不断更新的文本和照片。
用于预测心脏病的数据表中可能包含性别、平均心率、平均血压和胸痛程度。
在保险申请书的例子中,可能有一项数据是发送的文本,另一项是照片,最后是申请结果。随着新申请的输入和旧申请的更改,表格将不断更新。
两种不同类型的结构数据。表格1.0包含数值和类别数据。表格2.0以结构化形式包含图片和自然语言文本等非结构数据。
两种不同类型的结构数据。表格1.0包含数值和类别数据。表格2.0以结构化形式包含图片和自然语言文本等非结构数据。
尽管数据种类不同,原则都是一致的,那就是使用数据以获取知识或者预测事件。
有监督学习使用特征变量来预测目标变量。预测心脏病可能需要用到性别这一特征变量,目标变量可能是病人是否患有心脏病。
表格1.0分成ID栏(黄色部分,不用于构建机器学习模型),特征变量(橘色部分)和目标变量(绿色)。机器学习模型识别出特征变量中的规律,用它来预测目标变量。
无监督学习没有类标,但仍然需要发现规律。这意味着把相近的样本分为一类,并找出离群值。
迁移学习和有监督学习需要解决相同的问题,除非要自行改变从别处得到的机器学习算法。
记住,使用客户数据来改进商业模式或者服务质量时,一定要让他们知情。这就是为什么到处都能看到“本网站使用cookies”的提示。这些网站研究用户的浏览习惯,使用机器学习来改进服务。
3. 评估——如何定义成功的机器学习模型?准确率95%足够好吗?
已经把商业问题转化成机器学习问题,也已经拥有数据。接下来考虑如何判断模型是否成功。
分类、回归和推荐问题的评价标准不同。选择何种标准取决于问题类别。
要让这个项目成功,模型的准确率至少需要达到95%。
用准确率95%的模型分析保险申请的责任人或许绰绰有余。但是心脏疾病检测可能需要更精确的结果。
下面是分类问题中需要考虑的其他事项。
- 假阴性——模型预测结果为阴性,但结果实际上为阳性。对于预测垃圾邮件这样的问题来说,假阴性可能无关紧要。但如果自动驾驶车辆的计算机视觉系统没有检测到行人,就可能酿成大祸。
- 假阳性——模型预测结果为阳性,但结果实际上为阴性。某人被诊断患有心脏病而实际上并未患病。只要没有对病人的生活习惯造成不良影响或者进行无谓的治疗,这样的错误可能无关紧要。
- 真阴性——模型预测结果为阴性,真实结果也为阴性。这是理想的结果。
- 真阳性——模型预测结果为阳性,真实结果也为阳性。这也是理想的结果。
- 准确率——符合真实结果的阳性预测的比例。一个没有产生假阳性结果的模型准确率为1.0。
- 查全率——检测出的阳性结果占所有阳性结果的比值。一个没有产生假阴性结果的模型查全率为1.0。
- F1值——准确率和查全率的综合结果,数值越接近1越好。
- 接收者操作特征(ROC)曲线和曲线下面积(AUC)——ROC曲线的图像用于比较真阳性和假阳性率。AUC是ROC曲线下的区域。完全错误的模型AUC为0.0,完全正确的模型AUC为1.0。
回归问题(关于数值预测)需要降低预测结果和真实值之间的误差。预测房屋售价时,模型的预测结果越接近实际价格越好。使用MAE或者RMSE来度量这一误差。
- 平均绝对误差(MAE)——模型预测结果和实际值间的平均误差。
- 根均方误差(RMSE)——模型预测结果和实际值间的平均方差
如果想让数值大的错误更加显著就使用RMSE来度量。比如预测为20万美元的房子实际价格为30万美元,差值为10万比差值为5万的结果要坏一倍以上。如果差值为10万比差值为5万坏一倍,那就使用MAE来度量。
推荐问题的解决方案更难测试。一种方式是在建模时隐藏部分数据。建模完成后再预测这部分数据的推荐结果,观察它与实际结果的相关性。
比如为顾客推荐网店商品时,已知2010至2019年度的购买记录。可以使用2010至2018年的数据来构建模型,然后用模型来预测2019年的情况。这样就把问题转化为了分类,因为目标变为了确认某人是否可能购买某件商品。
然而,传统的分类方法并不是推荐问题的最优解。准确率和查全率没有级别区分。
如果机器学习模型推荐了十个商品,你肯定希望页面上首先显示最符合顾客需求的商品,对吧?
- 准确率@k——和一般的准确率原理相同,但只在符合要求的项目中选择k个。比如,k取5意味着只选出最好的五个推荐项。可能有10000种商品,但不可能把它们全部推荐给顾客。
特征——数据有哪些特征?哪些特征可以用来搭建模型?
数据各不相同。特征指的是数据集中不同种类的数据。
特征主要可以分为类别型,连续型(数值型)和衍生型。
- 类别型特征——特征值可以被划分为不同的种类。比如心脏病预测问题中患者的性别。或者网店问题中某人是否购买了商品。
- 连续型(或数值型)特征——平均心率或者登录次数这类可以用数值度量的特征。
- 衍生特征——从数据中派生出的特征,常被称为特征工程。特征工程就是某个领域的专家运用知识生成数据。比如把登录次数和时间戳结合起来,计算出距上次登录时间这一新特征。或者把日期转换为是否为工作日这一新特征。
文本、图像,任何东西都可能是特征。任何特征都需要转换成数值才能被机器学习算法用于构建模型。
以下是一些关于特征的注意事项。
- 保证特征在训练和测试过程中一致——应该尽量使用接近真实系统中的特征来训练模型。
- 和该领域的专家合作——已知信息有哪些,它们如何影响选择使用的特征?与机器学习工程师和数据科学家分享这些信息。
- 特征是否有价值?——如果只有10%的样本含有这一特征,它适合用于建模吗?优先选择覆盖面最广的特征,也就是说,大多数样本都包含这些特征的对应数据。
- 完美意味着错误——准确率百分之百的模型往往是错把训练数据用于测试产生的。没有十全十美的模型。
可以简单地使用特征设立基本标准。客户流失方面的专家可能知道,三周没有登录的顾客有80%的几率会注销会员。
或者,房产中介可能知道,卧室多于5个并且卫生间多于5个的房屋售价高于50万美元。
这些标准经过了简化,而且无需太精确。但你可以尝试用它们来改进机器学习模型。
5. 建模——应该选择哪个模型?如何改进模型?如何比较不同模型?
定义好问题、确定好数据、评价标准和特征之后,就可以开始建模了。
建模分为三部分,选择模型,改进模型和比较模型。
选择模型
选择模型时需要考虑可读性,可维护性,数据量以及训练和预测方面的限制。
- 可读性和可维护性——模型如何做出决策?如何修复错误?
- 数据量——数据的规模有多大?数据规模会改变吗?
- 训练和预测方面的限制——这一项与上两项息息相关,有多少时间和资源可投入训练和预测?
首先,简化这些问题。一个艺术品般完美的模型可能很有诱惑力。但是如果2%的性能改善需要耗费10倍的计算资源和5倍的时间,或许不做改进为好。
逻辑回归之类的线性模型通常易于理解,训练和预测速度也比神经网络等深度模型要快。
但是真实世界中获取的数据不总是线性的。
那怎么办?
决策树集成和梯度提升算法用于处理excel表和数据帧之类的结构数据效果最好。了解随机森林、XGBoost和CatBoost算法。
神经网络之类的深度学习模型适用于图片、音频文件和自然语言文本。代价是它们需要更长的训练和预测时间,并且更难调试。但这不意味着不应该使用它们。
迁移学习结合了深度学习模型和线性模型的优点。它使用预先训练好的深度学习模型,将其识别出的模式输入线性模型。这将极大节约训练时间。
哪里可以找到预先训练好的模型?
预训练模型可以在PyTorch hub, TensorFlow hub, model zoo和fast.ai framework等网站上找到。
那其他种类的模型呢?
搭建模型雏形时无需自行搭建机器学习模型。前人已经留下了模型代码。
重要的是处理输入和输出,使其适应已有模型。这意味着严格定义模型和类标,理解需要解决的问题。
首先,主要工作是确保输入(数据)和已有模型相匹配。下一步是确保输出符合问题定义和评价标准。
微调和改进模型
模型的最初结果并不意味着一切。可以像调试一辆汽车一样调试并改进机器学习模型。
微调模型需要改变超参数,比如调整学习率或者优化器。或者是其他特定模型中的建构因素,比如随机森林中树的数量以及神经网络的层数。
这一调整过程曾经是人工的,如今逐渐走向自动化,并将无处不在。
通过迁移学习调用预训练模型能够综合前述步骤的优势。
调试模型时应优先考虑可复制性和效率。其他人应该能够重现你的步骤来改进他们的模型。由于主要目标是减少训练时间而不是提出新的思路,调试过程应该是效率导向的。
比较模型
把苹果与苹果比较。
使用数据X训练模型1,使用数据Y来评测
使用数据X训练模型2,使用数据Y来评测
必须使用同样的数据训练和评测不同模型。模型1和2是可变的,而数据X, Y则不然。
6. 实验——还可以尝试什么方法?我们的发现如何影响其他步骤?模型是否表现得符合预期?
这一步包含了其他所有步骤。因为机器学习是个高度迭代的过程,必须确保实验可以执行。
首要目标是要尽量缩小线下实验和线上实验间的时间差。
线下实验发生在项目还没有向用户开放时。线上实验发生在机器学习模型开始批量生产之后。
每一次实验必须使用数据的不同部分。
- 训练数据集——使用它来训练模型,一般占整个数据集的70%-80%。
- 验证/开发数据集——使用它来微调模型,一般占整个数据集的10%-15%。
- 测试数据集——使用它来测试和比较模型,一般占整个数据集的10%-15%。
这些数据集的数据量可以根据问题和数据的类型略微浮动。
如果模型在训练集上表现不佳,意味着它没有很好地学习。解决方案是尝试不同的模型、改进现有的模型或者收集更多高质量数据。
如果模型在测试集上表现不佳,意味着它难以推广。模型可能发生了过拟合。使用一个更简单的模型或者收集更多数据。
如果模型在真实数据上表现不佳,意味着真实数据和训练集与数据集之间差异较大。重复前面两步。确保数据与待解决的问题相符。
尝试大幅改变时,记录内容和原因。记住,就像在模型微调中一样,所有人,包括未来的你自己,都应该能够重复你的操作。
这意味着需要定期保存最新的模型和数据集。
结合上述步骤,做出项目雏形
许多企业对机器学习略知一二,但不知道如何开始运用。最好通过上面六步做出概念模型。
此类尝试的目的不在于从根本上改变商业运营模式,只是探索使用机器学习为公司增添商业价值的可能性。
毕竟,目标并非追赶华而不实的潮流,而是获得真正有价值的解决方案。
规定好搭建项目雏形的期限,两周、六周和十二周都是比较合适的。有了高质量的数据,一个优秀的机器学习和数据科学从业者可以在短时间内实现最终建模成果的80%-90%。
行业专家、机器学习工程师和数据科学家应该协同合作。否则可能搭建出一个用于错误对象的优秀模型,这是非常糟糕的结果。
如果可能的话,通知网络设计师改进在线商店的布局,以帮助机器学习实验。
由于项目雏形的特性,你的企业可能无法从机器学习中获利。项目经理必须清楚这一点。机器学习工程师或者数据科学家也要做好白费努力的心理准备。
但无法获利并不意味着满盘皆输。
无用的模型也有价值,你能从中得知什么是无用的,然后把精力花在别处。这就是为实验设定期限的原因。时间总是不够用,但ddl就是生产力。
如果机器学习模型表现很好,继续下一步,否则就回到上一步。在实践中学习比空想要快得多。
注意
数据是核心。没有高质量的数据,任何机器学习模型都将徒劳无功。运用机器学习应该从收集高质量数据开始。
应用会改变一切。离线表现很好的模型可能在上线时表现不佳。本文的重点是数据建模。模型一旦投入使用,就会面临架构管理、数据验证、模型再训练和分析等诸多问题。云服务商会提供这些服务,但把它们结合起来仍然是黑科技。如果你是老板,给你的数据工程师开出高薪。如果你是数据工程师,和老板分享你所掌握的。
数据收集和模型运用是机器学习管道中耗时最长的部分。本文仅讨论了建模,但仍然遗漏了数据预处理的细节。
商业工具多种多样。机器学习是一个由许多小工具组成的大工具。从代码库和框架到不同的应用架构。每一个问题都有许多不同的解决方案。最佳的实现方法总在不断更新。但本文所讨论的话题万变不离其宗。