版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据说明与存储主讲:李强任务描述用户画像是根据用户社会属性、生活习惯和消费行为等信息而抽象出的一个标签化的用户模型。构建用户画像的核心工作即是给用户贴“标签”,而标签是通过对用户信息分析而来的高度精炼的特征标识。用户画像中的一个标签为用户是否值得挽留,该标签的计算规则比较复杂,并非通过统计用户的数据获得,而是需要建立模型并根据指定的特征进行预测。常用于分类、预测是与否(0/1)事件的模型是SVM模型,SVM(SupportVectorMac)又称为支持向量机,是一种较好的二分类模型。本小节将对广电大数据用户数据建立SVM模型,并进行模型评估和预测,然后基于前几节的探索分析与模型预测结果构建广电用户画像。任务分析本小节的构建SVM预测模型与用户画像的实现流程如下。(1)构建特征列和标签列数据。(2)构建SVM模型,评价模型效果,然后预测用户是否挽留。(3)构建用户画像。11.3.1构建特征列和标签列数据构建特征列和标签列数据在预处理后的数据中没有算法模型可识别出来的特征列和标签列,所以为了后续模型的构建,此小节需要对预处理后的数据进行构建特征列和标签列。(1)根据用户月均消费金额,每个用户的入网时长,每个用户平均每天看多久电视构建特征列,具体实现如代码11-28、代码11-29、代码11-30和代码11-31所示。代码11-28统计每个用户的月均消费金额valbillevents=hiveContext.sql("selectphone_no,sum(should_pay)/3asconsumefromuser_profile.mmconsume_billevent_processwheresm_namenotlike'%珠江宽频%'groupbyphone_no")代码11-29统计每个用户的入网时长valuserevents=hiveContext.sql("selectphone_no,max(months_between(current_date(),run_time)/12)join_timefromuser_profile.mediamatch_userevent_processgroupbyphone_no")代码11-30统计每个用户平均每次看多少小时电视valmedia_index=hiveContext.sql("selectphone_no,(sum(media.duration)/(1000*60*60))/count(1)ascount_durationfromuser_profile.media_index_processmediagroupbyphone_no")代码11-31通过join将表连接valbillevents_userevents_media=billevents.join(userevents,Seq("phone_no")).join(media_index,Seq("phone_no"))billevents_userevents_media.show(5)构建特征列和标签列数据特征列如图11-37所示。图11-37特征列构建特征列和标签列数据(2)根据mediamatch_usermsg选出run_name字段为主动暂停或主动销户的用户并贴上类别0,0代表用户为不挽留用户;根据mediamatch_usermsg选出run_name字段为正常并且是活跃的用户贴上类别1,1代表用户为挽留用户,具体实现如下。选取一个月的数据,汇总得到总观看时长大于18936000的用户,如代码11-32所示。代码11-32观看时长大于18936000的用户valmsg=hiveContext.sql("selectdistinctphone_no,0ascol1fromuser_profile.mediamatch_usermsg_process")valmediaIndex=hiveContext.sql("selectphone_no,sum(duration)astotal_one_month_secondsfromuser_profile.media_index_processwhereorigin_time>=add_months('2018-08-0100:00:00',-1)groupbyphone_nohavingtotal_one_month_seconds>18936000").select("phone_no","total_one_month_seconds")将order_index字段过滤掉run_name等于“正常”的数据;offername过滤掉包含以下关键字“废”“赠送”“免费体验”“提速”“提价”“转网优惠”“测试”“虚拟”“空包”的数据,如代码11-33所示。代码11-33过滤关键字valorderIndexTV=hiveContext.sql("select*fromuser_profile.order_index_processwhererun_name='正常'andoffername!='废'andoffername!='赠送'andoffername!='免费体验'andoffername!='提速'andoffername!='提价'andoffername!='转网优惠'andoffername!='虚拟'andoffername!='空包'andoffernamenotlike'%宽带%'").select("phone_no").distinct()构建特征列和标签列数据通过join连接表获得活跃用户,如代码11-34所示。代码11-34连接表valmedia_order=mediaIndex.join(orderIndexTV,Seq("phone_no"),"inner").selectExpr("phone_no","1ascol2").distinct()valmsg_media_order=msg.join(media_order,Seq("phone_no"),"left_outer").na.fill(0).selectExpr("phone_no","col2ascol1")筛选掉包含“珠江宽频”的数据,通过join将表连接并给活跃用户贴上标签1,不活跃用户贴上标签0,如代码11-35所示。代码11-35贴标签valbillevents=hiveContext.sql("selectphone_no,sum(should_pay)/3consumefromuser_profile.mmconsume_billevent_processwheresm_namenotlike'%珠江宽频%'groupbyphone_no")valuserevents=hiveContext.sql("selectphone_no,max(months_between(current_date(),run_time)/12)join_timefromuser_profile.mediamatch_userevent_processgroupbyphone_no")valmedia_index=hiveContext.sql("selectphone_no,(sum(media.duration)/(1000*60*60))/count(1)ascount_durationfromuser_profile.media_index_processmediagroupbyphone_no")valbillevents_userevents_media=billevents.join(userevents,Seq("phone_no")).join(media_index,Seq("phone_no"))......省略构建特征列和标签列数据构建好的数据如图11-38所示。通过得到了一份DataFrame的数据unionData,数据中包含了5个字段,分别为用户ID、电视消费水平、电视入网时长、电视依赖度、类别。后续可利用这份数据来进行SVM建模。图11-38构建的数据集11.3.2SVM预测用户是否挽留SVM预测用户是否挽留基于11.3.1小节处理后含有特征列和标签列的数据集,在构建模型之前,还需将特征列数据转化成RDD[LabelPoint]类型,消除量纲影响,对数据做标准化处理,然后对数据集划分,再来构建SVM模型,对模型效果进行评价,最后使用构建好的模型预测用户是否挽留。(1)对特征列数据做标准化处理,为了后面对模型进行评估,根据二八原则将标准化数据划分成训练集和验证集,用训练集来建立模型,验证集用来评价模型,具体实现如代码11-36所示。模型建立如图11-39所示。代码11-36建立SVM模型importorg.apache.spark.mllib.regression.LabeledPointimportorg.apache.spark.mllib.linalg.Vectorsimportorg.apache.spark.mllib.feature.StandardScalervaltraindata=unionData.select("consume","join_time","count_duration").rdd.zip(unionData.select("label").rdd).map(x=>LabeledPoint(x._2.get(0).toString.toDouble,Vectors.dense(x._1.toSeq.toArray.map(_.toString.toDouble))))......省略图11-39SVM模型的建立SVM预测用户是否挽留(2)使用验证集来验证模型的效果,计算模型的准确率、AUROC值和AUPRC值,具体实现如代码11-37所示。代码11-37模型评价importorg.apache.spark.mllib.evaluation.BinaryClassificationMetricsimportorg.apache.spark.sql.types.{DoubleType,StringType,StructField,StructType}importorg.apache.spark.sql.RowvalpredictAndLabel=validate_data.map(row=>{valpredict=model.predict(row.features)......省略图11-40模型的评估模型效果如图11-40所示。从代码11-37的计算结果可知,模型的准确率大概是0.46875,ROC曲线下的面积(AUROC值)大概是0.7258,PR曲线下的面积(AUPRC)大概是0.9914。一般情况下,ROC曲线下的面积的取值范围在0.5到1之间,面积值越大说明分类效果越好。SVM预测用户是否挽留(3)将billevents_userevents_media数据(测试数据)做一步转换,转换成RDD[(String,Vector)]类型,并取出RDD中的Vector数据作为predict的输入参数,具体实现如代码11-38所示。模型预测结果如图11-41所示。代码11-38模型预测valtest_data=billevents_userevents_media.select("phone_no").rdd.zip(billevents_userevents_media.select("consume","join_time","count_duration").rdd).map(x=>(x._1.get(0).toString,Vectors.dense(x._2.toSeq.toArray.map(_.toString.toDouble))))valpredictData=test_data.map(row=>{valpredict=model.predict(row._2)Row(row._1,row._2(0),row._2(1),row._2(2),predict)})......省略图11-41模型预测的结果11.3.3构建用户画像1.消费内容选择phone_no、fee_code字段并去重;根据fee_code字段来贴标签,标签规则如下。(1)fee_code=0J或0B或OY则标签为直播;(2)fee_code=0X则标签为应用;(3)fee_code=0T则标签为付费频道;(4)fee_code=0W或0L或0Z或0K则标签为宽带;(5)fee_code=0D则标签为点播fee_code=0H则标签为回看;(6)fee_code=0U则标签为有线电视收视费。代码11-39消费内容标签实现代码hiveContext.sql("selectdistinctphone_no,casewhenfee_code='0J'orfee_code='0B'orfee_code='0Y'then'直播'whenfee_code='0X'then'应用'whenfee_code='0T'then'付费频道'whenfee_code='0W'orfee_code='0L'orfee_code='0Z'orfee_code='0K'then'宽带'whenfee_code='0D'then'点播'whenfee_code='0H'then'回看'whenfee_code='0U'then'有线电视收视费'endaslabel,'消费内容'asparent_labelfromuser_profile.mmconsume_billevent_process").show(5)图11-42消费内容用户画像2.电视消费水平根据sm_name字段不包含珠江宽频筛选出电视的数据;计算个月数据中should_pay-favour_fee的月平均值X,标签规则如下。(1)如果-26.3<X<26.3则贴上电视超低消费标签;(2)如果26.3≤X<26.3+20则贴上电视低消费;(3)如果26.3+20≤X<26.3+40则贴上电视中等消费;(4)如果X≥26.3+40则贴上电视高消费标签。代码11-40电视消费水平标签实现代码hiveContext.sql("selectt2.phone_no,casewhenfee_per_month>-26.3andfee_per_month<26.3then'电视超低消费'whenfee_per_month>=26.3andfee_per_month<46.3then'电视低消费'whenfee_per_month>=46.3andfee_per_month<66.3then'电视中等消费'when66.3<=fee_per_monththen'电视高消费'endaslabel,'电视消费水平'asparent_labelfrom(selectt1.phone_no,sum(real_pay)/3asfee_per_monthfrom(selectphone_no,nvl(should_pay,0)-nvl(favour_fee,0)asreal_payfromuser_profile.mmconsume_billevent_processwheresm_namelike'%电视%')t1groupbyt1.phone_no)t2").show(5)图11-43电视消费水平用户画像3.宽带消费水平根据sm_name包含珠江宽频筛选宽带的数据,计算3个月数据should_pay-favour_fee的月平均值Y,标签规则如下。(1)如果Y≤29则贴上宽带低消费标签;(2)如果29<Y≤48则贴上宽带中消费;(3)如果Y>48则贴上宽带高消费。实现代码如代码11-41所示。宽带消费水平用户画像如图11-44所示。代码11-41宽带消费水平标签实现代码hiveContext.sql("selectt2.phone_no,casewhenfee_per_month<=29then'宽带低消费'whenfee_per_month>29andfee_per_month<=48then'宽带中消费'whenfee_per_month>48then'宽带高消费'endaslabel,'宽带消费水平'asparent_labelfrom(selectt1.phone_no,sum(real_pay)/3asfee_per_monthfrom(selectphone_no,nvl(should_pay,0)-nvl(favour_fee,0)asreal_payfromuser_profile.mmconsume_billevent_processwheresm_name='珠江宽频')t1groupbyt1.phone_no)t2").show(5)图11-44宽带消费水平用户画像4.宽带产品带宽根据sm_name='珠江宽频'来筛选宽带的用户;根据字段phone_no进行分组,取optdate最大且effdate≤当前时间≤expdate的数据;根据prodname字段确定标签,prodname字段的值即为标签名称,如代码11-42所示。宽带产品带宽用户画像如图11-45所示。代码11-42宽带产品带宽标签实现代码hiveContext.sql("selectb.phone_no,casewhenprodname=prodnamethenprodnameendaslabel,'带产品带宽'asparent_labelfrom(selecta.phone_no,a.optdate,dname,a.sm_name,row_number()over(partitionbya.phone_noorderbya.optdatedesc)rankfrom(selectphone_no,prodname,expdate,optdate,sm_namefromuser_profile.order_index_processwhereeffdate<from_unixtime(unix_timestamp(),'yyyy-MM-ddHH:mm:ss')andfrom_unixtime(unix_timestamp(),'yyyy-MM-ddHH:mm:ss')<expdate)a)bwhereb.rank=1andb.sm_name='珠江宽频'").show(5)图11-45宽带产品带宽用户画像5.销售品名称过滤cost小于等于0的数据,且offername不包含空包的记录;根据sm_name区分电视和宽带,sm_name='珠江宽频'的为宽带,sm_name不包含珠江宽频的为电视,标签规则如下。(1)电视主销售品:找出mode_time='Y',offertype=0,prodstatus='YY'且effdate≤当前时间≤expdate且optdate最大的数据;(2)电视附属销售品:找出mode_time='Y',offertype=0,prodstatus='YY'且effdate≤当前时间≤expdate的数据。(3)宽带:找出effdate≤当前时间≤expdate的且optdate最大的数据。筛选出来的数据选择phone_no、offername字段并去重,然后根据offername字段贴标签,实现代码如代码11-43所示。代码11-43销售品名称标签实现代码hiveContext.sql("selectphone_no,casewhenoffername=offernamethenoffernameendaslabel,'销售品名称'asparent_labelfrom(selectphone_no,offernamefrom(selectt2.phone_no,t2.optdate,t2.offername,row_number()over(partitionbyt2.phone_noorderbyt2.optdatedesc)rankfrom(selectt1.phone_no,t1.offername,t1.optdatefrom(select*from......省略图11-46销售品名称用户画像6.业务品牌选择phone_no,sm_name字段并去重,删除sm_name='模拟有线电视'或'番通'的数据,根据sm_name字段来贴标签,标签规则如下。(1)若sm_name='互动电视'则标签为互动电视;(2)若sm_name='数字电视'则标签为数字电视;(3)若sm_name='甜果电视'则标签为甜果电视;(4)若sm_name='珠江宽频'则标签为珠江宽频。实现代码如代码11-44所示。代码11-44业务品牌标签实现代码hiveContext.sql("selectphone_no,casewhensm_name='互动电视'then'互动电视'whensm_name='数字电视'then'数字电视'whensm_name='甜果电视'then'甜果电视'whensm_name='珠江宽频'then'珠江宽频'endaslabel,'业务品牌'asparent_labelfromuser_profile.mediamatch_usermsg_processwheresm_namenotlike'%模拟有线电视%'orsm_namenotlike'%番通%'").show(5)图11-47业务品牌用户画像7.电视入网程度筛选sm_name包含“互动”甜果”“数字”的记录。根据phone_no字段来分组,找出open_time(用户开户时间)字段与当前时间作比差得到T(单位:年),标签规则如下。(1)若T>13则标签为老用户;(2)若T≤9则标签为新用户;(3)若9<T≤13则标签为中等用户。实现代码如代码11-45所示。电视入网程度用户画像如图11-48所示。代码11-45电视入网程度标签实现代码hiveContext.sql("selectt1.phone_no,casewhenT>13then'老用户'whenT>9andT<=13then'中等用户'whenT<=9then'新用户'endaslabel,'电视入网程度'asparent_labelfrom(selectphone_no,max(datediff(current_date(),open_time)/365)asTfromuser_profile.mediamatch_usermsg_processwheresm_namelike'%电视%'andopen_timeisnotNULLgroupbyphone_no)t1").show(5)图11-48电视入网程度用户画像8.宽带入网程度选择sm_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 话题英语作文400字汇编五篇
- 金融心理账户
- 大学学生实习报告范文汇编9篇
- 安全环保的工作总结
- 小学生自我介绍(集锦15篇)
- 建团100周年演讲稿400字10篇
- 标准工程工程合同-5篇
- 高中军训个人体会600字
- 汽车销售转正工作总结
- 地质工程实习报告范文集合十篇
- GB/T 2467.2-1996硫铁矿和硫精矿中铅含量的测定第2部分:示波极谱法
- 第二章蚁群算法
- 【原创课件】中班音乐游戏:《老鼠今天真快乐》PPT
- 关于水资源的开发利用
- 药物临床试验培训课件
- 《夏天里的成长》说课稿 省赛一等奖
- 部编版六年级上册语文 期末复习课件(按专题分类复习)
- 第三单元教学设计及实践 课件 统编版高中语文选择性必修中册
- 某车间的供配电系统设计
- 电缆行业业务人员入门培训基础知识电缆知识
- 名师工作室主持人交流表态发言稿
评论
0/150
提交评论