首页 / 专利库 / 资料储存系统 / 挖矿 / 数据挖掘 / 一种spark下的机器学习快速大规模样本签名方法

一种spark下的机器学习快速大规模样本签名方法

阅读:664发布:2020-05-08

专利汇可以提供一种spark下的机器学习快速大规模样本签名方法专利检索,专利查询,专利分析的服务。并且本 发明 请求 保护一种spark下的 机器学习 快速大规模样本签名方法,涉及 数据挖掘 技术和计算机信息处理技术。本方法为:1)读入样本数据,将样本数据转换成独有的样本格式;2)对样本数据中的高频特征进行划分,得到FeatureMap;3)设置最大广播数量,根据最大广播数量计算FeatureMap的partition;4)根据partition数量进行循环 迭代 ,分片广播大量特征;5)最后对样本进行格式转换,得到libsvm格式的数据。本发明可以解决模型训练过程中样本签名性能 瓶颈 的问题,特别适用于在spark集群下训练模型。本发明虽然解决的是样本签名问题,但是由于本方法定制数据结构和分片广播可以很好的避免shuffle从而同样适用于 大数据 工程中的数据倾斜问题。,下面是一种spark下的机器学习快速大规模样本签名方法专利的具体信息内容。

1.一种spark下的机器学习快速大规模样本签名方法,其特征在于,包括以下步骤:
1)读入样本数据,将样本数据转换成改进的样本格式,主要是为了将features经过hash后保存在Long类型的Buffer中并留出int类型的ids空列方便对其进行后面转换;
2)对样本数据中的高频特征进行划分,得到FeatureMap(高频特征被划分成多行后的存储格式);
3)设置最大广播数量,根据最大广播数量计算FeatureMap的分区partition;
4)根据FeatureMap的分区partition数量进行循环迭代,分片广播大量特征,让样本一开始转换为设定格式的样本数据,根据FeatureMap去索引对应特征的编码进行替换;
5)最后对完成替换的样本进行格式转换,得到libsvm格式的数据。
2.根据权利要求1所述的一种spark下的机器学习快速大规模样本签名方法,其特征在于,所述步骤1)读入样本数据,将样本数据转换成改进的样本格式,具体格式为:
其中features是明文的特征,经过hash后保存在Long类型的Buffer中;ids(初始为空)是特征编码后的Buffer,类型为Int;在编码转换的过程中,不断的将查找到的feature转换成id,同时在features的buffer里删除掉已经转换后的feature,并将编码的id写入到ids这个buffer中。
3.根据权利要求2所述的一种spark下的机器学习快速大规模样本签名方法,其特征在于,所述步骤2))对样本数据中的高频特征进行划分,得到FeatureMap具体包括:对样本数据中的features进行划分,由一行变多行,同时进行murmurhash,将String数据hash到64位的空间中,MurmurHash算法是一种非加密hash算法,这里是将分开后的每一个特征进行hash,并同时统计特征频次,对低频特征进行过滤,对剩余的特征进行编号,产生FeatureMap,格式为[feature:Long,id:Int]。
4.根据权利要求3所述的一种spark下的机器学习快速大规模样本签名方法,其特征在于,所述3)设置最大广播数量,根据最大广播数量计算FeatureMap的分区partition,具体包括步骤:
设置最大广播数量,然后根据最大广播数量,设置最大不超过这个最大广播数量的分区大小,并计算得到FeatureMap的分区partition,其格式如下:
[feature:Long,id:Int,part:int]。
5.根据权利要求4所述的一种spark下的机器学习快速大规模样本签名方法,其特征在于,所述步骤4)根据FeatureMap的分区partition数量进行循环迭代,分片广播大量特征,具体包括:在每一轮的广播中,样本根据该FeatureMap去索引对应特征的编码,然后进行替换,具体操作为,遍历FeatureMap,每个特征都有其对应的一开始编好的哈希值,样本根据这个哈希值查找到对应样本位置,在该列进行操作,删除样本中features中对应的特征,并将编码插入到ids中;每一轮遍历FeatureMap后,结束当前广播并释放该FeatureMap,然后进入下一轮广播,直到所有FeatureMap遍历结束,以此通过一次数据扫描,即可完成ID化写入磁盘的操作。

说明书全文

一种spark下的机器学习快速大规模样本签名方法

技术领域

[0001] 本发明属于信息技术、计算、数据挖掘等领域,提供了一种Spark大数据平台下机器学习快速大规模样本签名方法。

背景技术

