带你读《增强型分析:AI驱动的数据分析、 业务决策与案例实践》之三:预测模型的新技术-阿里云开发者社区

开发者社区> 华章出版社> 正文

带你读《增强型分析:AI驱动的数据分析、 业务决策与案例实践》之三:预测模型的新技术

简介: 本书“深入浅出的原理介绍 + 实际使用的案例”的内容安排能够使得数据分析建模人员从算法原理、数据挖掘知识结构、业务应用方法等方面得到提升,帮助数据分析建模人员开阔眼界、优化知识结构、提升实践技能。

点击查看第一章
点击查看第二章
第3章

预测模型的新技术

人们对预测未来总是充满热情,预测技术的发展也使得人们不断看到成功的案例。早期的预测技术侧重于算法的精准,比如逻辑回归、决策树、支持向量机等。笔者在十几年前做研究生论文时发现,支持向量机模型的研究和应用是非常火热的,有点类似于如今的深度学习,若对深度学习不了解,都不好意思说自己是做机器学习的。然而在当下,算法的不断精进也伴随着旨在提高算法应用水平的相关技术的发展。这些技术使得模型的训练变得高效和智能,本章主要介绍当下流行的分类型算法,以及已经发展得比较成熟的模型训练方式的改进。

3.1集成学习

集成学习(Ensemble Learning)技术的出现,旨在将多个预测模型结合起来,达到明显改善相对于单独采用一个模型的而得到预测效果。因为结合的技术不同,Ensemble技术可以分为Averaging和Boosting两种不同的方式。

3.1.1Averaging方法

这个方法是分别独立地训练不同的模型,然后采用平均或投票的方式,生成最终的模型结果。典型的有bagging方法和随机森林等。bagging方法很有意思,就是将训练数据分成不同的子数据集,然后在其之上分别训练模型,最后采用如投票的机制来实现最终模型结果的输出。当训练数据集过小时,可使用自举技术(Bootstrapping),从原样本集有放回地抽取子集,分别训练模型,然后集成。当训练集过大,可以采用bagging的方法,将很大的训练集分成不同的子集,这样得到的结果既提高了精准度,也提高了模型的稳定性。图3-1就是一个简单的bagging过程示例图。
image.png

图3-1bagging方法的过程

目前人们总是在谈论采用海量的训练集来训练预测模型的效果一定比抽样效果好。在笔者看来,这只是一厢情愿的看法。“采用全集而不是抽样”的大数据思维在训练预测模型时,未见得一定是正确的。精心构建的抽样数据集,在绝大多数情况下,在抽样数据集上进行模型训练,也往往能得到很好的结果。这样做既保证了效果,也保证了工作效率。在一个几十万的数据集上,单机的情况下很快就能得到训练、验证等一系列工作的结果。当然,采用较大的训练集来训练模型,若在数据准备、环境等因素都具备的情况下,也是一个最佳的选择。
在scikit-learn中,已经提供了bagging方法的实现,读者可以轻松调用。特别是在训练集特别大的情况下,读者就可以采用这个方法。
image.png
在上述代码中,BaggingClassifier其实就是一个分类算法的容器,其实现了bagging的整个流程,可以调用任何一个客户指定的分类进行bagging的过程。
随机森林实现方式比较简单,基本上是通过构建一系列的树组成森林,然后通过投票来决定最终结果,图3-2所示就是这个过程。随机森林中每棵树的训练时数据的提供方式可以是bagging或Bootstrapping。
随机森林中的每棵树的投票,在计算最终方式时有两种方式,即Majority和平均方法。Majority方法是将预测概率排序,取概率值最高的预测结果为最终结果。而平均方法则是将同一类的预测结果的概率加总求平均值,作为最终的预测结果及概率。在scikit-learn中专门提供了两种投票方式的独立工具,笔者曾经改造过其中一个投票器,在3.5节中将重点介绍投票器的内容。
image.png

图3-2随机森林的实现方式

3.1.2Boosting方法

顾名思义,Boosting方法是按照序列的方式来训练模型,序列中的每一个模型都在试图减少前面模型的误判。在模型开始训练时,第一个模型将训练集中的每一个观察量的权重看作是相同的,并尝试构建一个分类;而该分类势必会产生部分观察量的误判。从第二个模型开始在训练时将前面模型的误判的观察量的权重做出一个调整,强迫此次学习时尽量分类正确。按照这个过程不断进行迭代直到满足一定的精准度要求。图3-3展示了Boosting的学习过程。
image.png

