明略数据梁堰波——Machine learning with Spark ML/MLlib in Finance,DCon2015文字实录


image001.jpg

主持人:我介绍一下梁堰波老师,梁堰波现在是就职于明略数据,是开源软件的贡献者,Apoche 、Hodoop、Spark这两个重量工具的贡献者。是北航毕业的,曾经在雅虎、美团这些大公司都有丰富的大数据的经验,也有很多数据挖掘的经验。梁堰波今天给我们带来的分享主题是《Spark MLLIB》在金融行业的应用。有请梁堰波。

image003.jpg

梁堰波:我这个内容安排在下午是蛮合适的,因为有很多的背景知识我已经不需要介绍了,然后我觉得我今天要讲的一个事情,就是刚才我们360的副总一个把我们东西的背景介绍了,就是我们要做的一个事情,但是不是完全一样的。我先说这个问题,我举一个例子。就是金融行业的一个征信,其实也不能叫征信,就是叫不良贷款的防控,因为我们知道在金融行业里面它最关系的一个问题是什么?就是要控制不良贷款的比例,就是让我们整个不良贷款的比例是最低的,这个因为我们在很多金融行业里面会设置一个专门的职位叫做首席风向官。因为我们知道阿里小额金融它里面最高的职位也是原来化名叫孙权的那个哥们。后来他到阿里做老大。其实我主要讲的这样的一个故事。当然用到我们现在开源里面的一些东西。

image005.jpg

我先说一下这个东西的一个背景知识,就是我们知道是说,这个人贷款它是否可以还上这是一个问题。还有一个问题就是说,因为我们知道这个人贷款能不能还上其实是一个01分类问题。就是我们传统的解决办法,我们根据他的一些情况,因为我们知道每一个贷款的个人或者实体,他都是有很多很多的这种特征的。比如说他有没有房子,有没有车子,当然这种一系列的数据,我们过去传统的解决思路其实就是传统的决策数或者传统的分类算法,然后会得到它高风险的还是一个低风险的,这是一个非常传统的解决思路,当然我们其实在现在的我们这个行业内部,这种思想还是占主流.

image007.jpg

除了这个以外,我们的需求是非常非常多的。就是我们有很多很多,这种更经济话的一个需求。就比如说像这里面说到的,我们其实有的时候要决定,不同的人贷款的周期是不一样的。然后另外一个就是,因为我们但都是金融行业的知识,属于这个行业里面既有的知识,首先我不是搞金融,所以我们做的这个事情,也是学和现知道,这些东西。我们知道央行经常会提,降准或者是降息。比如说你这个银行,具备存贷款多少规模,实际上你是要有一个准备金的。那么这个时候准备金是由什么构成的。它也和你当前的资金流动性是有一定关系的。所以说它其实说白了,他就知道这个人他可能什么时候会还钱,比如说他可能是提前的,还是延后的这样一个问题,然后还有就是,有些人可能会追加这种贷款的额度所以说这个问题,其实把我们刚才说的01分类问题,就是更精细化的去刻画了。

image009.jpg

那这里面其实除了我们刚才说的,一个是更精细化以外,还有一个问题就是说,我们可以看这个,default就是违约的意思,因为我们知道要做分析,做建模,做机器学习,我们都是要有历史数据的,没有数据是没法做分析的,我们会发现我们的实际状况是这样的,就是说有些人他确实发生了违约,就是在某一个时间点,有些人他没有发生违约,他已经还上钱了,这就是我们说的两种情况。常见的情况。就是我们比较好理解的情况。还有一种情况就是这个人他是不是违约我们现在不知道。因为他还款周期还没有到,因为我们知道很多数据是动态的,这种时候这种数据我们叫sister(音)这个时候我们会用到一个,在传统医疗或者零配件生产领域会用到一个算法,就是叫升值分析,这个概念。
当然现在这个概念其实已经是非常非常广了。然后我们简单说一下这个算法。其实我们这个问题大家应该已经清楚了,就是说我们过去要做的事情就是判断这个人是否能还上高信用、低信用。这样的一个概念,然后我们现在希望对他更精细的刻画,说白了,我们希望知道他大概多少年之后能还上。然后或者是他根本就还不是上这样一个概念。所以说其实我们是一个回归问题,如果大家能理解的话,这是一个回归问题。但是他和传统的这种,线型回归其实还不是很一因为线型回归是我们所有的样本都是完整的,这里面会出现很多,随着我们当前的观察点来说,就像这里面(中心数据)它还没有被发生,这样复杂的一个状况,我们其实还是想刻画说,这个到底人到底什么时候能还钱这样的一个问题。
 