[0002] 在大规模机器学习领域,模型训练时,将各种数据格式转换成统一的训练格式是必不可少的步骤。这一过程简称样本签名,后文统称ID化,ID化的目的有三个:
[0003] (1)减少数据量,将字符串类型的数据编码为整形,缓解存储压
[0004] (2)提升训练效率,将特征编码到一定的空间,提前感知模型规模。
[0005] (3)通用于各种机器学习算法,比如经典的Libsvm存储格式。
[0006] 通常,我们通过数据挖掘产生的特征,包含大量明文数据,在大规模机器学习中,通常需要将明文数据重新编码为整形表示的离散化特征,这种稀疏表示方法可以极致压缩存储空间。常见的明文样本格式:
[0007] [label,feature1,feature2……]
[0008] 具体例子如下:
[0009] [0,item^123,user^362,query^快手,weekday^6,app_list^25,app_list^582][0010] [1,item^12,user^22,query^美团,city^深圳,gender^1,app_list^123,app_list^456]
[0011] ID化之后的格式:
[0012] [label id1:value id2:value idn:value],其中id是从1开始编码。value为特征权值,一般为1
[0013] 具体例子如下:
[0014] [0 1:1 5:1 6:1]
[0015] [1 2:1 7:1 9:1 11:1 30:1]
[0016] 通用id化流程可表示如下:
[0017] ①读取样本数据
[0018] ②统计特征频次
[0019] ③将特征按频次过滤
[0020] ④对剩余特征编码
[0021] ⑤将所有样本按编码进行明文到特征ID的转换
[0022] 这其实是大数据下Join操作的优化问题,现有业界并没有针对ID化的专有解决方案,根据不同情况,通用的解决方案为:
[0023] 1)将编码后的特征集进行广播:
[0024] 参考美团技术团队撰写的Spark性能调优高级篇中的将reduce join转为map join--tech.meituan.com/2016/05/12/spark-tuning-pro.html,适用于特征集较小的情况,由于特征集小,因此可以将编码后的特征集进行广播,广播内容为HashMap,其中保存着明文到编码ID的映射关系。然后对样本进行编码操作,将明文转换成编码ID。这种方式优点是速度极快,只需要对数据进行一遍扫描。但是缺点也十分明显,当特征集较大的时候,无法进行广播,通常在特征集超过1000w之后会出现各种内存不足问题。
[0025] 2)使用join的方式:
[0026] 这是spark自身默认的join方式,先对样本数据进行样本编号,然后将每条样本的特征拆分,每行数据变成样本编号+特征。然后和特征编码数据join,对样本ID进行reduce。这种方式是按join的方式进行,两次shuffle存在大量IO操作,并且在数据量大的时候,一定会发生数据倾斜,因为样本中20%的高频特征可能占据了80%的空间。示意图如图3所示:
[0027] 3)使用union结合reduce来改进join的方式:
[0028] 参考博文--https://blog.csdn.net/bryan__/article/details/8467388,由于直接join存在两次shuffle,所以可以通过先union然后reduce的方法来代替join过程,这样就只有一次shuffle,并且reduce会先在本地进行合并然后再shuffle,减少了IO操作。改进的join具体步骤是:
[0029] ①对样本进行编号
[0030] ②对样本表的特征拆分,一行变多行,同时添加上左表标识。
[0031] ③样本表union上特征编码表,编码表添加右表标识。
[0032] ④按特征作为key进行reduce
[0033] ⑤通过2,3步骤的左右标识来区分样本与特征,完成join过程虽然改进后的join方式只有一次shuffle操作,但是依然没能避免数据倾斜的可能。
[0034] 4)对头部数据广播,长尾数据join的方式:
[0035] 为了避免数据倾斜,可以对样本中的特征进行统计,将出现次数最多的那一批特征进行广播操作,对剩余的特征进行改进的join操作,可以很好的避免数据倾斜。这样能支持更大规模的数据与特征。虽然解决了数据倾斜和join性能,但是面临超大数据速度仍然很慢,shuffle操作依然存在。

发明内容