图3-3Boosting方法的过程

Boosting方法出现得其实已经很早了,在经典的商业分析工具软件如IBM SPSS Modeler中,很早就有Boosting的相关设置。近几年人们基于Boosting的思想开发了如AdaBoosting和Gradient Tree Boosting等性能较好的模型,使得Boosting又变得火热起来。
AdaBoosting是Adaptive Boosting的缩写,意指在每一次迭代中对前一个弱分类器的失误判断是敏感的,即通过计算弱分类器的失误判断的误差来计算出最终模型中每个弱分分类器的权重。给定xi∈X,yi∈{-1,1},i∈[1,n],其计算过程如下:
1)初始化每一个观察量的权重,Dt(i) = 1/n;
2)训练一个弱分类器ht;
3)计算ht的最小预测误差t,即统计判断结果为-1或1中失误次数最小的次数,作为计算ht最小预测误差t的重要输入;
image.png
4)计算该分类器的权重image.png
5)更新观察量的权重,作为下一次迭代的新权重;
image.png
6)按照算法设置,重复迭代第2步至第5步;
7)生成最后的预测模型的结果。
image.png
图3-4展示了AdaBoosting方法的运算过程。AdaBoosting算法的特点是计算了每个弱分类器的权重,该权重的计算是由误差等要素得来的,所以可以称之为Adaptive的原因。
image.png

图3-4AdaBoosting方法的运算过程

在Spark MLlib 中并没有实现AdaBoosting算法。scikit-learn中实现了非常简捷的方式,读者可以很方便地调用。
image.png
在上述的例子中,构建了AdaBoosting的实例;采用弱分类器算法决策树,并且设置弱分类器的相关参数;同时设置了弱分类器的个数等。

3.2Gradient Tree Boosting介绍

Gradient Tree Boosting或Gradient Boosted Regression Trees算法在近些年特别流行,应用该算法进行预测模型的构建也确实能达到较好的效果。

3.2.1梯度与梯度下降

Gradient,中文翻译为梯度,其取值代表了对给定的函数值逐步增大或减小时的最直接的方向。梯度的计算其实非常简单,就是分别计算每个变量的偏微分,构成一个向量。比如在图image.png,该梯度代表了函数f (x, y)取值由小变大时最直接的方向。
梯度可以看作在爬一座山峰时,最快到达山峰的方向;若将梯度取负值,则代表下山时最直接的方向。梯度比较通俗的认识可以认为是等高线的法线方向,如图3-5中蓝色箭头所示的方向。
梯度下降(Gradient Descent)是机器学习经常使用的一种在求得拟合函数参数时“最小化损失函数”的方法。其本质上就是求得使损失函数最少(对实际观测值拟合效果最优)、能够以最快的速度达到谷底过程。图3-6中就展示了这个过程。
在应用Gradient Descent最小化损失函数的过程中,有一个非常重要的控制参数——learning rate。该参数控制着在每一步寻求最小值时的步伐大小。步伐的大小对模型的效果影响非常大,步伐过大会导致欠拟合(under fitting),步伐过小则会导致过拟合(over fitting)。图3-7中的例子就说明了不同的learning rate对拟合效果的影响。若按照图中箭头所示的方向,肯定是最佳拟合,但是若处理不当往往会导致过拟合。
到底如何才能设置一个合适的learning rate呢?这是一个需要不断进行调整和试探的过程,在3.4节中,将介绍如何应用一些新方法得到相对较佳的learning rate。
image.png

图3-5函数f (x, y) = -(cos2 x + cos2 y)2的梯度方向(蓝色箭头)

image.png

图3-6Gradient Descent就是以最快的速度最小化损失函数的过程

image.png

图3-7不同learning rate下拟合函数的结果大不相同

3.2.2Gradient Tree Boosting算法的原理

构建一个预测模型的实质其实是个包含很多任务的工作过程,其中最主要的工作除了确定样本、数据预处理等,还有一个过程就是选择一个算法来进行训练。选择的算法其实就是选择一个函数来拟合现实观察量的情况,比如针对图3-8所示的情况,可以选择回归函数或者选择一个相对复杂的决策树来进行预测,但其结果是明显不同的。
image.png

图3-8针对同一组观察量可以采用不同的基函数进行预测