image011.jpg

 然后我们这里面提到了这样的一个算法就是生命回归(音)这种算法其实不是一个新东西,就是说它是一个很传统的一个算法,但是现在的问题就是说,我们很多很多的数据量是非常大的。这个算法在我们很多的传统分析软件里面,Spark或者是R里面都是有的,但是他们解决不了的问题,就是我们的数据规模非常大的时间,我们怎么样更好的去刻划,那么其实我可以简单给大家讲一下,就是我们要有这样一个问题,我们说大数据,大数据在学习领域,它不是和我们传统领域的大数据是不一样的。因为如果大家听过刘鹏老师的讲座有一个概念,大家应该特别清楚,就是什么样的问题是大数据问题,什么样的问题不是大数据问题,大数据的问题是说,你如果你采样得到效果是不好的,而只有用更全量或者更大量的数据去解决那这样的问题是一个大数据问题。而另外一种问题就是说,其实你用采样得到的分析解决,其实上和用全量得到的结果是差不多。那么这个时候其实,你不是特别需要去做这个全量的计算,那么经济学里面也有类似这样的问题,就是我们要看这个数据量其实并不是很大。但是如果我们要按照传统的建模方法,对这个东西做建模,就是我们用SARS或者R这样一个方法。比如说像50GB这样一个数据,因为这个是,我们已经做了很多类似的实验,它实际上已经跑不了的了。

image013.jpg

这个时间我们看这个数据量并不是很大,但它的整个问题是很复杂的。这个时候我们就需要做一个我们把它分布式的平台上来做,最合适的一个平台,对机器来说,其实比较同外的是Spark,因为我们有很多比较专用的一个平台,因为我们知道对于大部分人来说,使用门槛是比较重要的,像Spark来说,他提供这种API还有这种语义都是比较丰富的,所以大家使用起来可能会相对容易一点。那么这是一个什么样的问题,我这个PPT,数据表达简单介绍,就是线性回归两个概念,一个是Feature,一个向量表示各种各样的Feature,它纬度可能很高,然后另外一个是lable,就是它的标签,比如说它的值是多少,那么这个里面我们会多出来一个东西,就是说它是不是已经发生了。偶然会多一列,在这个基础上,大家可能看一下这个公式,靠这个公式其实可以理解,如果大家如果对我们传统的统计学的一个概念,GRM有概念的话,它其实是一个多层分布的GRM。那么其实现在对于这个问题来说,我们要想解决这个问题,其实也非常非常多的办法。因为我们知道刚才已经提到了,很多传统软件里面,都是有模型。
    但实际上如果把它放到方步式上来说,那其实我们要考虑它的效率对吧。对于这个来说,多层分布的来说,它上面会转化成一个,我们想这个在这里Spark是怎么做的,我们现在Spark里面有两个linerrjection(58:02)的事件,我们推荐大家用ML包里的因为那个是更准确的。因为它的结果和R的GM是完全匹配的。
然后我们看这个,如果我们对这个问题在分布式来解,这个其实分布式去解一些机器学习问题,最常用的办法就是我们要得到它的两个函数,一个LOSS  FUNCTION一个gradient function,对吧,那么这两个函数我们就梯度下降,这是最最最常用的一个方法。其实这个我们从最开始的思路也是这样的,我们通过这个公式其实可以得到我们的两类函数。
 

image015.jpg

一个是一个LOSS  FUNCTION一个gradient function,大家可以看一下这两个公式,细节还是不说了。就是我什么样的算法能够在这个Spark里面,比好的一个结果,但是我们说的这个,它如果做一个专用的平台的话,它都会有更好的算法,但是我们现在提的是一个相对比较通用的一个平台。大家可以看两个公式,就是LOSS  FUNCTION和gradient function,我可以给大家介绍一下,这个公式可以可以推导成一个前面带a(西格玛)的一种格式。其实它显然在Spark上就会非常非常好的,能够运转,这个其实怎么理解呢,就是大家可以想一想。

