报告各位首长,我参与的第二个项目顺利上线啦~ 棒棒,又一次感觉自己做的东西是有价值的,这个项目是一个平台类产品,专注于提高线下零售的实施效率,希望后面的迭代会越来越好。但是这个今天跟主题没什么毛关系,今天要跟大家聊聊最近的一点小思考,关于Machine Learning 的最小化可行产品的设计,以及平台化设计,应该是怎么样的。
我在公众号后台看到好多读者大大都留言了 “MVP” 来获取之前做的PPT了,但也很多大大希望我能好好讲讲这个PPT的内容,以及背后设计的思想是怎样的,今天终于有空跟大家细细捯饬捯饬。
什么叫MVP?MVP(minimum viable product,最小化可行产品)概念最早由埃里克·莱斯提出的。MVP的目的——更快的接触客户。按照常规的开发方式,从调研、到设计、到开发再到推向市场,会是一个漫长的过程,而且很难有人会保证成功率。但当换一种方式,以MVP进行小样调研,快速进入市场、接触客户并得到反馈。透过反馈不断修改原型,并进行不断地的迭代开发,极大减少了试错成本。
那么问题来了,一个机器学习的 MVP 最小可行化产品,应该是怎样的?可以分两个方面来看,一是技术的选型,二是产品的实施流程。
关于技术的选型
机器学习其实是一门有非常多年历史的学科,各种算法你可以手写,现在市面上出现的层出不穷的机器学习框架也很多,在做 MVP 的时候要怎么去做决策?是自己写一套框架以有利于自己对业务实施细节的把控?还是使用现有的框架,去踩它们所拥有的坑?设计产品的实施流程的时候,应该怎么权衡,是按照常规的开发方式,从调研、到设计、到开发再到推向市场,一切都要 100% ready 再上线,还是有一个不是非常完美但是可控可迭代的产品流程作为快速接触用户,快速进行试错的基础?都需要决策者去细细抉择。
在我看来,要做好 Machine Learning 的产品,当然可以自己去实现一套基础可用的算法,这也并不是什么特别难的事情。但我的建议是,在初期阶段,抱现有技术的大腿,能抱大腿就抱大腿。为什么呢?因为现在机器学习库比如 scikit-learn、svmlib、xgboost、Tensorflow、Spark MLlib 这些现成的库,能帮助我们快速试验我们的想法,并且快速上手,这些库帮我们实现了数据预处理,异常处理,性能优化等很多方面的问题,所以即使你们团队有能力自己实现一套框架,在初期验证阶段我还是建议直接抱现成技术的大腿。现在也有很多 Java 实现的机器学习,我的唯一建议就是不要用,目前的业态我没看到任何关于 Java 写机器学习框架的潮流,基本都还是基于 Python 的。
我简单解释一下这套框架。数据仓库是基础,如果你连一点数据积累都没有那其实可以先不考虑机器学习,从数据仓库中可以使用一些规则引擎产生中 Low Leve 的特征。也可以使用 SparkStreaming 或者机器学习平台进行准实时或实时地计算一些 High Level 的特征(这里的 High 和 Low 指的是特征的抽象程度,并不是实用性或者效果)。
有了特征库,就可以基于这个特征库,使用scikit-learn、 xgboost、Tensorflow、Spark MLlib 等框架进行模型训练并把模型保存下来。然后再使用 SparkStreaming、django 或者 redis 对外提供服务。这套简简单单的架构有什么好处?最大的好处就是这套框架实现了最基础的数据处理、模型训练以及服务提供的能力,完美满足机器学习所需要的方方面面,在我看来是一个基础可用的框架。拆箱即用,老少咸宜,谁用谁知道。
关于产品的实施流程
最小可行化产品的要点,对小规模、有质量、已标注的数据进行训练。为什么呢?从经验上来看,数据量并不是越多越好,特征也不是越多越好,一个数据集即使只有几万条数据,但是质量很高,标注度也很好,其实更适合于产品初次实施的试验。原因有两点,一是训练时间不长,可以多尝试寻找最优模型。二是质量高、已标注的的数据最终表现效果一般会比质量低或者无标注要好很多。
根据很多资料,总结的一个比较可行的流程如下。
MVP 最重要的速度就是快速落地,而上面这个流程可以帮助我们进行快速的落地和快速的迭代。
○ 明确需求:明确本次机器学习产品的需求,是对点击率进行预测,还是对客户留存率进行预测,这个要预先明确下来,这是最最重要的第一步。但是这个阶段要细化到可实际操作的需求,有的需求很粗可能工程师无法细化,也无法拆分,更无法量化。比如需求就是提高客户体验,完全没有可量化的东西,要更加细化,明确什么样才算提高客户体验。
○ 特征量化:需求明确下来了,要对可能影响需求的特征或者属性进行量化,这个步骤也很重要。比如说影响客户留存率的可能有距离上次登录时间,这是一个无法量化的东西。我们可以量化成,近两天是否登录,近一周是否登录,近一个月是否登录,这样量化的东西。
○ 目标量化:跟特征量化思路一样。
○ 特征清洗:对已经量化的特征进行清洗,比如去除无效字段,对特征进行离散化等特征工程的东西。也包括使用一些基础的模型比如线性回归,xgboost等模型进行特征重要度的筛选,作为一个 pipline ,最终得到模型可用的数据集。
○ 模型选型:进行模型的选择,比如连续型目标变量可以拍脑袋用线性回归,离散型目标变量可以拍脑袋用 Logistic 回归,用 GBDT 或者 xgboost 也是一个很好的选择,总之就是不断尝试,选一个比较合适的模型。
○ 模型训练:选好模型之后就针对数据进行训练,看看效果怎么样,效果不好就回到特征或者模型选型重新再来一次。
○ 线下验证:训练好模型之后,在线下对生产环境产生的新数据进行验证,看看是不是跟训练效果差不多,看看是差之毫厘,还是谬之千里。
○ 模型上线:效果还过得去,就将模型部署上线,是骡子是马拉出来跑跑看,最好一开始引入比较小的流量。
○ 特征清洗:一般来说,线下做了怎样的数据清洗,线上也要做同样的数据清洗。
○ 模型预测:使用训练好的模型对线上数据进行预测。
○ 结果应用:将模型预测的结果进行应用到规则引擎进行评分或者拒绝等。
○ 运行监控:对模型产生的数据进行监控,看看是否有异常。并对应用模型的前后进行比较,评估是否停用模型。并加入到下一次的迭代需求中。
至此,一个完整的机器学习产品流程已经形成了一个闭环,参照这个流程可以比较快速地进行机器学习产品的落地。下面我举个比较简单的栗子来阐述上线这个流程,假如我们要上线一个模型,主要做贷款产品的客户动用率预测,以此来给销售人员给客户介绍产品的时候对于接触频率和接触深度的把控提供数据上的支持,流程是长下面这样的。
- 与业务同事讨论本次需求的目标是什么,这里来说就是动用率预测。
- 选出可能有影响的特征,比如年龄、性别、近三个月是否动用等。
- 选择是否动用作为目标,动用为1,未动用为0。
- 对样本进行筛选,缺失值补全,并利用先验知识去掉明显不符合常理的数据
- 直接丢个逻辑回归。看训练集和测试集,讨论出一个精准度即可。
- 丢上线去跑跑看,看看结果如何,暂时不接入关键流程中即可。
一切尽在掌握中,总结一下今天的内容。
- MVP的目的是更快的接触客户。
- 尽量使用现成的 Python 或者 Spark 框架。
- 用比较轻量的流程进行机器学习产品开发。
- 应用到生产上,快速迭代。