想让机器学习与商业结合,最重要的是什么?
纯学术性地建立机器学习模型与为企业提供端对端的数据科学解决方案(如生产制造、金融服务、零售、娱乐、医疗保健)之间存在着巨大差异。
在机器学习方面,企业最常面临的问题是什么呢?除了培养机器学习模型,我们还能做什么?如何准备数据?如何扩大数据集?为什么特征工程如此关键?如何将模型运用到生产实践,成为完全可行的系统呢中?如果能从开源软件中获取所有的数据科学工具,数据科学平台还有存在的意义吗?
本文将回答以上部分问题,并揭示目前机器学习遇到的挑战和困难,进一步通过具体行业案例提出最佳解决方案。
机器学习不仅仅是培养模型
不少数据科学家对机器学习还存在普遍误解。
“假设你拿到一组有某种特征的数据集,并需要推测其中某个变量,你会怎么做?”
很多数据科学家都会做如下回答:
“我会把数据集拆分成培养/测试两部分,运行LogisticRegression, Random Forest, SVM, Deep Learning, XGBoost程序……然后计算精确度、查全率、F1分数……最终挑选出最佳模型。”
但是,还有些问题被忽略了:
“这个过程中你有看过数据本身吗?要是你遗漏了一些数值怎么办?如果你拿到错误的数值或是不良数据呢?你怎么设置分类变量?你是怎么做特征工程的?”
本文中将介绍成功创建端对端机器学习系统的七个必要步骤,包括数据收集、数据监管、数据探查、特征抽取、模型培养、估值和部署。
给我数据!
作为数据科学家,主要资源很明显是数据。但有时数据采集本身也有困难。一个数据科学团队可能会花费几周甚至几个月的时间来获取合适的数据集。其中的困难包括:
- 获取途径:大部门企业数据都很敏感,尤其是政府、医疗保健和金融领域的相关数据。要共享数据集,签署保密协议是常规流程。
- 数据分散:数据在组织内不同部门间散布是很常见的。要拿到整体数据,需要各部门的同意。
- 专业指导:能获取数据往往还不够。由于获取的数据太多,需要一位领域专家指导团队从庞大的数据库中挑选出合适的数据集。有时专家的缺席也会成为项目瓶颈,因为核心企业运营已使他们应接不暇。
- 隐私:模糊处理和匿名操作已经成为两项独立的研究领域,在处理敏感数据时这二者尤为重要。
- 标记:通常了解实际情况或标记会很有帮助,因为这让团队能够应用很多可监控的学习算法。然而,有时标记数据成本高昂,或由于法律限制团队无法得到标记。在这些情况下,可以应用数据聚类等不可监控的方案。
- 数据生成器:如无法获得数据或标记,可以去模拟它们。了解数据结构的相关信息会对使用数据生成器很有帮助,除此以外,还可以了解数值变数的可能性分布和名义变量的类别分布。如果数据结构比较散乱,可借助汤不热(Tumblr)平台,其上有许多标记图像。此外,推特(Twitter)可提供大量自由文本,卡歌网(Kaggle)则拥有特定领域和行业相关的数据集和解决方案。
大数据并不大
近十年,大数据供应商卖力宣传,强调对大数据规模和功能的需求,掀起了一股大数据热潮。也因此,“大数据并不大”这一观点引发了更大的争议。然而,我们需要明确区分原始数据(包括对所有对当前问题无帮助的数据)和特征集(机器学习算法的输入矩阵)。将原始数据处理成特征集的过程称为数据处理,包含以下步骤:
- 丢弃无效/不完整/脏数据。根据我们的经验,此类数据可占所有数据的一半。
- 聚合一个或多个数据集,包括数据连接和组类聚合等操作。
- 特征选取/抽除。比如,除去唯一性标识等可能无关的特征,并应用其它降维技术,如主成分分析。
- 使用稀疏数据表示法或功能散列法,以减少存在许多零值数据集的内存占用。
完成数据准备后,不难发现最终的特征集——即机器学习模型的输入内容——比初始的小很多;另一种常见情况是R或scikit-learn等内存框架足以培养模型。若特征集规模仍十分庞大,可以使用ApacheSpark等大数据工具,尽管其算法选择有限。
脏数据!
脏数据很常见
人们当然希望能学习一些尚不了解的东西,但这一点非常重要:脏数据很常见。在企业合作中,很多客户经常自豪于他们的数据湖泊建设,比如数据湖泊有多壮观、他们可从中得出多少洞见等。因此,作为数据科学家,以下就是我们脑海中的景象:
但是,当客户拿出实际数据时,情况更像是这样:
在这种情况下,Apache Spark等大规模框架就显得尤为重要,因为所有的数据监管转化过程都需要在全部原始数据上完成。以下是几个典型的监管案例:
- 异常检测:负数年龄、浮点邮编和零值信用评分等都是无效数据,不修正这些数值会在培养模型时产生深刻的偏见。
- 缺失/错误数值填充:显然,处理错误/缺失数值最常用的方法就是丢弃它们。另一个选择是填充。比如,用相应特征的平均数、中位数或众数来代替缺失/错误数值。还有一种方法是插值,如建构模型来预测缺失数值的情况下的特征。另外,填充中也可以运用领域知识。比方说处理病人数据时,有一项特征是推断病人是否患有癌症。如果缺失此类信息,可以参考其问诊数据,以确定此病人是否曾看过肿瘤科医生。
- 虚拟编码和功能散列:这两种方法能很有效地把类别数据转换成数值,尤其在基于系数的算法中。比方说,有一项特征是州名,显示美国的各州名称(如FL,CA,AZ)。将FL编码为1,CA编码为2,AZ编码为3,会显示出秩序感和重量级。这意味着AZ会比FL面积更大,而CA的面积是FL的两倍大。一位独热编码——也称虚拟编码——提供的解决方案是将类别栏映射到多个双栏中,其中一栏为类别数值。
- 归一化:若存在不同等级的特征,系数相关的算法就会产生偏见。比方说,特征年龄在[0,100]范围内用年表示,然而工资在[0,100,000]范围内用美元表示。优化算法可能仅仅因为工资的绝对数量级更大而更侧重工资。因此,更推荐常态化算法以及其他常用方法,如Z值推测、标准化(如果数据正常)及min-max特征归一化。
- 分箱:将实值栏映射到不同类别极为有效,如将一个回归问题转化为分类问题。比方说,你想推测航班进港延误的分钟数。一个选择是推测该航班是否会提前、准时抵达或延误,并确定各类别的数值范围。
特征工程无处不在
总而言之,特征就是机器学习算法需要学习的特点。正如人们设想的那样,干扰或无关数据会影响模型的质量,因此掌握好的特征就十分关键。以下是几个特征工程中可使用的策略:
- 确定预测内容。每一个实例代表什么?顾客?交易?病人?还是票据?确保特征集的每一行都对应一个实例。
- 避免唯一性标识。它们不仅在大多数情况下不起作用,还有可能导致严重的过度拟合,尤其是在使用XGBoost等算法时。
- 运用领域知识来导出帮助衡量成功/失败的新特征。通过去医院的次数可以推断医患风险;上月跨国交易的总量可推断诈骗的可能性;申请贷款数额与年收入的比例可推断信用风险。
- 运用自然语言处理技术从散乱自由文本中导出特征。比如LDA,TF-IDF,word2vec和doc2vec。
- 若存在大量特征,可使用降维方法,如主成分分析和t-分布领域嵌入算法。
异常检测无处不在
如果要在企业机器学习的应用案例中挑选出最常见的一个,那就是异常检测。无论是否研究诈骗侦查、生产测试、客户流失、医患风险、客户失信抑或是系统崩溃预测,面临的问题总是:我们能否大海捞针?这就引出了另一个与非平衡数据集有关的话题。
以下是几个用于异常检测的常见算法:
- 自动编码器
- 一类分类算法,如单类支持向量机。
- 信赖区间
- 聚类
- 运用过采样和欠采样法分类
- 非平衡数据很常见
非平衡数据
比方说,你有一组数据集,标记有信用卡交易信息。交易中的0.1%为不实信息,而其余99.9%均为正常交易。如果要创建一个从无虚假交易的模型,会发生什么呢?这个模型在99.9%的情况下都会给出正确答案,所以其精确度为99.9%。这个常见的精确度谬误可以通过考虑不同的度量标准来避免,如精准度、查全率。这些通过真阳性(TP,true positives)、真阴性(TN,true negatives)、假阳性(FP,false positives)、假阴性(FN,false negatives)等术语来表示:
- 真阳性 = 全部实例正确推断为正
- 真阴性 = 全部实例正确推断为负
- 假阳性 = 全部实例错误推断为正
- 假阴性 = 全部实例错误推断为负
在一个异常检测的典型案例中,我们试图将假阴性最小化——比如,忽略一笔虚假交易,忽略一块有问题芯片,或将一个病人视为健康的——同时不会导致大量假阳性实例。
- 精准度 = 真阳性/(真阳性+假阳性)
- 查全率 = 真阳性/(真阳性+假阴性)
要注意精准度不利于假阳性,而查全率不利于假阴性。一个从不推测出虚假信息的模型查全率为零,而精准度则未知。相反,一个总是推测出虚假信息的模型则有着100%的查全率和极低的精准度——这是由于大量假阳性实例的存在。
非常不推荐在异常检测中使用受试者工作特征曲线(FPR)。因为假阳性率——FPR的基础——很大程度上是基于数据集中的阴性实例数量(如假阳性+真阴性),使得在假阳性实例数量庞大的情况下FPR仍然很小。
受试者工作特征曲线 = 假阳性/(假阳性+真阴性)
相反,错误发现率(FDR)有助于更好理解假阳性实例对于异常检测模型的影响:
错误发现率 = 1 – 精准度 = 假阳性/(真阳性+假阳性)
别预测了,直接解释原因!
一些项目并不旨在创建一个实时预测模型,而是解释假设或分析哪些因素可以解释特定行为,因为大多数机器学习算法是基于相关性,而不是因果性。以下是一些例子:
- 什么因素导致一位病人患病风险增加?
- 哪些药品对血检结果影响最大?
- 哪些保险规划参数值可使利益最大化?
- 失信客户有什么特点?
- 流失客户的简况是什么?
处理此类问题的一个可行办法是计算特征重要度,从Random Forests, Decision Trees和XGBoot等算法中可以得到此数据。另外,LIME或SHAP等算法则有助于解释模型和预测,即使其源于神经网络或其它“黑盒”模型。
调整超参数
机器学习算法有参数和超参数两类参数。其不同之处在于:前者直接由算法进行估测——如,回归的系数或神经网络的权值——而后者则并非如此,须由用户手动设置——如,某片森林的树木总数,神经网络的正则化方法,或支持向量机的内核功能。
为机器学习模型设置正确的超参数值十分重要。举例而言,一个支持向量机的线性内核不能对无法线性分离的数据进行分类。再比如,如果最大深度和分裂数量设置得过高,一个树型分类器可能出现过度拟合的情况;而最大特征数量设置过低,其可能无法充分拟合。
为超参数找到最优数值是一个极为复杂的优化问题。以下是几点建议:
- 了解超参数的优先项。一片森林中,最相关的参数可能是树木的数量和最大深度。然而,对于深度学习而言,优先项可能是学习率和层次数量。
- 运用搜索技巧:gridsearch和random search。后者优先。
- 运用交叉验证:设置一个单独测试组,将其余数据分为k层并将其迭代k次,每一层都进行验证(如,调整超参数),其余的进行学习培养。最终,对全部层级进行平均质量度量标准的计算。
深度学习:万金油?
过去几年,深度学习一直是学术研究和行业发展的聚焦点。TensorFlow, Keras和Caffe等框架使复杂的神经网络通过高层级的应用程序接口(API)得以快速运用。应用程序不计其数,包括计算机视觉,聊天机器人,无人驾驶汽车,机器翻译,甚至游戏——同时打败了全世界最顶级的围棋手和国际象棋计算机玩家!
深度学习最主要的前提之一是数据增加后持续学习的能力,而这在大数据时代尤为有效(见下图)。这种持续学习的能力与近来硬件方面的发展(如图形处理器)互相结合,使大型深度学习工作的执行成为可能。而从前,由于资源限制,这是明令禁止的。
那么,这是否意味着深度学习是处理所有机器学习问题的万金油呢?并不是。原因如下:
- 简洁性:神经网络模型的结果十分依赖其结构以及超参数。大多数情况下,要正确调整模型,你需要有网络建构方面专业知识。另外,在此方面试错的步骤也非常重要。
- 可解释性:如上文提到,相当一部分实际案例不仅需要做出预测,还需要解释预测背后的原因:为什么贷款申请被拒绝?为什么保险政策价格提高?尽管基于树型结构和基于系数的算法可以解释,神经网络却不行。
- 质量:从经验来看,对于大多数结构化的数据集,神经网络模型的质量并不一定比RandomForests和XGBoot的模型质量更好。当涉及散乱数据(如图像、文本、音频)时,深度学习的优势更为突出。底线是:不要用猎枪去打苍蝇。RandomForests和XGBoot等机器学习算法已经足以处理大多数结构化的可监测的问题,而这些算法也更容易调整、运用和解释。深度学习在散乱数据问题和强化学习方面的作用不言而喻。
别泄露数据
处理一个预测航班到达时间延误的项目时,如果使用数据集里所有可用的特征时,模型的精确度可以达到99%。不过,希望你会意识到,你可能用启程延误时间来推测进港延误时间。这是数据泄露的典型案例。如果我们使用了任何预测时不可用或未知的特征,就会造成数据泄露。大家要当心!
开源软件里能找到一切资源,平台还有什么用处?
构建机器学习模型从未像今天这样简单。几行R语言或Python语言代码足以建构一个模型,在网上甚至还能找到大量培养复杂神经网络的资源和课程。如今,Apache Spark十分有助于数据准备,它甚至能对大型数据集进行归一处理。另外,docker和plumber等工具通过超文本传输协议(HTTP)简化了机器学习模型的部署。似乎完全依靠开源平台资源,就能构建一个端到端的机器学习系统。