背景与目标
现在有什么?
业务数据有一定的积累
现在需要什么?
- 更好的理解客户,抽象出准确的
用户画像
- 更好的理解现有内容和商品
- 把内容、商品与用户连接起来,提高用户粘性以及商品的成交概率
落实到工程中,需要一种高效的数据分析的手段。本博客将阐述机器学习PAI的优缺点。
常规手段
数据分析
分析需求出现的时候,找BI
(Business Intelligence,业务情报)部门,BI同学按照需求和对数据的理解,制作相应报表,结果如下(查询结果是跟mysql的差不多,可以导出):
qa一下:
q:这是在哪里查的?
a:阿里的dataworks(也就是原来的odps),这些数据的来源有两个:业务数据库
和终端上报的日志数据
q:为什么不直接用mysql查
a:
- 聚合查询消耗的性能很大,影响业务库,所以大数据分析的操作需要在
分析型数据库
进行(如:hive) - 分析型数据库,存储数据量更大、更全、查询效率更高,可以专门用于大数据分析和挖掘使用
q:为什么要使用阿里的
a:我们的业务存储也是使用阿里的,导数据方便。。
q:用sql做的事,毕竟是有限的,比如分词、特征提取等操作是做不了的,这怎么办??
a:odps的确做不了这个,这也就是机器学习pai诞生的原因。。
机器学习-分类任务
例如文本分类任务,将爬取的文章进行机器学习分成:体育、教育、科技、社会等。而训练分类模型需要大量的样本,训练也需要耗费大量的机器资源,还有一个更重点的,模型需要不停的纠正
才能达标。或许你会出现以下的几个崩溃的瞬间:
- 获取训练数据用了一上午的时间
- 在训练过程中经常由于数据的不规范(上报数据经常会出现不规范的现象)而程序崩溃
- 搭建训练环境,python+jieba+sklearn+gensim+matplotlib+。。。。
- 数据流每一步的缓存都要自己做。。。
- 看看准确率、看看模型质量、是不是输入数据还需要优化?
- 机器性能不行,跑起来以后,我啥都别干了,wait for you baby
- 等等。。
以下是一个工程的现状,跑起来脚本之后,可以静静的观察命令行,数据库(多个数据表),redis中情况:
自建大数据环境
在自建大数据环境中,将遇到以下的种种问题:
- hadoop搭建繁琐,hdfs+zookeeper+pig+hive+storm+。。。,手动搭建的话,无疑是巨量工作。
- 版本搭配问题,hdfs升级了,hive是不是要升级?是否兼容?这其中的需要采坑无数。也许你经常会出现以下情况,看某个博客分享的搭建流程,但是自己在搭建过程中,死活过不了第一步,报错都是莫名其妙。。
- cdh搭建,还算是方便点了,可以快速实现整个集群部署。但是,在使用过程中,经常会出现这样那样的运维问题,例如:节点空间满了,为啥有个节点过载了,等等,需要运维团队的投入
- 自建spark环境,同样会出现各种问题,比如:调度怎么做?有个任务submit了,咋半天回不来。。
- 然后就是机器的选择了,需要使用阿里的ecs还是实体机?显然实体机的性能要高。那么实体机要进机房吧,实体机的网络怎么选择呢?业务数据,怎么样同步到大数据集群呢?需要选择的解决方案很多,同时有运维的成本存在。
机器学习PAI
初体验(分词功能)
使用PAI的话上述问题可以得到极大缓解,对应的功能基本都进行了组件化
,使用托拉拽
的操作,就可以方便的进行功能调试。
数据引入:odps(也就是阿里版本的hive)的数据,可以非常方便的导流到PAI,只需要知道表名就行了。
做一个分词任务(不过这里吐槽一下,阿里默认的分词组件,效果不理想,我们之后要自定义自己的分词算法组件进行升级):
丰富的组件
以下是传统机器学习
的相关组件,基本上已经够用了。
除此之外,还包括:源/目标
、数据预处理
、特征工程
、统计分析
、深度学习
、强化学习
、时间序列
、文本分析
、网络分析
等模块。博主正在进行PAI的走读,并在之后配有相应的博客。
支持自定义组件
前面在实验的时候,发现分词不太理想,比不上jieba分词,那么我们可以通过自定义算法
来实现自己的组件。自定义组件
效果如下:
可以同正常的组件一样使用
组件在编写过程中,可以进行本地调试,这样省去了频繁上传和部署算法的时间
本地调试命令:
./bin/spark-submit --driver-class-path cupid/odps-spark-datasource_2.11-3.3.8.jar --py-files python/lib/pyspark.zip,python/lib/py4j-0.10.6-src.zip /home/wang/mine_code/python_blog/a.py inputTable1=xxxxxx outputTable1=xxxxxx idCol=id contentCol=col1
模型支持实时和离线的发布
- 在线部署,最简单的形式是,部署后直接生成API,直接进行新数据的预测(其他的部署形式,需要进一步的整合)。常用的实时场景有:广告推荐、商品推荐等
- 离线部署,使用调度功能,定时每天生成一个模型、并且通过模型生成新的数据表。常用的场景有:协同过滤推荐等
实验模板
pai把一个需求目标抽象成了一个实验
,当有一个新的需求来的时候,可以新创建一个实验,在实验中组合不同的组件
(就像搭积木一样),最终完成目标功能。
pai同时提供了实验模板(类似于Hello world),以下是通过模板创建的实验:
评价
优点:
- pai可以非常方便的整合数据
- 可以提供丰富的组件
- 支持自定义组件
- 初学者可以快速实践算法的效果
- 100+组件,也给初学者提供了学习方向
缺点:
- pai是付费的
注:使用PAI需要有机器学习知识的前置
总结:pai能极大限度的提高机器学习和数据挖掘的效率