image017.jpg

就是我们看这个图,就知道了,这个其实代表了Spark里面一类算法的实现,就是我们要做的事情第一步我们会初始化一个vs(音)叫系数,就是我们的系数,初始化以后我们就把每个FUNCTION丢到每个execter上去执行。大家可以看这个东西,它实际上分布在每个execter上的。那么在执行之后,我们会把这个结果放在这上面,大家可以看一下,如果我们的这个LOSS  FUNCTION和gradient function,都是有这种带a的格式,然后直接丢掉每一个execter上去执行了,然后我们回来那个结果,去做汇总。就是我们这样的一个结算逻辑,汇总之后通过这个LBFGS去找到下一步的一个计算。这个是我们对于目前主流的分布式计算框架里面实现传统的算法的一个主流的思路。一系列都是这样的一个思路这个思路其实大概看一下,它的区别它是同步的。这是很大的一个特点,所以说通过这个我们就可以实现,我们这样的一个预算,因为我们现在提到了这个是,用LOSS  FUNCTION和gradient function的思路。

image019.jpg

其实还有一个思路就是我们刚才说的,大家可以看这个公式,这个公式我刚才说了一个多层分布的GRM算法,我们可以用这个理来做,但是这个社区还没有做完这个东西,这个是为什么,这个大家可以知道,GRM算法,最底下是通过几个方程来做的,因为我们这个算法大家可以看到,就是我们解决这个问题的这算法其实是一个迭代式的。

image020.jpg

我们知道算一遍之后,然后再算然后再算我们可能迭代上万轮迭代,而且这个其实对于常见的机器学习我们都是要迭代很多很多轮的。这个问题其实我们做过都知道。然后我们是不是有更好的算法,就是我们通过解方程的思路,能去优化这样一个函数。Spark里面有这样的一个实现就是说,像我们这样的一个算法,大概要跑大概一万轮,或者几千轮,这都是很正常,因为我们最后看我们数据量的情况,优化要有一个数量的结果。

image021.jpg

我们知道算一遍之后,然后再算然后再算我们可能迭代上万轮迭代,而且这个其实对于常见的机器学习我们都是要迭代很多很多轮的。这个问题其实我们做过都知道。然后我们是不是有更好的算法,就是我们通过解方程的思路,能去优化这样一个函数。Spark里面有这样的一个实现就是说,像我们这样的一个算法,大概要跑大概一万轮,或者几千轮,这都是很正常,因为我们最后看我们数据量的情况,优化要有一个数量的结果。

image022.jpg

这个做完了之后我们就要看一下,我们这个结果了。因为我们不能做了一个东西就摆在那,也不知道它对不对然后这个东西有两个结果我们需要去考虑,第一个结果就是说,我们是不是保证它是对的,那么对的话,我们就选择了152888个,一个数据集,这是一个OEN的数据集。然后它能够用R去处理,然后另外一个是80万的一个数据,然后它是不能在阿里数据处理的。这个做法就是上面的那个数据是为了给了比较结果,就是我们这个结果是不是和R出来的是完全一致的。因为有可能我们的算法是错的。
另外一个就是我们80G的数据我们考虑的是我们算法是能够在这种分布式的环境和R上去运用的。然后另外一个问题就是说,我们除了这个我们,能够处理以外,其实我们还要考虑一下,我们最开说的那一点,传统的二分它的高风险还是低风险,这种思路去比较一下我们这个效果,我们更精细的扩化是不是更准,因为我们知道经常很多这种你做一个更精细化的刻画,它得到的结果可能不一定是很好的。但这个其实也依赖于数据。然后我们要定一个规则,就是怎么把二分和我们这种思路做比较。这就是一个规则,比如说你轨估计的时机,这个时机是不是比我们的时机要长或者要短,然后去评价一个good或者bad。这个时候就和我们二分联系起来了,大家可以看一下,首先看结果。
 

image023.jpg

 先看这个结果,我们刚刚说这是两个数据集,第一个数据和第二个数据,然后我们从两个指标上去统计,第一个是传统的,传统的ROC和AUC去做必要,所以我们要去从各角度去衡量,另外一个就是KS统计。这个大家可以很清晰的看出来,因为我们这个是一个版本的结果,我们的结果和R的结果是完全匹配的。在小数据量级上,因为我们得到的是一个系数,这个系数我们都看多在小数点后6位都是完全的一致的。因为我们整个实验的数学逻辑是一样的。这是第一个点。
