对比:用两种ML包构建用户流失预警模型,有何异同?

我们在玩游戏的时候,一般都会往账户里面充钱,然而随着时间的推移,一定会有一部分由于种种原因不想玩这些游戏了,此时游戏开发商在合适的时间点对这些用户施加影响,挽留他们。如,通过短信、邮件或APP,利用超低价商品吸引回访或者专属优惠券等,这些策略对于一些流失用户是很有效的。本案例就打造一个用户流失预测模型,预测哪些用户可能会流失,给他们赠送大礼包等来挽留他们,从而使游戏开发商增加利润。

1. 数据的下载

数据的下载地址为

https://github.com/donnemartin/data-science-ipython-notebooks/blob/master/data/churn.csv

关于具体字段的说明这里就不再介绍了,数据的格式如下图所示

2. 使用的分析工具介绍

在本篇文章中我们使用FEA-spk的ML包和FEA的ML包分别进行机器学习案例的实现,大家可以很清晰的看到这两种包是怎么进行机器学习案例的实现的。

3. 使用FEA-spk的具体实现步骤如下

创建spk的连接

spk=@udf df0@sys by spk.open_spark

数据准备和预处理

#加载数据,其中header表示以csv文件的的第一行作为列名,/data/ churn.csv表示hdfs上面的csv文件目录

df1=@udf spk by spk.load_csv with (header,/data/churn.csv)

#将标签列Churn?字段变换为机器学习能够识别的数字

df2=@udf df1 by spk.ML_si with

(inputCol="Churn?", outputCol="label")

#删除经过我们简单分析得到的无用列

df3=@udf df2 by spk.df_drop_col with

(State,Area Code,Phone,Churn?)

#对特征列Int'l Plan,VMail Plan进行变换,将yes/no转化为数字0/1

df4=@udf df3 by spk.ML_si with

(inputCol="Int'l Plan", outputCol="v1")

df5=@udf df4 by spk.ML_si with

(inputCol="VMail Plan", outputCol="v2")

#我们将所有的列转化为double类型,因为Spark机器学习只支持double类型的数据

df5=@udf df5 by spk.ML_double

#查看数据

a=@udf df5 by spk.dump

#将要用到的特征聚合为向量,列名为vec

df6=@udf df5 by spk.ML_va with (inputCols=["Account Length","

VMailMessage","DayMins","Day Calls","Day Charge","Eve Mins",

"Eve Calls","Eve Charge","Night Mins","Night Calls","Night Charge",

"Intl Mins","Intl Calls","Intl Charge","CustServ Calls",

"v1","v2"], outputCol="vec")

#将特征向量进行正则化。不同的特征项有不同的值,如1-2,3万到4万,不同特征间的数值上的巨大差异会影响我们的分析,所以我们需要统一将这些数据压缩到一定的区间上。输出的向量列为features列

df7=@udf df6 by spk.ML_scaler with

(inputCol="vec", outputCol="features")

#选择label,features列进行机器学习

df7=@udf df7 by spk.loc with (features,label)

#查看具有向量结构的数据

a=@udf df7 by spk.ML_MDF

将数据划分为训练集和测试集,其中df7表示需要划分的数据,10.0,1,0分别是训练集和测试集对应的比例,df8表示划分好的训练集,df9表示划分好的测试集,比例为10:1

df8,df9=@udf df7 by spk.tt_split with (10.0,1.0)

选择算法

有了特征数据和标记数据,接下来我们就要选择算法了,FEA-spk支持的分类算法和FEA差不多

训练模型

#对训练集构造不同的分类器模型,选择其中最好的一种分类器

#构造SVM(支持向量机分类器)模型,正则化参数为0.01,最大的迭代次数为100次

model1=@udf df8 by spk.ML_svm with (maxIter=100, regParam=0.01)

#构造Decision Tree (决策树分类器)模型,树的深度为6,maxBins为32

model2= @udf df8 by spk.ML_dt with (maxDepth=6, maxBins=32)

#构建Random Forest (随机森林分类器)模型,树的个数为10棵,树的最大深度为5

model3= @udf df8 by spk.ML_rf with (maxDepth=5, numTrees=10)

模型打分

#对上面的三种分类器进行打分,选取出最好的分类器

score1=@udf df8 by spk.ML_score with (model1@jf)

