海量数据场景下机器学习模型训练方案
实际处理和解决机器学习工程化问题过程中,我们很难通过单点完成机器学习模型的训练。这些场景包括在线推荐,CTR预估,Lookalike营销等,当有上亿条数据,上千上万维特征,这些应用涉及到的数据量在10G以上甚至TB级别,那么该如何基于海量数据来训练模型呢?
增量学习与特征选择
增量学习
增量学习即使用小batch的数据中进行学习(有时候也称为online learning)是这种学习方式的核心,因为它能让任何一段时间内内存中只有少量的数据,然后将最终的结果通过Voting的方式产生输出,如下是参考代码
#切分块数 cnt=20 size = math.ceil(len(train) / cnt) result=[] for i in range(cnt): start = size * i end = (i + 1) * size if (i + 1) * size < len(train) else len(train) #对数据做batch slice = train[start:end] result.append(batch_predict(pd.concat([slice,test]),i)) gc.collect()
特征选择
特征选择即从稀疏的特征中删除特征重要度为0,特征重要度排序较低的特征值,并通过npz的格式将特征持久化,供后续加载,核心代码如下
se = pd.Series(clf.feature_importances_) se = se[se>0] ##将特征重要性进行排序 col =list(se.sort_values(ascending=False).index) pd.Series(col).to_csv('data_preprocessing/col_sort_one.csv',index=False) ##打印出来不为零的特征以及个数 print('特征重要性不为零的编码特征有',len(se),'个') n = clf.best_iteration_ baseloss = clf.best_score_['valid']['auc'] print('baseloss',baseloss) #通过筛选特征找出最优特征个数 clf = LGBMClassifier(boosting_type='gbdt', num_leaves=31, max_depth=-1, learning_rate=0.1, n_estimators=n, subsample_for_bin=200000, objective=None, class_weight=None, min_split_gain=0.0, min_child_weight=0.001, min_child_samples=20, subsample=1.0, subsample_freq=1, colsample_bytree=1.0, reg_alpha=0.0, reg_lambda=0.0, random_state=None, n_jobs=-1, silent=True) print('开始进行特征选择计算...') all_num = int(len(se)/100)*100 print('共有',all_num,'个待计算特征') loss = [] break_num = 0 for i in range(100,all_num,100): loss.append(evalsLoss(col[:i])) if loss[-1]>baseloss: best_num = i baseloss = loss[-1] break_num+=1 print('前',i,'个特征的得分为',loss[-1],'而全量得分',baseloss) print('\n') if break_num==2: break print('筛选出来最佳特征个数为',best_num,'这下子训练速度终于可以大大提升了')
如上所述,我们介绍了增量学习+特征选择的方式,他适用的场景普遍在数据量在10G左右的单机计算,这种方式也适用于开发人员也可以通过阿里PAI搭载计算资源Maxcompute来做模型验证,采用这种方式有如下优势
优势:
- 模型的泛化能力最强,性能最好;
- 易于部署和模型迭代;
- 支持较为复杂的树模型,模型可解释强;
局限:
- 仅适用于单机场景,超过100G级别的数据很难训练;
MMLSpark
Spark 是为通用数据处理而设计的,并非专用于机器学习任务 ,所以真正意义下Spark不是一个机器学习框架。 要在 Spark 上运行机器学习任务,可以使用 MLlib for Spark;但该方案通常存在如下局限:
- 不支持较为复杂的模型,如集成树模型的训练;
- 适用的场景多为baseline,对于参数的选择支持有限,需要开发者自己重构(比如kmeans算法,spark内部使用的两个向量间的距离是欧式距离。如果希望调整为余弦或者马氏距离,就需要重构了);
- 对网格调参支持并不理想;
鉴于此,微软开发了MMLSpark,为Apache Spark提供了一些深入的学习和数据科学工具,实现了将机器学习组件 CNTK、LightGBM 和 Spark的 统一,至此:
- 我们可以基于Spark来运行集成树模型的任务;
- 能够对叶子节点设置等复杂参数来做调整;
- 支持超参数的搜索
示例代码如下:
# 实例化一个LightGBM Regressor, 其参数和单机版本类似但不尽相同, 文档可以在以下链接找到: # https://mmlspark.azureedge.net/docs/pyspark/LightGBMRegressor.html lgbm = LightGBMRegressor(numIterations=120, objective='binary', learningRate=0.007, baggingSeed=50, boostingType="goss", lambdaL1=0.4, lambdaL2=0.4, baggingFraction=0.87, minSumHessianInLeaf=0.003, maxDepth=9, featureFraction=0.66, numLeaves=47, labelCol="TARGET")
MMLSpark对比增量学习有如下优势
优势:
- 分布式训练;
- 支持PB级别数据训练建模;
局限:
- 环境搭建与维护成本过于复杂;
Tensorflow等深度学习框架
将数据集均等地分配到系统的各个节点(node),其中每个节点都有该神经网络的一个副本及其本地的权重。每个节点都会处理该数据集的一个不同子集并更新其本地权重集。这些本地权重会在整个集群中共享,从而通过一个累积算法计算出一个新的全局权重集。这些全局权重又会被分配至所有节点,然后节点会在此基础上处理下一批数据
如上图所示,在 TensorFlow 中,分布式机器学习训练就使用了参数服务器方法(PS)。实现了数据集的并行处理和参数的全局共享
采用深度学习框架的优势如下
优势:
- Tensorflow、Mxnet与Pytorch天然支持分布式训练,配置简单灵活;
局限:
- 机器学习场景下,缺乏可解释性
- 数据并行计算带来了开发门槛
除开上述方法,如果采用阿里云的Maxcompute+Dataworks,可尝试机器学习PAI的方式做海量的数据建模,PAI屏蔽了分布式环境产生的开发复杂度,无需环境的配置与运维,应该说也是个“降本增效”的选择
在最新的版本中,PAI支持了小数据集模型运算,可以让开发者先跑通流程,在验证之成功后方可进行大规模数据的计算。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
换个角度入门 K8s
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 阿里妹导读:本文通过一个业务发展的故事,分享 K8s 出现的原因以及它的运作方式。适合所有技术开发人员,尤其是前端开发者。 0 序 去年下半年,我做了一次转岗,开始接触到 kubernetes,虽然对 K8s 的认识还非常的不全面,但是非常想分享一下自己的一些收获,希望通过本文能够帮助大家对 K8s 有一个入门的了解。文中有不对的地方,还请各位老司机们帮助指点纠正。 其实介绍 K8s 的文章,网上一搜一大把,而且 kubernetes 官方文档也写的非常友好,所以直接上来讲 K8s,我觉得我是远远不如网上的一些文章讲的好的,所以我想换一个角度,通过一个业务发展的故事,来讲一下 K8s 是怎么出现的,它又是如何运作的。 本文适合所有搞技术的同学,特别是前端的同学,因为前端工程化近几年发展的非常迅猛,K8s 目前解决的问题和发展的形式,我相信假以时日也会出现在前端领域,毕竟不同领域的工程化发展其实是殊途同归的。 1 故事开始 随着中国老百姓生活水平的不断提高,家家户户都有了小汽车,小王预计 ...
- 下一篇
5月14日Apache Spark中国社区技术直播【Analytics Zoo上的分布式TensorFlow训练AI玩FIFA足球游戏】
主题: Analytics Zoo上的分布式TensorFlow训练AI玩FIFA足球游戏 时间: 2020.5.14 19:00 参与方式: 扫描下方海报二维码加入钉钉群或者届时点击直播间直接观看(回看链接) https://developer.aliyun.com/live/2802 讲师介绍: 喻杉,Intel大数据分析团队机器学习工程师。她目前专注于在analytics-zoo大数据和人工智能平台上开发针对时间序列分析的自动机器学习组件。在加入intel前,她在浙江大学获得了学士和硕士学位。 直播简介: 近年来,由于对通用人工智能研究的潜在价值,训练AI玩游戏一直是一个火热的研究领域。FIFA实时视频游戏场景复杂,需要结合图像,强化学习等多种不同的AI技术,同时也要求agents响应有实时性,因此是一个非常好的试验场,可以用来探索不同类型的A
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)