第二各点就是我们在数据量更大的时候R是跑不了的另外一个就是Logistic  regression和survival  regression这两个比较,我们同时都是比较的R的,和Spark的。这个大家可以看,前两行的左边这四个格子,和后面这四个格子其实是完全一样的。这是为什么?是因为R的Logistic  regression和Spark的ML的Logistic  regression是完全一样的,产生的结果是完全一样的第二个也是完全一样的。所以说在上一个结果是非常完整的匹配了这个东西。所以这就是我们说的在我们的传统行业里面遇到的某个问题。然后它使用的解决的一个方法。

image025.jpg

然后其实这里面还是有一些挑战的就是说,这个挑战可能是我们后面需要做的很多事情。帮助我们去解决,它实际上是有它的局限性的,就是说比如说一般情况偶然这个时间不会选的太长,因为选的太长它就不符合我们这个GRM假设了。这是一个情况。
第二个情况大家都会遇到,就是正负比的不一致,这是太正常。这个也是一个问题。
 

image027.jpg

然后我觉得这个问题我们已经讨论清楚了就是说这是一个我们用Spark很好的去解决问题。而且也是它解决了传统单一解决不了的一个点。然后它其实,谈了好多其实它有优点也有缺点,它的缺点,就是,这个结果是一个OPEN的数据集。大家可以在网上去找。可以看一下,其实蛮有意思,就是什么样的人信用风险更高和更低。就是像这个就是他有没有固定电话。这是一个很好的结果,他有固定电话就有房子,可以这么理解。然后就是他这个概念和我们不太匹配,有没有,如果没有,那么他的风险是蛮高的,后面两个,你上过更多的,他们已经不是特别大了。5年以下风险挺高的,但是中国不怕,他都敢给学生推销信用卡。我们中国银行,比较厉害,因为最后是10有8、9是政府印钱。最后这个其实蛮有意思的,就是你不是在同一个银行会有帐号,这个很好理解,因为你如果在同一个银行有帐号,的话,实际上我是知道你另外帐号的信息的。另外一个是没有。实际上这个纬度举例子。

image029.jpg

这个问题我们已经是可以解决类似的问题了。然后我们现在讨论的点就是说,我们做系统,只是讲了一个算法,整个来说是一个核心但是大家知道工作挑战比较大的不是做算法,或是准备和处理,就是做各种各样的数据预处理的工作,比如说这样的纬度转化成那样的纬度。那么这个时候因为我在去年,在上一家公司的时候,就是做过类似的事情,即使是说我们像Spark提供了一个很好的API,但是代码如果是你写的,完全是自己实现,你写的然后你过段时间可能自己都不知道,这是哪几个纬度,另外到新的纬度了,这个时候是不是说,我们是需要更好一个ONLINE的一个工具,看一下我们这个过程分成过程。

image030.jpg

最开始异常数据剔除,有效数据验证,因为我们知道传统行业,它的实际上对数据的生产过程是相对比较严谨的。另外,它要分最,相对的数据剔除,因为我们不希望有很多相关纬度,那个信息量冗余。
    另外就是最常见的几个例子。比如说我们有一个纬度是新兴级,它原来可能是1234567,这样就是不合理的,因为它是一个数据型的变量。所以对这样类型的数据,我们把它用到7个纬度,你到底哪一天发生的这个事情,另外一另外我不需要影响一个纬度,可能影响两个纬度,这个是有很多业务解释的言但是它其实,最后思路是一样。
    最后我们还需要把这些Feature组合在一起,因为丢在模型里面是一个,还有一个工作是我们有很多模型的参数,正则话、因子,这一系列的参数,那么我们怎么选择一个最好的参数,Feature应该用哪些纬度,这个时候我们过去传统的方法是什么,就是自己去实验一些框架,然后把这些参数丢进去配,来使用。因为有这样的问题,所以Spark已经给我们提供了一个雏形的东西,相对要简单介绍一下。
 

image032.jpg

