使用4个机器学习库来处理大数据

2023-06-05 0 424

在Booking.com,她们能根据顾客和合作方(饭店,写字楼,渡假出租等)如何与她们的平台交互来处置大批统计数据。她们的主要就考验之一是在合理的时间外在那些十分曳丝浓密的统计数据K568体能训练准确的机器学习数学模型。

在这首诗中,她们较为的是三种最盛行的机器学习库的操控性,那些库为大统计数据提供更多了软件系统:H2OTensorFlowSparkMLlib VowpalWabbit。目前她们将仅囊括非线性数学模型,将其他机器学习数学模型的较为做为未来的工作。她们的最终目标是著眼于更大的统计数据集的软件系统,那些统计数据集无法带入一般而言计算机系统的缓存中。

统计数据集的描述

Booking.com中文网站为任何能玩游戏的人提供更多全球各地的食宿机会。为的是更快地分析她们的统计数据,她们将世界分为超过100k个相同的边线,并为它们分配两个唯一的id。当然能透过相似的处所控制点或采用最终目标代码来降低层次难题。然而,由于booker和property location的五种组合都表现出十分相同的市场行为,因此将每个边线做为原则上的优点采用通常更有效。

另一方面,体能训练两个具有如此多特征的数学模型须要大批的统计数据来防止过度插值,在某些情况下,还须要大批的缓存来执行计算。当统计数据生物学家不得不选择两个机器学习程序库采用时,这对她们来说是两个巨大的考验。

为的是较为最盛行的库的演算法和操控性,她们采用了克雷姆斯兰县的统计数据欧谢勒县处置她们在Booking.com上正在处置的难题:

当顾客到达Booking.com中文网站时,她们须要选定出发地和年份间距。然后将向她们表明可用优点条目。在搜寻会话期间,她们希望预估顾客到时候空格键的优点的打分。良好的预估使Booking.com能够为使用者提供更多更快,更个人化的新体验。

意外的是,一种简单的分析方法方法并不能带来令人信服的结果。图2中的表单表明了剖面预估的主要就分项,那些分项是在会话中空格键的文章平均数分的平均数值。如果这是不可用的,她们采用两个取值出发地的平均数文章平均数分。下面她们报告通过较为记号统计数据和剖面预估获得的均截距数值(RMSE),决定系数(R 2)和平均数绝对值(MAE)。

使用4个机器学习库来处理大数据

图2:采用简单分析方法的最终目标变量预估结果

为的是改善这种预估,她们对80%的统计数据进行非线性回归,将20%做为测试集。她们采用H2O,TensorFlow,SparkMLlib和VowpalWabbit来做到这一点。

非线性回归

最简单但操控性最佳且采用最广泛的机器学习演算法之一是非线性回归。要预估的变量Y被假定为一组特征的非线性函数。如果她们有两个包含N个示例和M个特征的统计数据集,她们假设保持以下关系:

使用4个机器学习库来处理大数据

Y是 N个最终目标值的矢量,X是特征( N × M矩阵), α是必须估计的 M个系数的矢量。假设非线性估计和ground truth 之间的剩余偏差ε的分布正态地分布为零均值。

体能训练非线性回归意味着找到最适合观察统计数据的向量α。这相当于找到α最小化最小平方损失函数:

使用4个机器学习库来处理大数据

最小化损失函数的α值是将其梯度设置为零的值。找到这一点的典型方法是运行梯度下降 演算法。从α空间中的随机点开始,演算法计算该点的损失函数的梯度,并将系数更新为负梯度方向的一步:

使用4个机器学习库来处理大数据

该步骤的大小由参数λ控制,称为学习率。该演算法通常在有限次数的迭代之后收敛,即参数值的微小变化不会导致损失函数值的任何显着降低。另一种盛行的方法是采用二阶方法 ,透过将梯度与Hessian的倒数(或其近似值)相乘来选择下降方向。

一种盛行的二阶方法是

Broyden-Fletcher-Goldfarb-Shanno演算法(L- bfgs),其中“L”只用于有限的缓存采用。L-BGFS采用的是Hessian的逆的近似,它要求在缓存中保留以前的梯度值的固定数量。