当我们选择了一个算法进行预测模型构建时,其实是选择了一种“如何用数学方法来拟合现实观察量”的方法。模型的训练过程就是在给定基函数(如选择回归函数还是高斯的方法)下如何确定相关的模式能够表达现实情况,并能用于预测。模型训练得到的模式中其实是通过对训练集的学习确定了重要的算法参数,如回归算法中自变量的系数。应用Gradient Tree Boosting构建模型的过程也是如此。
Gradient Tree Boosting算法的基本形式如下:
image.png
其中,hm(x)是指弱分类器,目前都是采用决策树算法;m是learning rate。具体在每一步的迭代过程中,通过最小化损失函数的计算来选择新的一批弱分类器作为本次步骤中的分类器。
image.png
其中,L(yi, Fm-1(xi) + h(x))是每次迭代步骤中的损失函数。最小化损失函数的计算过程其实就是Gradient Descent的过程,即按照能以最快速度、最小化损失函数的方向来确定每一次迭代的弱分类器的选择。
image.png
Gradient Tree Boosting算法既可以用作进行分类型的预测,也可以进行数值型的预测(回归模型)。在两种场景下,Gradient Tree Boosting算法的原理是相同的,不同点在于损失函数的选择是完全不同的。
Gradient Tree Boosting算法还有其他名字,如Gradient Boosting Decision Tree,简称GBDT。GBDT在中文翻译中有时称之为梯度提升决策树,这往往会引起读者误解。梯度应该是下降才对(Gradient Descent),怎么会提升呢?所以,中文翻译的字面意思在这个算法上需要仔细斟酌下。
在scikit-learn中,Gradient Tree Boosting算法有非常好的实现,使用者可以非常方便地进行调用。在调用时使用者需要指定损失函数(loss)、弱分类器的个数(n_estimators)、learning rate、弱分类器相关参数(如决策树的深度、叶子节点的个数)、提高算法性能的参数(subsample是结合了bagging和Boosting两种做法)等。
image.png
模型中的其他参数设置、详细的接口说明在本书中不做详细介绍,读者可以参考scikit-learn非常详细的官方文档。模型的训练和验证等示例代码与所有的模型类似,这里不再赘述。笔者在去年的一个项目中,采用了Gradient Tree Boosting的算法,构建预测模型时对比了简单的其他模型如决策树等,确实发现其效果有显著的不同。但是复杂模型Gradient Tree Boosting的参数调优需要仔细地花时间来完成,这样才能达到最好的效果。

3.3Gradient Tree Boosting的改进方向

Gradient Tree Boosting是个贪婪的算法,应用基本的Gradient Tree Boosting算法训练模型,很容易导致过拟合的问题。所以,在应用该算法时,需要从“如何改进Gradient Tree Boosting算法”的方向上进行参数的调优。陈天奇博士开发出了XGBoost(eXtreme Gradient Boosting),它是Gradient Boosting算法的重大改进的实现,极大地提高了算法的预测效果和应用广度。

3.3.1Gradient Tree Boosting的使用要点

根据Gradient Tree Boosting算法的特征,即通过应用批量的弱分类器对结果进行预测,可以从以下四个方面对算法进行改进。
1. 弱分类器的参数
若采用决策树作为弱分类器,则需要重点关注弱决策树的相关参数,包括以下几个:
1)树的个数。树的个数决定了Boosting的次数,该值越大,学习的次数就越多。
2)树的深度。树的深度深刻地决定了单个决策树模型的预测效果。树的深度越深,拟合的效果越好,应用的变量也越多。
在实际的项目中,经常会用到SAS等工具,但是决策树算法在很多建模平台都是必备的算法工具。图3-9中根节点是指所有的观察量,每一次分叉(split)都是由一个变量在决定;先用哪个变量进行划分是按照信息熵的增益来决定的(简单来讲就是区分力);对给定变量从哪个区间进行划分一般是采用分位数试探出来的(在训练阶段自动实现)。决策树模型是非常经典的预测模型,笔者曾经做过很多实验性的测试,发现树的深度对模型效果的影响非常大。
3)叶子节点数量。叶子节点的数量决定每一次划分的精细程度,叶子节点越多,则对数据的拟合效果越好。
4)叶子节点上样本的数量。这个设置决定每一次划分后在训练集上观察量的数量,也是指叶子节点的权重。若该数值较小,则允许少量的样本就可以决定一个划分。
2. learning rate
Gradient Tree Boosting算法的learning rate是通过设置每次Boosting时对权重的调节来实现的。在scikit-learn的GradientBoostingClassifier算法中,建议从0.1开始设置的。为了防止过拟合,learning rate和弱分类器的个数是“正向调节”的关系,即当弱分类器个数比较多时,就要提高learning rate;反之,若弱分类器的个数较少时,learning rate也需要适当调小。这样做的原因是Boosting的次数决定学习的强度,该值越大,强度越大,此时需要将学习的步伐(learning rate)调大一些,这样才不会使得模型的拟合度过高。反之亦然。
image.png