[0036] 本发明旨在解决以上现有技术的问题。提出了一种提高样本ID化的速度,减少所消耗的资源、通过避免shuffle操作来提升性能的spark下的机器学习快速大规模样本签名方法。本发明的技术方案如下:
[0037] 一种spark下的机器学习快速大规模样本签名方法,其包括以下步骤:
[0038] 1)读入样本数据,将样本数据转换成改进的样本格式,主要是为了将features经过hash后保存在Long类型的Buffer中并留出int类型的ids空列方便对其进行后面转换;
[0039] 2)对样本数据中的高频特征进行划分,得到FeatureMap(高频特征被划分成多行后的存储格式);
[0040] 3)设置最大广播数量,根据最大广播数量计算FeatureMap的分区partition;
[0041] 4)根据FeatureMap的分区partition数量进行循环迭代,分片广播大量特征,让样本(一开始转换为特定格式的样本数据)根据FeatureMap去索引对应特征的编码进行替换;
[0042] 5)最后对完成替换后的样本进行格式转换,得到libsvm格式的数据。
[0043] 进一步的,所述步骤1)读入样本数据,将样本数据转换成改进的样本格式,具体格式为:
[0044] 其中features是明文的特征,经过hash后保存在Long类型的Buffer中;ids(初始为空)是特征编码后的Buffer,类型为Int;在编码转换的过程中,不断的将查找到的feature转换成id,同时在features的buffer里删除掉已经转换后的feature,并将编码的id写入到ids这个buffer中。
[0045] 进一步的,所述步骤2))对样本数据中的高频特征进行划分,得到FeatureMap具体包括:对样本数据中的features进行划分,由一行变多行,同时进行murmurhash,将String数据hash到64位的空间中,MurmurHash算法是一种非加密hash算法,这里是将分开后的每一个特征进行hash,并同时统计特征频次,对低频特征进行过滤,对剩余的特征进行编号,产生FeatureMap,格式为[feature:Long,id:Int]。
[0046] 进一步的,所述3)设置最大广播数量,根据最大广播数量计算FeatureMap的分区partition,具体包括步骤:
[0047] 设置最大广播数量,然后根据最大广播数量,设置最大不超过这个最大广播数量的分区大小,并计算得到FeatureMap的分区partition,其格式如下:
[0048] [feature:Long,id:Int,part:int]。
[0049] 进一步的,所述步骤4)根据FeatureMap的分区partition数量进行循环迭代,分片广播大量特征,具体包括:在每一轮的广播中,样本根据该FeatureMap去索引对应特征的编码,然后进行替换,具体操作为,遍历FeatureMap,每个特征都有其对应的一开始编好的哈希值,样本根据这个哈希值查找到对应样本位置,在该列进行操作,删除样本中features中对应的特征,并将编码插入到ids中;每一轮遍历FeatureMap后,结束当前广播并释放该FeatureMap,然后进入下一轮广播,直到所有FeatureMap遍历结束,以此通过一次数据扫描,即可完成ID化写入磁盘的操作。
[0050] 本发明的优点及有益效果如下:
[0051] 本发明通过设置样本缓存机制,以及广播变量切分,进行多轮广播,利用spark自身的优化机制,做到只进行一次数据扫描,即可完成ID化写入磁盘,避免了shuffle的IO操作,利用Map端的操作来降低数据倾斜的影响。另外提前对明文样本进行hash,将明文的String类型数据转换成Long类型的数据,明文数据由String存储,其中一个字符占2个字节(汉字将会是3字节),而Long类型一共只占据8字节,对比而言,8字节的String只能存储4个字符(最多2个汉字)。所以合理的Hash方式,来降低冲突也是优化点之一。本发明采用了MurmurHash算法,将String数据hash到64位的空间中,能表示的范围是[-9223372036854775808,9223372036854775807],即负922亿亿到正922亿亿。经测试,10亿的明文特征hash的冲撞率在0.0000001%以内。
[0052] 本发明可以解决模型训练过程中样本签名性能瓶颈的问题,特别适用于在spark集群下训练模型。解决了在一定资源情况下,通过分片广播大量特征,独有的样本结构,来避免数据倾斜,提高计算效率。并且同样适用于任何大数据处理中的数据倾斜问题。我们熟知的“28定理”,即20%的数据占据了80%的空间,是大数据处理中经常碰到的问题,通常选择的处理方法是join,或者“加盐”后再join,来避免数据倾斜,但join会有大量的shuffle操作,比较耗时,定制数据结构和分片广播可以很好的避免shuffle从而解决这类问题。附图说明
[0053] 图1是本发明提供优选实施例Spark下机器学习快速大规模样本签名方法的流程框图
[0054] 图2快速大规模样本签名方法分片广播的流程框图;
[0055] 图3是现有技术中使用join的方式示意图;
[0056] 图4是本发明优选实施例样本切分与广播示意图;
[0057] 图5是实际测试示意图;

具体实施方式