为的是计算梯度,(如果须要的话),对逆Hessian的近似值,并更新系数,计算机系统必须记住所有的统计数据和每个迭代中系数的所有值。对于大于O(10GB)的统计数据欧谢勒县说,这在技术上是不可行的,这是Booking.com的标准。幸运的是,有一些机器学习工具提供更多了相同的策略来解决这个难题:

H2O透过将统计数据集拆分为块来分配计算。在每次迭代时,为每个块计算梯度和近似逆Hessian。这部分计算就像两个“mapper”,因为与随机梯度下降相比,数学模型参数没有更新。在迭代的第二部分中,就像在“reducer”中一样,渐变和近似Hessian被组合以更新权重。默认优化演算法是LBGFS,但使用者能选择其他几种演算法。所有统计数据都存储在缓存中,因此H2O须要分配两个固定的,相对较大的缓存来运行。SparkML采用类似于H2O的方法在执行程序上分配计算。然而,采用浓密向量存储特征示例,这允许减少所需的存储量。使用者能透过调整分区数来控制统计数据集分割的块的大小。增加spark会话的执行程序的数量可能有助于减少体能训练时间,因为能并行执行更多操作。VowpalWabbit采用随机梯度下降(SGD)。该演算法一次读取一行统计数据,并仅采用该行的信息更新梯度和系数。然后它重新计算损失函数并进入下两个例子。消耗的缓存量与统计数据集中的行数无关,并且相对较小,因为只须要存储系数的值和损失函数的值。对于在每个更新步骤读取所有统计数据的方法,在SGD须要更多迭代(即,更多统计数据点)来收敛时采用仅一行的信息。VowpalWabbit针对读取统计数据进行了高度优化。系数更新比普通梯度下降更复杂。学习率不是恒定的,而是取决于随时间更新和衰减的系数。根据读取的新值重新标准化功能。TensorFlow肯定是这四个中最可定制的库。它主要就用于构建深度学习演算法,但也提供更多了采用张量操作构建数学模型的通用框架。使用者能完全控制最小化演算法,并能根据须要进行修改。在本研究中,她们采用了小批量梯度下降,与SGD十分相似,但是采用一批统计数据而不是仅仅一行来更新梯度。在小批量大小表示在每个迭代中采用的行数。在本研究中,她们采用64的小批量大小。与Vowpal Wabbit类似,默认情况下,梯度更新规则比普通梯度下降更复杂。默认优化器是Follow-The-Regularized-Leader(FTRL)。

TensorFlow还支持散列技巧。与VowpalWabbit的主要就区别在于能独立地为每个特征列设置散列大小。

特征代码

超出统计数据集的大小,特征的数量也在体能训练所需的缓存量中起着重要作用。事实上,在每次迭代时,须要计算所有的一阶导数,并且应该更新所有系数(对于L-BFGS,还须要保留在一些先前步骤中计算的导数)。这意味着体能训练具有多个分类变量的数学模型(例如优点的边线)可能是缓存昂贵的。她们来解释一下原因。

要在非线性回归中采用分类特征,必须先对其进行代码。最常用的代码之一是one hot代码,即将分类变量转换为二进制向量,如下所示:

使用4个机器学习库来处理大数据

图3:分类功能的one-hot代码,例如优点所在的国家/地区

包含200个相同值(大致相当于世界上国家的数量)的分类特征将被转化为200个原则上的特征。对于她们想要解决的难题,她们有这样两个统计数据集:

使用4个机器学习库来处理大数据

图4:用于体能训练非线性重新生成的统计数据的快照

相同的列是:

visitor_loc_id:访问者的边线IDdest_id:优点的边线IDavg_score:会话中空格键的优点的平均数打分prev_score:点击最后两个优点的打分target:点击下两个优点的得分,她们想要预估的内容

所有特征都被视为分类。为此,prev_scoreavg_score的值已在第两个小数位被截断。每个特征的基数如下表所示:

使用4个机器学习库来处理大数据

图5:统计数据集中分类特征的基数