图3-9SAS EM工具生成的决策树模型的图形化展示

3. 有放回地随机抽样
受到随机森林中bagging的启发,Gradient Tree Boosting算法也可以采用抽样的方式来学习,即采用部分的数据而不是全面的训练集来进行模型训练,这种方式称为Stochastic Gradient Boosting。在scikit-learn的GradientBoostingClassifier算法中,subsample参数就是用来设置训练时所用样本的比例的,当subsample设置为0.8时,就是在每次迭代时随机抽样所有训练数据的80%来进行模型训练。这种方式增加了训练数据的随机性,使得模型更健壮一些。
4. 惩罚性学习(Penalized Learning)
惩罚性学习的使用场景有两种常见的情况:一种是当正样本不足时,也就是欠抽样的情况下,在模型训练阶段中对正样本误判的情况增加惩罚项,强迫模型“重视”每一个正样本。
另一种是应用Regularization的技术,使得过拟合发生时损失函数取值非常大,强迫模型尽量避免过拟合的发生。Gradient Tree Boosting算法的惩罚性学习主要说的是Regularization方面的内容。
在scikit-learn的GradientBoostingClassifier算法中并没有Regularization相关的支持,而在XGBoost中实现了L1和L2的Regularization支持。由于Regularization技术比较重要,相关内容专门在3.3.2节中进行介绍。

3.3.2Regularization

当算法比较复杂且在训练模型时总是期望引入过多的变量时,容易引起过拟合的问题。过拟合问题的出现的实质上是构建模型时,对训练数据的学习过度,学习出的模式无法对实际的情况做很好的适应。所以,过拟合的表现都是在训练集上的效果很好,但是在实际应用数据集上的表现往往不尽如人意。
只要进行预测类的建模,都无法绕开过拟合的问题。笔者多年前曾经给某银行客户构建了一个是否购买黄金类产品的预测模型,出于探索的目的,我们尝试了数个模型的构建方法。在最后的实际部署数据上的表现中发现:原来在测试数据上表现稍弱的逻辑回归模型,却明显好于在测试数据上表现良好的决策树模型。这在客户方引发了一场热烈的逻辑回归算法与决策树算法优劣的讨论!其实,每一个算法都有其优缺点,重点是我们如何使用而已,这种情况就是明显的过拟合的问题。
Regularization是通过在算法中增加一组惩罚项用于减少由于学习训练集中的噪声数据而引起的过拟合问题,其本质是在损失函数中加入收缩量(shrinkage quantity),当整体的损失函数(包括收缩量)寻找最小值时,使得模型不得不放弃在训练集上更精准的拟合。Regularization中收缩量的实现方式不同,由此产生出Regularization的3种方式:
1. L1 Regularization
L1 Regularization又称为Lasso 惩罚。具体的数学表达是:
image.png
其中,是个调整参数(tuning parameter),用于设置模型在训练时被惩罚的力度。具体的算法不同,i代表的含义不同。若模型采用回归算法,则i是进入回归模型中每个变量的系数,当使得ErrorL1取得最小化时,会促使模型将某些i取值为零,结果使得某些变量不被采纳。若模型采用的是Gradient Tree Boosting算法时,则i是弱分类器决策树上每个叶子的权重,当使得ErrorL1取得最小化时,会促使模型将某些i取值为零,最终使得决策树的判断逻辑不被采纳或整棵树都不被采纳(当决策树的深度非常浅时)。
2. L2 Regularization
L2 Regularization又称为Ridge惩罚。具体的数学表达是:
image.png
相对于L1 Regularization,L2 Regularization使得惩罚项的参数相对较小。比如对于回归模型,会避免某变量的参数值过大(其实也是在预测模型中权重过大);在Gradient Tree Boosting算法中,会避免决策树中叶子节点的权重过大。
3. L1/L2 regularization
L1/L2 Regularization又称为Elastic-Net惩罚,其结合了L1 Regularization和L2 Regularization两种规则化的特点,其数学表达是:
image.png
其中,参数用于调节L1 Regularization和L2 Regularization之间的权重。

3.3.3XGBoost介绍