[0058] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、详细地描述。所描述的实施例仅仅是本发明的一部分实施例。
[0059] 本发明解决上述技术问题的技术方案是:
[0060] ID化的主要工作是将明文的数据,转换成编码后的数据。其瓶颈在于如何将编码数据快速的分发到各个工作节点,在特征编码数据超大的时候无法一次性广播,所以我们可以考虑多轮广播的方式。通过设计合理的样本格式,来做到原地进行明文转编码格式。
[0061] 如图1-2所示,ID化的具体步骤如下:
[0062] 1)样本数据格式转换:
[0063] 读入样本数据,一般来说,在大数据平台上这里读入的是类似于HBase存储格式的样本数据,如:
[0064] [0,3^123,23^362,45^快手,56^6,63^25,63^582,…]
[0065] 然后将样本数据转换为设计如下的样本格式:
[0066]
[0067] 其中features是明文的特征,经过hash后保存在Long类型的Buffer中,ids是特征编码后的Buffer,类型为Int,可以表示的范围[-2147483648,2147483647],能够支持存储20亿大规模的特征。
[0068] 通常一个字符占2个字节(汉字将会是3字节),而Long类型一共只占据8字节,通过hash后能够有效减少样本的存储空间。转换成这样的格式同时也方便后面进行编码操作:
[0069] 在后面编码转换的过程中,不断的将查找到的feature转换成id,同时在features的buffer里删除掉这个feature,并将编码的id写入到ids这个buffer中。所以整个样本数据集是在不断的减小。Long类型占8个字节,Int类型占4个字节,最终通过ID化还能直接在内存中减少1倍的数据量。
[0070] 2)样本特征集构造:
[0071] 对样本数据中的features切分,将原来一行多列特征转化为多行单列特征,直接通过map操作对同一行的元素进行拆分。同时对划分后的多行特征进行MurmurHash并统计每一个特征的频次。
[0072] 其中MurmurHash算法由Austin Appleby发明于2008年,是一种非加密hash算法,适用于基于hash查找的场景,与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好,具有较高的平衡性和低碰撞率。
[0073] 最后对低频特征进行过滤,一般直接删除相对于整体数据来说出现频率较小的特征,例如我们设置频率小于50W的为低频特征。主要是因为低频特征不适合作为机器学习的输入,引入低频特征会导致训练集存在大量缺失,对结果准确度产生较大不良影响。过滤掉低频特征接着根据hash索引对剩余的特征进行编号,产生FeatureMap,格式为[feature:Long,id:Int]。
[0074] 3)样本切分与广播:
[0075] 设置最大广播数量,具体的设置需要实际考虑计算资源来设置,资源充足可以适当扩大。实际上一般单台机器配置8g左右的内存,给1000w差不多了,剩余的内存还需要存储数据。
[0076] 根据最大广播数量计算FeatureMap的partition,每个partition中保存小于最大广播数量的特征量,格式为[feature:Long,id:Int,part:int]。
[0077] 根据partition数量进行循环迭代,在每次循环里面,根据该分区索引得到的FeatureMap[feature:Long,id:Int],将其进行广播。由于该FeatureMap不超过1000w,所以可以直接广播。
[0078] 由于Spark自带的缓存机制,存不下就会往磁盘上写。所以将大量的数据通过分片广播的方式来进行广播,不会受到内存限制,但因为部分featureMap放在缓存中,所以会提高执行速度。而且通过广播,避免了大量shuffle操作,大大提高了执行速度,且有效避免了数据倾斜的问题。
[0079] 然后在每一轮的广播中,样本根据该FeatureMap去索引对应特征的编码,然后进行替换。具体操作为,遍历FeatureMap,每个特征都有其对应的一开始编好的哈希值,样本根据这个哈希值查找到对应样本位置,在该列进行操作,删除样本中features中对应的特征,并将编码插入到ids中。每一轮遍历FeatureMap后,结束当前广播并释放该FeatureMap,然后进入下一轮广播,直到所有FeatureMap遍历结束,以此通过一次数据扫描,即可完成ID化写入磁盘的操作。
[0080] 其过程示意图如图4所示:
[0081] 4)样本格式转换得到样本签名结果
[0082] 对样本进行格式转换,经过多次广播后可以看到一开始的特定样本格式,其中ids的数据生成好了,features变为空,然后可以直接将其转换得到libsvm格式的数据,这种形式也方便我们进行各种Spark算法的调用。即如下形式:
[0083] [label,1:feature1,2:feature2,3:feature3,…,4:feature4]
[0084] [labe2,1:feature1,2:feature2,3:feature3,…,4:feature4]
[0085] ……
[0086] 这里给一个操作实例:
[0087] 例如我们原样本为:
[0088] [0,item^123,user^362,query^快手,weekday^6,app_list^25,app_list^582,…]
[0089] [1,item^12,user^22,query^美团,city^深圳,gender^1,app_list^123,app_list^456,…]
[0090] ……
[0091] 使用本算法将其装换为libsvm模式,首先feature经过hash,将原样本转换为特定格式[label,features(Long),ids(int):null]
[0092] 即:
[0093] [0,3^123,23^362,45^快手,56^6,63^25,63^582,…,null]
[0094] [1,1^12,23^22,45^美团,79^深圳,146^1,6^123,63^456,…,null][0095] ……
[0096] 特征名存在hash表中。
[0097] 再对样本特征集重新构造,现将一行多列的特征转为多行一列并进行murmurhash:
[0098] [102,1^123]
[0099] [24,2^362]
[0100] [42,3^快手]
[0101] [35,4^6]
[0102] [56,6^25]
[0103] [77,6^582]
[0104] [102,1^12]
[0105] ……
[0106] 同时对特征频次进行统计,最后过滤掉低频特征,再将剩下的特征编号组成FeatureMap:
[0107] 1^1123,1
[0108] 2^2362,2
[0109] 3^快手,3
[0110] 6^25,4
[0111] 6^582,4
[0112] 1^112,1
[0113] ……
[0114] 设置最大广播次数,并将FeatureMap切分:
[0115] 1^123,1    6^582,4
[0116] 2^362,2    112,1
[0117] 3^快手,3   。。。。。。   。。。。。。
[0118] 6^25,4
[0119] ……
[0120] 循环广播每个FeatureMap分区,样本根据该FeatureMap去索引对应特征的编码,然后进行替换,删除样本中features中对应的特征,并将编码插入到ids中,如下[0121] [0,23^362,45^快手,56^6,63^25,63^582,…,1:123,]
[0122] [1,23^22,45^美团,79^深圳,146^1,6^123,63^456,…,1:12,]
[0123] 持续操作完成编码将样本转换为:[label,features(Long):null,ids(int)][0124] 最后释放features,就变成了libsvm格式:
[0125] [0,1:123,2:362,3:快手,4:25,5:582,…]
[0126] [1,1:12,2:22,3:美团4:123,5:456,…]
[0127] 如图5所示,在实际测试中,对执行过程进行观察,后面的图是测试的运行过程,in memory表示从缓存中进行广播,on disk表示从内存中进行广播,可以发现在分片广播之后,部分的featureMap存在缓存机制,不会全部load到内存,也就是说可以将大量的数据通过分片广播的方式来进行广播,而不会受到内存限制。
[0128] 本发明经过测试与其他算法的对比如下,下面的算法1到4分别对应前面背景介绍中提到的四种对数据进行ID化的处理方法:将编码后的特征集进行广播的方式、使用join的方式、使用union结合reduce来改进join的方式、对头部数据广播,长尾数据join的方式。
[0129] 测试环境:
[0130] spark2.1,executor-num:200,executor-memory:4G,driver-memory:10G,最大广播数:500w
[0131] 测试数据是经过bz2算法压缩后存储,解压后实际占用空间会增加2倍以上。
[0132]
[0133] 实验分析:
[0134] 1.特征量在1000w内的时候,算法1和本算法差距不大,因为都是直接广播的方式,其他3个算法因为是join的方式,涉及到大量IO操作,所以速度会慢一些。
[0135] 2.特征量在2000w的时候,算法1-4差距已经很小了,因为这个时候特征全部广播会有些压力,已经和join耗时几乎一致了,但这个时候分片广播效率依然很高,由于其独有的数据结构设计,和原地修改等操作降低了内存消耗,使得有更多的空间用于广播。
[0136] 3.特征量在1e的时候,算法1受限于executor内存限制,已经无法广播了。使用头部广播,长尾join的算法4,耗时在5小时以上,这时候分片广播的优势开始扩大,只需要一半的时间。
[0137] 4.在特征量达到2e的时候,纯join的算法受限于executor内存和数据倾斜,会在运行过程报OutOfMemory错误。本算法的耗时依然只有算法4的一半。
[0138] 由实验对比可以看出,本算法在数据量越大的时候,与其他算法相比拥有更明显的运行时间上的优势,同时利用广播机制,减少了shuffle操作,也有效避免了数据倾斜问题。
[0139] 以上这些实施例应理解为仅用于说明本发明而不用于限制本发明的保护范围。在阅读了本发明的记载的内容之后,技术人员可以对本发明作各种改动或修改,这些等效变化和修饰同样落入本发明权利要求所限定的范围。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