我们在玩游戏的时候,一般都会往账户里面充钱,然而随着时间的推移,一定会有一部分由于种种原因不想玩这些游戏了,此时游戏开发商在合适的时间点对这些用户施加影响,挽留他们。如,通过短信、邮件或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的优势才会体现出来。
领取专属 10元无门槛券
私享最新 技术干货