README
前情提要: 线上spark(1.6.0)的jdk版本为1.7,而pmml要求jdk再1.8以上;所以通过pmml来进行从python->Java的跨平台机器学习模型上线的思路不通。现在想解决的问题是搭建一个完整的、相对人性化的大数据机器学习工程流程,并且有一定的向后兼容性,在技术更迭的时候不至于大改。
基于spark MLlib做支持分布式计算的机器学习
python:py 3.6
spark MLLib:spark的机器学习api库有两个:spark.mllib和spark.ml
spark.mllib基于RDD将一些机器学习算法改写,所以支持分布式计算,但Mllib中也只包含能够在集群上运行良好的基础机器学习算法。
spark官方推荐使用spark.ml,spark.ml基于Dataframe提供更高层次的api,它的逻辑接近sklearn,使用ml Pipeline api可以很方便、清晰地把数据处理,特征转换,正则化,和机器学习算法联合起来。关键是可以把Dataframe转成pandas的DataFrame。
spark官方文档说,未来会主要支持ml,mllib很有可能会被废弃,查看官网mllib升级的历史纪录发现某些api有很大的改动,说明向上兼容并不好,低版本的代码并不会适用于更高版本。 总之mllib能做基础机器学习,但是是有一些局限性的。
mlflow:是去年中旬databricks发布的项目,近一年来迭代很快现在已经到了0.9.0(2019.3.28)版本了;点击进入官网,点击进入博文,点击进入论文;官网上写的比较明确,它主要有三个特点:
跟踪试验用于记录、比较参数和结果 (MLflow Tracking)。
打包 ML 代码为可重用、可重复生产的形式,以与其他数据科学家分享,或者转入生产阶段 (MLflow Projects)。
从不同的ML库中管理和部署models,到不同的model serving 和推理平台(MLflow Models)。
个人认为mlflow的意义在于,给予机器学习流程一个相对统一的开发流程标准,并给调参过程的参数、结果、模型等做了记录,且有相应的web界面直观的展示。
pyspark:spark提供的python api。网上查资料说用python相较于scala性能较低,具体情况了解不多。
假如python语言不适合的话,应该是可以不用mlflow,直接用scala调用spark MLLib完成机器学习的模型开发、部署上线,但是python的优势就不能发挥出来了
进度:
学习Scala、spark算子等(长期任务,买本书《Spark 大数据集群计算的生产实践》)
训练模式
Scala:构建Scala项目打包丢在服务器上跑,看输出日志。(迭代太麻烦,已实现)
python的话,用mlflow ui管理机器学习训练过程,可以通过python脚本部署restapi跑,也可以通过jupyter notebook远程(jupyter待实现)。
TODO:spark流式机器学习与规则引擎实现
目前环境:
集群(以spark1.6为主)
jdk7
centos7+anaconda3-5.2.0(python 3.6.5)
mlflow 0.9.0
CDH5.15.2(spark1.6+hadoop2.6.x)
standalone
python3.5
jdk7
spark1.6+
10w条数据的观测结果:
总的来说,这些特征的离群值较多,0值很多,关键是不能判断出这些异常值是否是正样本(诈骗),箱型图的表现不好,大多数特征都不能有一个相对漂亮的箱型图,证明了异常值很多,但是这些应该可以用对数缩放、限制特征值等特征工程方法去解决,但是需要时间去研究。
特征相关性(线性)图分析:
流量、短信等特征和其他相关性不大,在这个数据集里可以看作干扰特征,但是感觉还是能挖掘出点啥
均值比较结论:
通话相关特征诈骗用户都明显大于正常用户,短信数量和正常用户差不多*,流量时长诈骗用户都明显小于正常用户,基站数量诈骗用户都明显小于正常用户
逻辑回归系数分析:calltime通话时长,flowsize流量大小,flowduration流量时长,msgcount短信数量系数大小较低(为0),但回归显著性为0(说明具有一定的意义),上述特征对模型有较小的影响。
1w条正样本数据通话相关特征的0值较多,无参考意义
ps:诈骗数据集有两个,其中一个数据集的均值明显高于另一个。 pps:两个诈骗数据集和10w个正常用户数据集都未经过处理
Last updated