一个叫是个过程,是我们数据员有很多很多hive。传统的DB,日志,我们要做清晰、转化、剔除不合理的数据,然后但我们传统行业在这方面跟互联网不一样,传统行业数据可能会少一点。但是思路是一致的。然后我们会有各种各样乐观转化。我们转化一系列的东西,最后丢到不同的领域里面,怎么样配合这个模型是非常非常品类非常多的。常见的时候大家都搞不清楚的时候,就先丢到一个GBDT里去做。
我们都是这样一个需求的,然后我们还要做评价,到底是哪个模型更好,这个评价往往是从,技术的角度就是计算模型的指标的标度,它不包括业务的角度,因为我们知道实际上,技术的角度和解出来的模型并不一定在业务上100%匹配的这个时候可能还有第二个检验。所以我们第一步要先从技术角度,分类问题要优先考虑指标。一系列的指标,是更好好还是个更低好,我们需要一个衡量,然后在不同的模型里面帮我们选出我们优先考虑的指标。然后帮我们选出最好的。Spark,它可以做这样的事情,它有三个抽象。
 

image034.jpg

大家可以举例转化,Feature的转化,就是模型也是,但是模型现在的算法不是。那么另外就是定一些指标告诉你说,我们什么样的模型是更好的,就比如说是更高好,还是越低越好,这是我们先通过这种方式选择一批。

image036.jpg

然后可以看一下这个例子,简单介绍一下,就是常见的,它是怎么做的,Spark有非常非常多的外部的数据源然后加进来。然后最重要的一点,就是大家看底下这个,因为我们知道。是我们做机器学习的通用的一个格式。它有直接接口。STF,出来。这个大家回去自己看。

image038.jpg

我们是做需要不同的调整的,调整完了之后我们再重现,我们最开始做学习,肯定不上来拿迁量数据去做测试,我们肯定拿不一份数据,当我们这个模型调到最好的时候,我们可以直接把这个代码,拿回去放在全部的数据上去跑。然后大家可以看这个。

image040.jpg

基本上没有一个组建出来,设计一些参数,就可以把我们这个事情,做完了,然后这个事做完了以后,下一个问题,就是我们说的,很多参数怎么选,建立好以后,我们要选择一个参数的组合。这个怎么选择。

image042.jpg

大家可以看这个例子,假如我们这个PiPeLine只有两步骤,每个步骤里面有三个参数可能选,这已经是非常简化的一个问题了,然后我们相当于是有9种可能,九分之一是我们作最好的,对吧,那这个时候,我们过去怎么做的,我不知道大家怎么做的,我们是自己去实现一个简单的类似这样的一个框架,现在在Spark里面就直接帮我们做这个事了大家可以直接看这个代码。

image044.jpg

我就直接给大家讲代码了,比较简单的,就是我们会Gread,它可能这是一个参数,这种有选择也三个,正各化可能有两个。我们有这种种可能,然后我们丢到一个,大家做机器的都知道,就是我们刚才的,这个时候才设定参数的硬性,帮我们在九中可能里面选择最好的,最后这个时候就自动合成的是最好的模型。所以这个工作我觉得还是非常简洁的。

image046.jpg

最后简单介绍一下现在已经有的,我觉得通过这个。Spark里面已经有了。

image048.jpg

对应组建大家都知道,算法也主流的。都是有的。

image050.jpg

我们重点说,WLS,右下角那个,就是我们对于节GOM类的算法,各种各样的不同的family不同的分布。然后我们都可以对于用这种只过一遍数据的方法,这个现在是非常迅速的会得到这样一个结果,另外一个就是,我这个算法像GRM是和R是完全匹配的,我们过去对R说,我们这样的一个接口,然后做这样的事情。好的,内容就是到这。

image052.jpg

最后是一个简单的总结,我觉得大家对于MLDIB的关注度其实不是特别特别多,这个是客观的现实,因为我知道机器学习,其实还毕竟是大部分,我们现在大数据里面更多的还是做数据转化处理查询这些更多,有了前面那一部分,后面才会有的,一个功能,然后建模,所以说我觉得现在这个,我们社区贡献是蛮的,然后我们也是一个比较核心的贡献者,另外我们也在招聘,如果大家得相对的工作感兴趣可以联系。谢谢大家。
 

要回复问题请先登录注册