开介绍机器学习主要的算法框架,包括监督学习算法,无监督学习算法和常用的降维,特征选择算法等;最后在业务实践的过程中,给出了一个可行的项目管理流程,可供参考。
如果把机器学习当做一个闭环的工作项来看待的话,会发现其实它的整个流程,跟我们日常生活中做其它的事情是异曲同工的,比如做一个ABtest,做一次竞品分析,或者写一个量化策略。只是在其基本过程里,我们所要考虑的问题点,所采用的工具和方法有所不同而已。
以下参考达里欧的五步流程法,尝试将机器学习的基本过程也简化为五个环节。
01确定目标
机器学习的目标并不在于机器学习,而在于我们将这种方法应用到现实场景,去解决现实的问题点。所以在工作开始之前,我们需要想清楚自己是要实现何种目标,比如是要对流失用户进行风险预警,对潜在付费用户进行意愿评估,还是对信贷用户进行欺诈识别。
02诊断问题
因为明确了所要实现的目标,所以可以根据现实基础来诊断问题。为了实现这个目标,需要机器学习给到怎样的输出,单纯的0-1标签即可,还是需要连续的风险概率;目前的数据量是否能支撑这个项目,业务样本的黑白比例是否不够均衡,这些问题都是需要诊断的。
03方案设计
明确了要实现的目标,也了解了现实基础里存在的问题点,便可以展开方案设计。在这个细分的业务场景下,适合选用哪一类型的算法,不同算法往往是为不同领域而生的;在这个场景下,如果没有明确的黑白样本,需要基于何种方法来进行样本定义。在方案设计的环节,需要给出一个工作开展的大的方向,相当于把时间和精力限制在一个合适的框架中。
04方案执行
在方案执行的过程中遇到问题时,如何进行解决,也是很重要的环节。机器学习算法的执行,一般称之为最优化的过程,即在一个算法框架下,如何最快地达到最优的结果。而针对整个方案的执行,又会包括数据准备,特征工程,算法调试,模型评估等具体事项,每一个事项相互独立,各有各的方法论,但又相互影响,上下游之间的执行效果环环相扣。
05评估迭代
评估的过程,其实就是一个目标量化的过程,因为有了量化,所以有了绝对意义上的效果优劣。只是不同的业务目标,不同的模型框架,对应的评估体系是不一样的。建立一套合适的评估方式,机器学习项目也就实现了闭环,可以在迭代中去逐步逼近要实现的业务目标。
01机器学习三要素
如同劳动力,资本,土地等是经济学的基本要素一样,其实机器学习也有自己的三要素,即数据,算法和模型,它们缺一不可,相互关联,并贯穿于工作的整个过程。人们说机器学习的过程,就是准备好充足的数据,应用合适的算法,去生成优良的模型的过程。
02其它关键要点
除了机器学习三要素外,其实也有其它的一些点是相当重要的,比如特征处理,优化算法,和模型评估等。缺少了这些内容,其实模型也能生成,但只能是大打折扣地生成。特征处理决定了模型性能的上限,优化算法让我们以最好的方式去逼近模型性能的上限,而模型评估则定义了什么是我们到底在讨论什么样的模型性能,它们是机器学习项目的“加速器”。
监督学习要处理的是有标签的数据,即业务场景里有绝对的黑白,明确的好坏,比如在信贷风控的场景下,逾期了就是逾期了,在金融市场的场景下,涨跌也都是界限分明的。通过对历史数据的学习,从而给当前的数据一个离散的标签,或者连续的数值结果。
线性模型的出发点很简单,就是考虑一个事情成立的多个因素,比如ABCDE五个因素,每个因素又有各自的权重,权衡过各个因素后,才做出最后的决策。将这个想法转化为数学的表达,也就有了因变量,自变量,系数,偏置这些概念,从而组成了线性模型。
线性模型也可以很复杂,有很长的历史,很多的变体。其中最经典的形式,是在线性基础上添加一个Sigmoid函数,从而将线性输出转化为概率,并进一步转化为黑白标签,也就是逻辑回归。在传统金融场景的评分卡领域里,逻辑回归的应用是非常广泛和深入的。
决策树的思想可以用四个字来概括,即分而治之。线性模型的因素考虑,是相互并列的,权重各异的,但决策树里不是如此。决策树里的因素是串行的,即先考虑A因素,随后针对A因素中的各种情况,继续考虑新的因素,循环往复,形成了一组决策链路,即决策树。
所以决策树里面最重要的问题,便是在当前这个节点,我应该考虑何种因素,去继续推进这个决策的制定。为了解决这个问题,决策树引入了计算机领域里信息熵的概念,经过推演,有了最大增益和增益率这些指标,对应了ID3和C4.5这两种经典的决策树范式。后来又通过引入基尼系数,作为因素选择的判断条件,从而生成了CART决策树。
贝叶斯学派和频率学派之间的争辩,很像是物理学里波粒之争,数学家们争执于参数到底存不存在,物理学家们则争执于光到底是波还是粒子。波粒之争最终通过波粒二象性的理论而宣告结局,但贝叶斯和频率学派的争执并没有结束,继续在不同的时代里各领风骚。
频率学派相信存在着一个客观实体(参数),所以要做的就是尽可能地去拟合和逼近这个参数,比如最大似然估计。贝叶斯学派则拒绝相信这一套,他们坚持我看见(先验概率),我思考(后验概率),我决策(贝叶斯模型)。贝叶斯理论广泛应用于文本处理的领域,生成了诸多经典模型,根据因素之间的独立性差异,产生了朴素贝叶斯及其它多种贝叶斯算法。
支持向量机是追求极致的,它要在所有的可行解里面,找到唯一的最优解。在二维平面里,这个解是一条唯一的线,在三维空间里,这个解是一个唯一的面,那么,在N维空间里,这个解就是唯一的超平面了。而用于寻找这个解的样本点,就称之为支持向量。
核函数是支持向量机里的大杀器,与人们所说的“降维打击”类似,核函数是要通过升维的方式去解决问题。如果在当下的困境里找不到答案,那就尝试在更高的维度里去破局。
神经网络引入了生物学里神经元的概念。每一个神经元都是简单的,有输入和权重,有阈值和输出,但是用众多神经元搭建起多层网络,网络之间又相互联系时,这个问题就变得复杂了。在2006年后,神经网络转身为深度学习,成就了无数或神秘或伟大的商业故事。
在神经网络的训练过程中,有一个很有意思的事情,就是局部最优和全局最优。模型训练中容易陷入局部最优的困境,停止搜索最优解,就像我们很多时候做事情,只是做好了,但是并不够好。为了解决这个问题,人们设计了模拟退火,随机梯度下降等多种训练策略。
集成学习的理念,是“好而不同”。对于一个问题,如果通过单一模型始终给不出最优解,不如集成几个好而不同的子模型,可能会获得性能优异的效果。三个臭皮匠,胜过诸葛亮。每个臭皮匠都有不足,但各有各的优点,而诸葛亮作为单一模型已是极致,却仍有局限。
集成学习有两个分支,如果子模型串行生成,则是Boost,如果子模型并行生成,则是Bagging。Boost强调的是一个一个上,针对前一个子模型的缺陷,通过下一个子模型去补足,xgBoost和GBDT都是其中的代表;Bagging强调的则是一起上,群架好过单挑,通过学习不同的样本,生成不同的子模型。Bagging的一个变体随机森林,便是这一类模型的优秀代表。
监督学习处理的是有标签的数据,无监督学习要处理的则是无标签的数据。正是因为没有了这个绝对的标签,所以会更侧重与数据本身的信息和结构,对于模型所得结果的合理性,也会有更丰富和更精细的评估。以下主要介绍一些不同类型的聚类算法。
基于原型的聚类,强调在数据中存在着某种确定性的结构,不同类别的结构,应该是不一样的。K-means是原型聚类中的经典代表,它相信数据中存在着K个中心点,通过迭代更新这K个中心点的位置,从而将所有样本点划分进K个原型里面,直至迭代结束。
基于密度的聚类,强调如果在数据中存在一个类别,那么这个类别里的样本点之间,是存在一定的紧密程度的,如果不具有的话,那就是属于其它类别。DBSCAN是这一类算法中的代表,它与K-means的不同在于,不预先假设K个中心,而是先寻找一个类别,获取这个类别所有的样本点,再在剩余的数据集里,寻找下一个类别,直到所有样本都找到类别。
基于层次的聚类,则是从一个更为立体的角度,对样本点进行自底向上的逐层的划分。AGENS是这一种算法里的代表,在第一层里,它将所有样本点当做是一个初始类别,通过计算类别之间的距离,不断的进行合并,从而在最后一层里保留下指定个数的类别。
相对于监督学习,无监督学习没有了标签的羁绊,反而成为了一个更为开放的场景,出现了一大批的形态各异的算法。但这些不同类型的聚类算法,仍要去讨论一些共同的问题,比如如何去度量聚类结果的性能,这里又分为外部指标和内部指标;比如如何去计算样本点之间的距离,基于不同维度,闵氏距离可以分为曼哈顿距离,欧氏距离,和切比雪夫距离。
除了监督学习和无监督学习外,有一些算法虽不直接生成具体的模型,当仍然是我们在数据探索,模型训练等过程中所必不可少的,比如降维算法,特征选择算法等。
数据之中的方差,被当做是一种信息的表达方式。如果对当前的数据集进行重构,用少量的几个特征来提取数据集所包含的大量信息,便是降维的理念,其中的优秀代表是PCA。为实现一个业务目标,我们从现实世界中收集的数据,往往不是最优的表达,它们可能有重复,有冗余,通过降维的方式,可以对这些原始数据进行重构,生成一个更好的数据表达。
机器学习算法,是用来炒菜的,但是你要选择哪些食材去炒,本身也是一个问题点。要做一份扬州炒饭,肯定不会把厨房里的材料全都加上,也不可能拿一把青菜和米饭就下锅翻炒,如何选择食材,便是特征选择的领域。过滤式方法中,特征选择和模型训练是相互独立的,互不干扰;包裹式方法中,模型性能则是特征选择效果的参考,两者相互影响;除此之外,还有嵌入式的选择方法。数据处理和特征选择的效果,往往会决定模型性能的上限值。
业务实践的过程,往往是一个追求“工业化”的过程,要求所做的事情要契合实际情况,要可实现和可复用。在这个过程里,人们往往喜欢用一套固定的框架去规范自己所做的工作,这个框架的缺点是相对呆板,限制了一些自由度,但好处是能有一个清晰可见的进度条,有利于项目的管理和推进。笔者在此分享一个曾用过的可行的管理框架,可供参考。
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。