经过one-hot-encoding后,她们获得了280164种相同的特征。为的是在不事先知道VowpalWabbit特征的基数的情况下执行one-hot-encoding,采用所谓的散列技巧。它首先透过哈希函数将所有要特征转换为整数,然后对结果进行one-hot-encoding。使用者能透过选定散列值的位数来选择散列函数的共域的大小。对于这项研究,她们采用28位,即268435456可能的散列函数的相同结果(VowpalWabbit的默认值是18位)。较大数量的比特减少但不消除冲突的机会,即将两个相同的特征映射到相同的散列值。

她们采用H2O,SparkML,TensorFlow和VowpalWabbit,采用490M统计数据点(~20GB)对该统计数据集进行了非线性回归。

机器学习库较为

她们为所有四个库体能训练了两个非线性回归数学模型。由于行数与特征数量之比十分大,她们决定不应用任何正则化项。她们尝试尽可能少地从库的基本实现中进行更改,以重现典型用法。

在不改变初始参数的情况下,H2O在测试K568给出RMSE = 0.323 ,显着高于用所有其他库获得的RMSE <0.3。这是因为,默认情况下,H2O将弹性网正则化项添加到最小平方损失函数,强度为λ。采用基于体能训练统计数据的试探法计算参数λ的值。参数α,控制L1和L2之间的平衡惩罚默认设置为0.5。对于大统计数据和浓密统计数据的难题,这种正则化太强,导致最小化演算法陷入局部最小值。为的是避免这个难题,H2O使用者须要在每次体能训练非线性回归时明确设置λ= 0。

将正则化项设置为零,H2O的操控性与SparkML,TensorFlow和VowpalWabbit保持一致。四个库之间较为的最终结果如下图6所示:

使用4个机器学习库来处理大数据

图6:测试K568的RMSE和MAE与正在研究的四个库的较为

她们观察到体能训练速度和缓存消耗之间的权衡,如下图所示:

使用4个机器学习库来处理大数据

图7:观察到的体能训练时间。* TensorFlow有两个值:两个是默认值,另两个是经过优化的管道

使用4个机器学习库来处理大数据

图8:体能训练过程中采用的缓存

她们已经报告了TensorFlow的两个体能训练时间,因为她们已经观察到根据统计数据读取方式的显着变化。具体来说,她们采用TensorFlow版本1.8并采用推荐的tf.data API读取统计数据。此外,体能训练统计数据以推荐的T FRecords格式存储,采用TensorFlow连接器在Spark中编写。TFRecords是针对阅读优化的序列化体能训练示例,然后在体能训练时对其进行反序列化。

采用默认设置,她们观察了6小时15分钟的体能训练时间,这段时间大大减少到2小时7分钟,优化了统计数据读取过程。识别统计数据读取管道中的瓶颈被证明是十分重要的。关于这个优化的技术讨论超出了本文的范围。她们发现,在反序列化之前对tf记录进行批处置,并创建两个预取统计数据的缓冲区,能显著提高速度。

对每个数学模型最重要的分项、体能训练的缓存和时间、以及所采用的演算法的完整概述如下表所示

使用4个机器学习库来处理大数据

图9:包含每个库最重要分项的表

括有关体能训练时间和缓存采用情况的信息。* TensorFlow体能训练时间引用两个值:两个具有默认值,另两个具有优化管道

特征交互

为的是用非线性回归来描述非非线性关系,通常将特征相互作用包括在最小化中。如果那些优点是绝对的,这就意味着创建新的级别,由原始级别的组合提供更多,并将它们插入到损失函数中。创建所有交互将产生超过170亿个独特的特征。

因为她们只有490M的统计数据点,所以不可能限制这么多的参数,因此显式地对所有级别进行one-hot代码没有多大意义。她们考虑了两种相同的方法:

散列所有特征空间。无论所有特征交互的基数如何,都将考虑最多2 ^ b个级别,其中b是散列函数的位数。如前所述,这种方法与VowpalWabbit开箱即用。使用者只须要选定他想用二次或三次交互做为命令行参数体能训练数学模型。然而,她们注意到,在VW(-q ::)中交互所有特征的默认方法在体能训练时间中引入了大批开销。因此,她们采用参数-q aa和分配给同一名称空间a的所有功能手动选定了交互。与前一节一样,她们采用b = 28。TensorFlow允许采用交叉层创建交互,交叉层交互两个分类层,并将结果散列为使用者选定的每个交互的多个buckets。对于6对成对相互作用中的每两个,她们采用了大小为10⁶的buckets。采用SparkML和H2O,使用者须要预处置统计数据以创建散列记录。Spark版本2.3.0提供更多了一种允许十分容易地执行此操作的方法。但是,在她们的例子中,当她们采用Spark 2.2.0时,她们采用MurmurHash3实现了转换Scala 2.11库中提供更多的函数。她们将位数限制为24,否则程序将在one-hot代码阶段崩溃。H2O不是为执行此操作而设计的。使用者原则上能在Spark中进行散列,然后将统计数据复制到H2O。然而,这将是两个相当复杂的程序,她们不建议这样做。相反,要远离非线性回归并使用其中一种H2O方法进行非非线性演算法,例如:随机森林或梯度增强机器,这样更容易,更有效。削减低发生类别。只考虑了一些相互作用。在她们的难题中,她们有两个具有十分高基数的优点:dest_id和visitor_loc_id。她们只考虑了涉及那些特征的级别的相互作用,其发生次数大于10000.每个交互的其他组合被放在两个区域中。这导致了具有626310独特功能的统计数据集,能透过H2O和SparkML消化,而无需使用者进行任何进一步操作。

如下面的图10所示,采用交互对数学模型进行体能训练,能使RMSE和MAE有两个小的改进,同时能显著增加缓存消耗和体能训练时间。对于SparkML,她们将结果绘制为切割低发生率类别。由于所采用的方法是相同的,所以在库中进行体能训练时间和缓存消耗的较为是不完全公平的。

使用4个机器学习库来处理大数据

图10:在测试K568测量的RMSE和MAE与所研究的四个库的较为,包括数学模型中的特征相互作用

使用4个机器学习库来处理大数据

图11:包含每个库最重要分项的表

包括有关体能训练时间和缓存采用情况的信息。“Strategy”列指示了在数学模型中包含要素交互的方法。* TensorFlow采用优化和默认管道运行

结论

她们较为的是三种最盛行的机器学习程序库体能训练生产非线性数学模型。尽管那些库以固有的相同方式处置大统计数据,但它们的表现十分相似。

H2O 强大卖点是其易于采用的语法和详细的界面。这使得即使是非专家也能在很短的时间内体能训练大统计数据的机器学习数学模型。这种使用者友好性的代价 是,有时H2O对于其背后发生的事情并不完全透明。这使得难以理解为什么数学模型表现不佳。事实上,在她们的例子中,最好覆盖默认参数以明确地将正则化项设置为零。

SparkML代表了分布式机器学习的有效替代方案,体能训练时间非常短。缓存和资源占用空间很大,但能根据可用资源进行调制(以速度为代价)。SparkML还具有在同一框架中提供更多机器学习工具和强大的Spark统计数据重复功能的巨大优势。意外的是,没有任何界面来监控体能训练进度,并且语法不像H2O那样友好。

VowpalWabbit耗方面是最有效的库。另一方面,那些库提供更多了有限的非非线性演算法选择和两个十分基本的界面来监控体能训练的进度。使用者须要努力计算最基本的体能训练分项。为的是解释数学模型,须要反转散列函数。对于大位值,此操作可能在计算上很昂贵。

TensorFlow具有与VowpalWabbit类似的缓存和资源占用空间,具有更快的使用者界面和灵活的演算法。使用者能完全定制最小化策略以使其适应每个特定难题。体能训练时间的显着增加是由于底层代码的复杂性更高。实际上,该库是两个针对各种优化难题的通用求解器。找到最小化体能训练时间的最佳配置本身就是一项十分重要的任务。在这里,她们采用了一种简单的方法来尝试重现库的标准用法,并采用更复杂的方法来表明能观察到多少变化。

总之,关于采用哪个库的选择实际上取决于手头的难题和可用的资源量。有了适合您的大型集群,能采用H2O库,特别是如果您熟悉大统计数据的机器学习。如果统计数据准备部分也在Spark中完成,SparkML提供更多了两个很好的选择。如果资源有限,VowpalWabbit在大型统计数据K568提供更多了良好的操控性,但非非线性选项很少。对于更具可扩展性和定制的软件系统,TensorFlow提供更多了其他任何库都无法提供更多的良好性能和灵活性。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务