XGBoost和scikit-learn的GradientBoostingClassifier算法相比,有一些明显的优势,如支持Regularization、支持Spark、支持并行计算等功能。XGBoost已经不是一个算法,而是由开源社区维护的一个平台,并且其使用方式非常简便。
image.png
上面的代码就是分别调用了GradientBoostingClassifier和XGBoost的构建预测模型的例子。其调用的方式其实很简单,在XGBoost中默认使用了L1 Regularization,通过reg_lambda来设置。这两个算法的具体参数设置,读者可以在官网中查看。

3.4模型的最佳参数设置

在3.3节的XGBoost的例子中,若参数“max_depth”由“3”改为“1”,则最终的精度会从0.912变为0.915;若将subsample参数由“0.5”改为“1”,则精度又会降至0.9。这其实是一个非常典型的例子,即在应用算法构建模型时,对其参数的设置会很大程度上影响最终效果。
参数的设置往往需要从“参数组合”的角度来尝试,没有哪个算法只需要设置一个参数就可以使得模型效果达到最优。在前面小节中的例子,当设置Gradient Tree Boosting的弱分类器的个数时,同时需要考虑是否需要同步更新learning rate。那么,到底哪种组合才是最优的呢?最大的决定因素是其在验证数据上的表现。
寻找最优参数组合的研究就是所谓超参数优化问题(Hyperparameter Optimization)。优化问题基本上都是在一个给定空间中寻找最优解(在5.4.3节有相应的介绍),超参数优化也不例外。算法的各种参数的可能取值就构成了一个超参数空间,寻找最优参数就需要在该空间中进行。比如,Gradient Boosting Tree算法中弱分类器的个数、learning rate、每次迭代抽样的比例(subsample)、弱分类器决策树的深度等参数的各种可能取值的组合构成了一个超参数空间。若用一个形象化的图形展示的话,超参数空间的各种组合如图3-10所示的多维空间中的球体中的各个点,而超参数的优化问题就是在众多的点中找到其中一个点,这个点上的各个参数能使模型效果达到最优。
image.png

图3-10超参数空间的各种组合的图形化示例

其实人们在很早就意识到这个问题并试图提供一些工具来解决。笔者在之前经常使用的SAS EM中就提供了“允许使用者同时构建多个模型并通过模型间的比较来选择最优”的工具。
在图3-11的例子中,使用者可以针对决策树算法分别设置不同的参数,比如第一个决策树的深度为5,叶子节点的观察量为50,每个分叉最大数为2;第二个深度为7,叶子节点的观察量为20;第3个深度为5,每个分叉的最大数为3等。这些组合都是使用者根据多次尝试的经验来设置的。
image.png

图3-11SAS EM中同时构建模型并最终选择最优的示例

现在在开源世界,已经开发出了非常强大的工具,支持Grid Search等方法,批量构建模型,从各种组合中寻求最优模型。Grid Search的本质就是人们可以设置各种参数的组合,如在scikit-learn中,就可以设置SVC算法的各种参数组合。下面的代码中就设置了两组不同的组合。
image.png
在Gradient Boosting Tree算法中,就可以进行如下设置,将弱分类器个数和每个分类器中决策树的深度作为不同的组合。
image.png
这种组合的结果就是,在n_estimators 的8个可能取值乘以max_depth的6个可能取值之间进行排练组合,共要训练48个模型。如果人为训练的话,需要比较长的时间才能完成,而利用Grid Search的工具,只需要设置好参数,由机器自动运行即可。
在进行Grid Search时,为了避免过拟合,必须与Cross Validation一起使用。Cross Validation的过程是一个算法会经过多次训练,而每次训练时训练集合验证集都是不同的。
如图3-12所示,若采用K-flod Cross Validation的方法,则每个模型会训练4次,每次测试集和训练集都有变化。在应用Grid Search + Cross Validation时,训练模型会需要比较长的时间。
image.png
image.png
image.png

图3-12K-fold Cross Validation的过程示例

针对上述设置,需要 (2×4 + 4)×2(scores)×5(cv)=120次的模型构建才能完成。在这种情况下,经常发生的情况就是,建模者一旦开始运行建模过程,需要半天以上的时间才能得出结果,这是大多建模者不能接受的!
在实际使用过程中,人们可以根据自身使用的经验,分步通过Grid Search + Cross Validation的方法来完成建模。下面就是笔者曾经在一个项目中进行尝试的过程。
image.png
image.png
image.png
在scikit-learn中,我们还可以使用warmstart的参数,将其在寻求最优超参数的中间模型中复用起来,达到更快速进行建模的目的。