score2=@udf df8 by spk.ML_score with (model2@jf)

score3=@udf df8 by spk.ML_score with (model3@jf)

#查看评分,选择评分最高的模型

dump score1

dump score2

dump score3

我们可以看到,决策树分类器的打分最高,是96%以上。

#我们首先对测试集进行拆分,拆分为特征列和标签列

df10=@udf df9 by spk.loc with (features)

df11=@udf df9 by spk.loc with (label)

机器预测

#对特征列进行预测,看看是否为可能流失的用户

predict=@udf df10 by spk.ML_predict with (model2@jf)

#查看预测的结果

a=@udf predict by spk.ML_MDF

其中prediction列就是预测的结果,0代表不是流失的用户,1代表是流失的用户

综合评估

#对预测的结果使用准确率进行评估。其中predict表为预测的结果表,df11为包含真实标签的表,accuracy表示准确率

acc=@udf spk,predict,df11 by spk.ML_evaluate with (accuracy)

#查看

dump acc

准确率达到了90%以上

#对预测的结果使用召回率进行评估。其中predict表为预测的结果表,df11为包含真实标签的表,weightedRecall表示召回率

recall=@udf spk,predict,df11 by spk.ML_evaluate with (weightedRecall)

#查看

dump recall

可以看到,召回率也是不错的

4. 使用FEA实现的具体步骤如下

数据准备和预处理

#加载数据

df1=load csv by churn.csv

#将数据划分为包含特征的和包含标签的

df2= @udf df1 by udf0.df_drop_col with (Churn?)

df3= loc df1 by (Churn?)

#将标签转化为0或1数字类型的

df3.Churn? = lambda Churn? by (x:1 if x=='True.' else 0)

#查看数据

dump df3

#删除特征表无用的特征

df2= @udf df2 by udf0.df_drop_col with (State,Area Code,Phone)

#将Int'l Plan列和VMail Plan列都转化为数字0或1

rename df2 as ("Int'l Plan":"v1","VMail Plan":"v2")

df2.v1 = lambda v1 by (x:1 if x=='yes' else 0)

df2.v2 = lambda v2 by (x:1 if x=='yes' else 0)

#对特征数据进行归一化

df4 = @udf df2 by udf0.df_min_max

#将特征表和标签表进行训练集和测试集的划分

result = @udf df4,df3 by ML.tts with (0.3,2016,jf)

其中df4为特征表,df3为标签表,0.3表示测试集所占的百分比,2016是随机因子,jf表示划分后,新的训练集和测试集的DF表所在的工作区。result表保存概要信息的DF表,包含划分后的新训练集和测试集数据对应的DF表名称。result表的格式如下图所示

划分后的表名就是result表中的表名

选择算法

有了特征数据和标记数据,接下来我们就要选择算法了,FEA支持的分类算法有以下几种:

训练模型

#对训练集尝试建立支持向量机,决策树,随机森林不同的分类模型

svm = @udf X0,Y0 by ML.svm

dt = @udf X0,Y0 by ML.dt

rf = @udf X0,Y0 by ML.rf

模型打分

#对建立好的模型进行打分,选择打分最高的模型

svm_score = @udf X0,Y0 by ML.score with (svm@jf)

dt_score = @udf X0,Y0 by ML.score with (dt@jf)

rf_score = @udf X0,Y0 by ML.score with (rf@jf)

#查看结果

dump svm_score

dump dt_score

dump rf_score

可以看到,决策树的模型最好,达到了1,实在有点夸张

机器预测

#对测试集的特征使用训练好的决策树模型进行预测,看看到底属于哪一类

predict = @udf X1 by ML.predict with (dt@jf)

#查看结果

dump predict

综合评估

#对测试集进行模型评估,看看模型在测试集上面的效果如何,这里我们使用ROC面积来衡量,它对正例和负例都有体现

roc_score=@udf Y1,predict by ML.roc_score

#查看结果

dump roc_score

可以看到ROC曲线的面积是0.86,还算是可以的吧。

上面我们介绍了使用FEA和FEA-spk来进行机器学习的案例分析,我们可以看到,大致的处理流程是一致的,而FEA-spk是基于大规模分布式的机器学习,当数据量达到一定级别之后,FEA-spk的优势才会体现出来。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171215G0QDC600?refer=cp_1026

扫码关注云+社区