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和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