3.5投票决定最终预测结果

在本章前面的小节中介绍了随机森林是通过弱分类器的投票来实现最终结果的预测的。与这个机制类似,能否通过构建多个不同算法的模型,然后通过投票机制来实现最终的预测呢?答案显然是可以的。
随机森林在投票之前的弱分类器的训练是通过对样本进行bagging实现的,而投票机制是否也需要这样做呢?在笔者看来,采用bagging和采用全部训练集训练各个不同的分类器都可,图3-13中展示了投票机制的过程。
image.png

图3-13投票机制的过程说明

在scikit-learn中,投票器中各个模型的训练是在投票器的构造函数中完成的。笔者在第一次使用该工具时,没有看到显式的调用训练过程觉得有点奇怪。其实在构造函数中进行模型训练能够保持代码的简洁,但是对于使用者来说没有习惯性的调用fit函数。
image.png
读者可以看到在最终应用该模型时是采用cross_val_score函数进行预测的,这是为了模型的验证过程,不是真正的部署过程。部署过程还是只需要调用predict函数即可。
投票过程既可以是“硬投票”,也可以是“软投票”。软投票是计算所有分类器的平均概率来决定最终预测结果。平均概率在计算时也可以设置权重,下面的代码就是应用软投票机制的方式来构建模型。
image.png
权重是按照相对值来计算的,所以在设置时需要差别比较大才能看到效果。否则,“若使用者试图设置分类器的权重”效果会很不明显。
Ensemble Learning所涉及的内容中类似随机森林、Gradient Boosting Tree等是从算法层面进行改进的。投票器的使用,使得构建更复杂模型的目标能够轻松实现。人们可以借助于投票器构建比较复杂的模型。
图3-14中所示的情况可以应用在新旧模型结合使用的情景下。原先的模型采用的原来的维度,而新模型则使用的是新维度,此时可以考虑将二者结合使用。这个过程的原理和随机森林的原理是一致的,都是从不同维度构建模型并最终投票。这个过程其实也是col sampling的过程,即抽样地进行建模,并最终进行投票。XGBoost算法是支持col sampling的。
image.png

图3-14利用不同数据集构建模型但最终按照投票机制来预测

3.6让模型在训练结束后还能被更新

热启动(Warm Start)和增量学习(Incremental Learning)是常见的模型在训练后还能被更新的技术。

3.6.1热启动

热启动在机器学习算法中经常使用,多被用于回归类算法、决策树类算法以及一些集成学习算法。热启动,顾名思义,就是指建模过程不是从零开始,而且利用之前模型的结果作为本次建模的初始值。这样做的目的是加快建模的收敛速度。实际使用中,对于回归类算法(Lasso、逻辑回归、SGD等),建模过程往往使用0作为初始优化参数,打开热启动后,会使用之前模型中的优化参数作为本次建模的初始值;对于决策树类算法(随机森林、梯度提升树等),建模过程会从空开始构建树,打开热启动后,同样会使用之前模型中构建好的树作为本次构建的开始;对于集成学习(bagging),打开热启动后,会将之前模型中的学习器添加到本次的集成学习的投票选择中。
image.png
本例通过使用iris数据集、逻辑回归算法说明热启动的用法,为了说明问题,将最大迭代次数设置为40。
image.png
首先,不使用热启动,建模到达最大次数,没有收敛而结束。
image.png
打开热启动后,第二次模型训练使用了第一次的结果,迭代了两次后收敛。

3.6.2增量学习

增量学习是一类可以持续不断地读取训练数据,进而不断更新模型的机器学习算法。增量学习具有节省空间、训练时间短等特点。这得益于增量学习无须保存历史数据、可以利用历史训练的结果,常被应用于大规模数据,或者流式数据,这些数据可以各个批次源源不断地送给建模算法,模型被不断刷新。所以,有时增量学习被称为在线(On-line)学习。
增量学习区别于普通的机器学习算法,算法原理上就不相同,在设计算法时,就要考虑并不是全部数据一次性输入模型,而是小批量(mini-batch)数据不断输入。我们借助于scikit-learn算法库,可以看到支持增量学习的算法有多分类的朴素贝叶斯、SGD分类算法、小批量KMeans、增量PCA等,这些算法都提供了partial_fit的建模函数。
image.png
本例通过使用scikit-learn的SGDClassifier分类算法,对iris数据集的前140条数据使用增量学习建模,每10条数据作为一个mini-batch,用后10条数据做预测。对比预测结果和原始值,可以看到10条数据都被正确预测。

