引言
相信大家在日常的建模工作中都会或多或少地思考一个问题:建模可不可以被自动化?今天将围绕这个问题向大家介绍一个开源的自动建模工具H2O。本文将会cover以下三个部分:
1、H2O工具是什么;
2、基于H2O自动建模的具体流程与实战代码展示;
3、关于自动建模的一些思考。
希望本文能够帮助到大家,当你们没有足够的算法工程师但又想利用大数据建模提升企业效率的时候,使用自动建模工具也许是一个不错的选择。
H2O.ai是初创公司Oxdata于2014年推出的一个独立开源机器学习平台,它的主要服务对象是数据科学家和数据工程师,主要功能就是为App提供快速的机器学习引擎。目前它在全世界服务超过18,000家企业,服务用户数超过20万。根据H2O官网的介绍,它的主要优点包括:
支持大量的无监督式和监督式机器学习算法
支持通过R与Python进行引入包的方式进行模型的开发
能够提供给用户一个类似于jupyter notebook的UI界面进行“托拉拽”式的模型开发
支持模型的快速部署(用户可以在训练后下载基于Java的POJO和MOJO文件)
支持自动化建模和自动化参数调优
大家可以使用在Python或R中引入H2O包的形式进行该工具的使用,也可以下载软件在UI界面进行托拉拽的操作。
一、基于H2O Python包的机器学习实现
首先,一起来看看在Python环境中看看如何使用这个工具进行建模(目前支持Python版本为2.7/3.5/3.6)。
1、下载安装包
首先在安装包之前先进行依赖包的安装,最后下载并安装H2O的whl文件,如下(使用H2O之前请读者务必在服务器或本地安装Java):
安装完毕后进入Python环境(这里使用的是Jupyter Lab的交互环境,类似Jupyter Notebook)。
2、引入包并查看环境
引入H2O的包后可以查看到目前集群的状态,如下
现在可以看到集群的内存、cores、Python版本等信息;另外H2O.ls()命令类似于Linux中的ls命令,它可以提供目前读取到内存的数据集以及训练好的模型Object有哪些,由于还没有引入数据、也没有训练任何模型,因此没有任何objects。
3、引入、查看、整理数据集
下面通过H2O引入并查看一个用来训练的数据集,该数据集为电商场景的二分类数据,特征包括一些用户RFM、浏览、加购等信息,y为用户是否会在之后7天内下单购物。
在进行导入数据后,发现user_id(这里叫pin)依然在数据集中,进行列删除操作。
同时,由于要训练的是二分类(classification)模型,所以需要将y(这里为buy_tag)的类型从int改为enum枚举值,这样在模型的训练过程中会默认选择AUC作为评价指标。
4、导入模型module并建立模型object
这里选择GBM这个基于树的算法进行模型的开发,并设置100个树,最大深度设置为10,并设置10折交叉验证。
5、训练模型并展示训练结果
这里train()的参数非常多,找一些重点来举例; x为特征的名字集合,y为label,training_frame为训练集。
当然用户也可以通过将数据集分为训练集、测试集的方式来获取out-of-sample AUC等指标,这里通过交叉验证来获取该指标。训练完毕后可以进行效果展示。
可以看到在模型结果中H2O自动帮用户计算了大部分评价指标,在这个二分类任务中重点看AUC,可以发现在cross-validation数据集上的AUC为0.824,效果还不错,同时结果中默认给出了能够是F1 score达到最大的阈值(在这里为0.316)以及相应的混淆矩阵。
由于不同模型涉及到不同参数,具体模型参数设定可见H2O的官方文档
http://h2o-release.s3.amazonaws.com/h2o/rel-xu/4/docs-website/h2o-py/docs/modeling.html
目前H2O支持的监督模型包括:
H2ODeepLearningEstimator(深度神经网络)
H2OGradientBoostingEstimator(梯度提升树)
H2OGeneralizedLinearEstimator(线性回归)
H2ONaiveBayesEstimator(朴素贝叶斯)
H2ORandomForestEstimator(随机森林)
H2OStackedEnsembleEstimator(组合模型)
据官网介绍,之后H2O还会引入目前常用的tensorflow等组件来支持不同深度学习算法的使用,所以大家敬请期待。
6、H2O自动建模
在上节展示单模型建立的流程后,来看一下H2O最强大的功能,AutoML,自动建模。
如果在尝试自动建模的时候,请尽量设置max_models或者max_runtime_secs这样的参数来设置要训练的模型个数上线或最长训练时间,因为自动建模的底层会尝试对用户所选择的模型的参数进行GridSearch(网格搜索),以此来进行模型超参的调优。若没有设置好模型个数上线或最长训练时间,可能会出现跑了很久依然没有结束的情况。
同时可以看到一旦开始了自动建模,H2O很友好地提供了一个进度条来帮助查看建模进度。
训练完成后查看模型基于训练集AUC的排名,如下图:
这个排名版展示了所有所训练的100个模型中AUC前10高的模型,在图中可以清晰地看到最优的模型为组合模型(StackedEnsemble_AllModels),AUC为0.825。前10名中还包括像XGBoost和GBM一样的基于树的模型,AUC也相当不错。
值得一提的是,组合模型中AllModels与BestOfFamily的区别在于:前者是将所有训练好的模型作为base model进行融合,后者是通过各个模型family中最好的那个模型作为base model进行融合(融合方式默认为GLM线性回归)。
然后查看自动建模得到的最优模型在测试集上的效果,发现out-of-sample AUC依然高达0.820,说明没有明显的过拟合,自动建模完成!
7、H2O模型部署
在训练完模型之后,最后一步便是模型的部署,可能大家在平日操作中对于这一步比较苦恼,因为若使用sklearn这样的经典机器学习包在训练完模型后,模型本身是不支持在Hive集群进行分布式打分的。当需要打分的数据集过大的时候,没有办法一次性将其读入内存并进行打分,因此只能通过batch读取的方式按批次来进行预测打分,这样一来就需要用户花时间来写一些Python或者bash的脚本。
但是H2O提供了一个非常好的模型部署流程,它一方面支持用户像sklearn那样将一个模型文件下载到本地,又支持用户进行POJO或者MOJO文件的下载。而这里所说的POJO和MOJO文件分别是Plain Ordinary Java Object和Maven plain Old Java Object,作用是优化开发人员的模型部署流程,并且支持在Hive上进行模型打分UDF的改写。一旦通过POJO或者MOJO实现了模型打分UDF函数的编写,模型的打分在集群上就是分布式的,速度会非常快。
而且,在尝试了batch打分和分布式打分的两个流程之后,发现若对3000万行的数据进行非分布式的batch打分,总共用时25分钟,而分布式的打分则总共用时不到1分钟,效率提升很多。
由于具体的改写流程较细,因此大家若对这部分内容感兴趣,可以在H2O的官网和他们的github中找到相关的现成代码,助力模型部署。
http://h2o-release.s3.amazonaws.com/h2o/rel-xu/4/docs-website/h2o-py/docs/h2o.html?highlight=pojo#h2o.download_pojo
二、可视化建模UI工具
除了在Python或者R通过代码实现建模以外,H2O还提供了一个很用户友好的UI界面来实现“托拉拽式建模”,下图为这个工具的(H2O Flow)主界面:
这个工具相当于一个图形界面,底层依然是刚刚上面介绍的那些代码,它的好处是可以帮助企业中对于Python或者R语言不太熟悉的业务人员进行快速模型的建立。
由于篇幅问题,这里主要讲一下它每个功能点的具体含义,详细操作大家可以参照官网的用户手册进行学习。值得一提的是,这个图形界面非常的用户友好,当时仅用了1-2个小时就熟悉了基本操作,相信大家一定也能很快的学会使用。功能解释:
importFiles(读取数据集)
importSqlTables(读取SQL表)
getFrames(查看已经读取的数据集)
SplitFrame(将一个数据集分成多份数据集)
mergeFrame(将两个数据集进行列组合或行组合)
getModels(查看所有训练好的模型)
getGrids(查看网格搜索的结果)
getPredicitons(查看模型预测结果)
getJobs(查看目前模型训练的任务)
runAutoML(自动建模)
buildModel(手动建立模型)
importModel(从本地读取模型)
predict(使用模型进行预测)
读到这里,大家除了对H2O有了一些基本了解之外,也一定同样思考着一个更宏大的问题,那就是如何看待自动建模与机器学习的未来。想必大家一定在许多媒体报道或者公众号中读过类似这样的文章:“AI时代来了,最容易消失的100种职位”。对于从事商业分析、数据分析、数据挖掘、数据工程、算法工程的用户,可能多少也想过这样的自动建模技术能在多大程度上代替现有的一些日常工作。它会完全取代现有的建模过程么?还是说它目前效果不好,无需担心?
其实,看待“手动建模”和“自动建模”这两者的关系可以参考“有人驾驶车”和“无人驾驶车”这两者的关系。就算短期内无人驾驶车可以上路,交通部门也一定会要求驾驶人员具有一定的驾驶技术,以确保在无人驾驶发生意外之时能够让用户进行手动操作。同理,在如今各大公司都开始慢慢探索自动建模技术的时候,依然需要拥有求知欲和一颗敬畏之心,在尝试自动建模技术之前深入了解一些模型算法本身的技术,这样一来,虽然可以更多地在工作中使用自动建模,但是一旦出了问题,也可以从“自动”切换为“手动”来迅速地解决模型部署上的问题,而不至于干着急。
另一方面,目前自动建模领域所涉及的领域更多的还是浅层学习,还没有发展到可以自动建立CNN或者RNN那样的地步,毕竟后者还是一个新兴的前沿领域,许多算法工程师依然在图像识别、语音识别、阅读理解领域不断创新探索新的算法。这方面的工作暂时不太会被自动建模技术所取代(H2O官网上有写到未来可能会集成tensorflow的建模框架,但目前来看暂时还没有开源的资源)。
那么,如果自动建模技术在5年内真的渗透到我们工作中的各个领域后,基础的数据挖掘和算法工程师该如何体现自己的价值呢?起码有这两点:
对于业务的深度理解:虽然模型可以进行自动训练,但是前期与业务方的建模需求整合,特征工程,变量清洗等工作还是需要人来参与,因为业务知识是暂时没有办法教给机器的。
对于模型应用场景的选择:如何去应用模型以及选择最优的应用场景也是需要人来判别的,机器本身是没有正负情感的。
如果大家对于自动建模有新的想法,欢迎随时联系,一起交流进步!
后 记
京东数科运营决策团队基于大数据环境,结合丰富的业务场景,利用机器学习专业技术,不断挖掘海量数据中蕴含的丰富信息,我们已将一系列机器学习模型应用到多个领域中,并且坚持在算法深度的道路上持续探索,致力于对未知信息和事件做出更精准预测,使业务运营策略更加精准有效。