3.7多输出预测

当预测模型的输出多于一个目标值时,将这类问题称为多输出(Multioutput)预测。多输出预测与多类别预测是有区别的,图3-15中将多输出和多目标做了一个区分。
多目标的预测(Multi-Class)是指目标值不是二分类,而是多于二的分类(Binary)。针对客户购买理财产品的预测,若是二分类预测就是“客户是否购买贵金属产品”,该模型的目标变量取值为“是/否”。当试图通过一个模型预测“客户会购买贵金属产品,还是会购买基金,或购买定期理财产品”时,这就是一个多目标预测的模型,其目标变量的取值是“贵金属/基金/定期/都不购买”。
image.png

图3-15根据模型输出和类别数对预测模型进行划分

多目标预测其实很早就已经被广泛使用,模型的输出只有一个,即到底购买哪个产品或不购买。若在实际业务场景中需求是“输出一个响应率最高的产品”,那么多目标预测就能完全满足需求。多目标预测的实现方式有One-vs-Rest、One-vs-One、Error-Correcting Output Codes等,这方面的参考材料比较多,此处不再赘述。
但是,若需求是“输出对多个产品的预测,业务人员需要知道每一个产品的响应概率并据此做出业务决策”,则需要多输出多目标(Multioutput-multiclass)或多标签(Multi-Label)的相关技术来完成。
多输出多目标的预测其实可以认为是省略了最终决策机制(大多通过投票来完成)的多目标预测。从具体实现的技术角度上来讲,多输出多目标是将各个预测模型并联起来使用,重点是提供了这种机制,而不是通过类似于One-vs-Rest的方式对预测算法进行改进。

表3-1Multioutput预测的示例

image.png
表3-1中输出的每一个Y列取值若是“是/否”的二分类形式,则属于Multi-Label的范畴。若每一个Y列取值是“贵金属/基金/定期/都不购买”的多目标形式,就是Multioutput-multiclass的范畴。

3.7.1Binary Relevance

最为常用的多输出预测的实现方式是Binary Relevance,也就是用同一个自变量x来分别预测每一个Y列。在scikit-learn中提供了MultiOutputClassifier可以轻松实现Binary Relevance的功能。
image.png
在上述例子中,输出了每一个预测值的概率,其结果如[0.96, 0.04]。基于概率值,就可以实现“基于概率值做出业务决策”的功能。使用者很有可能针对同一个客户选择数个产品进行推荐,因为多输出预测同时输出了数个高响应概率的结果。

3.7.2Classifier Chain

Classifier Chain也是实现多输出模型的重要方式。Binary Relevance可以认为是并行地进行模型预测,目标值之间没有关系;而Classifier Chain可以看作串行进行预测,目标值之间可能存在关系。图3-16中对比了二者的不同。
image.png

图3-16Binary Relevance(左)与Classifier Chain(右)的过程对比

在Classifier Chain中,若目标值y1和y2之间有关系,经常一起出现。当预测模型预测y1会出现时,则若将y1作为预测y2的重要输入,则会显著提高y2的预测精度。这个就是Classifier Chain算法的最重要的特点。
在scikit-learn中,提供了Classifier Chain工具,读者可以非常轻松地进行调用。
image.png

3.7.3Ensemble Classifier Chain

Classifier Chain算法在使用时,容易引起错误在给定的预测顺序传播。比如,当预测y1时准确性较差,然后又用y1的预测值预测y2,用y2预测y3等。在这种情况下,预测失误便在y1-y2-y3间传播,导致最终的预测效果很差。为了解决这个问题,引入了Ensemble Classifier Chain的技术。
Ensemble Classifier Chain的实现过程是随机生成多个Chain,然后分别进行训练,而预测结果则是通过“软投票”的方式来实现的。
image.png
在下面的例子中,我们可以看到,多目标预测、Classifier Chain、Ensemble Classifier Chain之间的效果对比。
在图3-17中,我们发现第二个chain的效果很差,究其原因就是发生了错误传播的问题。而通过“软投票”的Ensemble Classifier Chain则能很好地避免这个问题。
image.png
image.png

图3-17多目标、Classifier Chain、Ensemble Classifier Chain的效果对比

3.8案例:如何给客户从数百个产品中寻找合适的产品

从营销的应用场景来说,基于客户细分的营销是从群体的角度得到“群以类聚”的洞察,然后基于群体特征做出营销决策。若从客户个体视角来产生合适推荐,则需要更关注每个客户个体的实际需求。典型的产品响应模型就是从每个客户个体的角度,产生客户是否会购买的预测,其实也是需求的预测。

3.8.1问题提出

在实际业务场景中,简单的产品响应模型只关注单一产品的高响应率客户的筛选,这往往是不够的。要实现较高水平的数据驱动营销,在实际的工作中还需要解决下面一系列问题:
1)若有较多产品,是否需要构建成百上千个产品响应模型?
2)如何决定产品间的优先级?除了客户经理的对客户需求的理解,类似协同过滤算法如何解决这个问题?
3)产品组合的营销决策如何通过模型计算而得出?
4)如何确定合适的营销时机?如何通过数据挖掘找到合适的营销时机?
5)如何对产品进行定价?
6)如何既满足客户需求也满足银行营销预算、收益的要求?
7)如何评价营销效果?如何关注和量化客户体验?
上述问题只是部分核心要点需要在应用数据分析支持营销时重点解决的。本节我们首先关注第一个问题,即是否需要构建成百上千个产品响应模型?
在营销中构建产品响应模型的目的就是借助其输出找到“高响应概率的客户群然后进行推销”。客户之所以有高响应概率,是因为客户有这方面的需求,在恰当的时机营销便可产生较好的效果。通过数据分析找到客户需求,是产品响应、协同过滤、行为分析(频繁模式挖掘)的众多模型的目标。
银行客户中,能够较多使用金融手段的客户较少,如理财客户占比较少,且对理财产品的选择也比较单一。所以,应用客户相似性来进行理财产品的推荐,也能通过客户分群等手段来实现。金融产品间的相似性很大,基本上都属于“在给定风险预期或条件下如何满足其收益、流动性、期限等需求”。银行间、银行内的各个产品都比较接近,所以通过协同过滤的技术(如计算产品间的相似性等)较少使用。

3.8.2建模思路

好的预测模型之所以效果有保障,是因为该模型能够捕获客户特征及其需求,基于预测的营销决策能够满足客户期望。客户需求是客户是否会响应推荐的最根本的原因。客户往往并没有明确自己的需求是什么,但是当看到某推荐而动心去购买的原因还是其有该方面的需求。
研究客户需求可以采用客户行为角度,也可以采用行为的结果的角度。客户行为的角度就是将客户行为序列作为重点研究对象,如代发工资客户每个月工资一到账便开始各种转账业务,这就是一个典型的行为序列的特征。行为的结果体现在静态的指标上,如资产余额就体现了截至目前客户各种行为的结果。
行为分析模型能根据客户行为预测其行为特征、发现行为规律和模式,对客户旅程地图、营销时机的确定起到非常关键的作用。在第4章将重点介绍这方面的内容,包括采用深度学习的模型。本节我们通过构建Multioutput-Multiclass的产品响应预测,来展示如何同时对众多的产品构建产品响应模型。图3-18展示了两种不同的方法及其作用。
image.png

图3-18研究客户需求的两种典型方法

3.8.3模型训练及应用

我们以银行为例,结合笔者真实实施过的案例,展示一个简单的模型构建过程及构建代码。首先在第一步根据业务经验及数据现状确定自变量的指标范围。
image.png
上述的指标范围只是一个示例,读者可以根据实际应用来调整。下一步就是产生样本数据。在实际实施中一定是提取相关数据,还需要做各种数据质量检查、缺失值补充等各种数据预处理过程。这些过程相对简单,故在本例中不做介绍。
image.png
我们设定100个产品作为目标变量,以10万行客户数据作为训练以及验证样本集。样本集数据按照随机生成的方式来产生,具体的产生过程如下。
image.png
将产生好的数据构建为Data Frame方便后续使用。
image.png
接下来构建目标向量,具体过程如下。
image.png
image.png
生成训练集和验证集,过程如下。
image.png
至此,可以调用Multioutput-multiclass的相关组件来建模了。在本例中,我们采用的是Binary Relevance方法。
image.png
建模结束就可以采用响应的评价指标来验证模型的效果了。
image.png
上述过程从实际业务的角度来看具有巨大的价值。该做法能够“用一个模型产生众多目标的预测”,同时能够部分解决多个产品响应预测模型进行优先级排序问题:单纯的响应概率不足以说服对方推荐该产品的成功率一定高,因为不同算法输出的响应概率只是相对值。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接