基于移动网络通讯行为的用户风险识别

Prettygirl

发布日期: 2019-06-25 18:08:34 浏览量: 232
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

一、实验内容

参加“基于移动网络通讯行为的用户风险识别”大赛,本次大赛以模拟的语音通话、短信收发、网站及App访问记录等移动网络使用行为为基础,参赛队伍需要通过数据挖掘技术和机器学习算法,构建识别风险用户的预测模型,判别用户属于风险用户的可能性。从而为各行业提供风控保障,助力新时代大数字生态的健康有序发展。

二、实验主要思想与方法

本实验主要根据用户的通话记录、短信记录、网站和APP访问记录的信息,对用户进行分类和预测。
在实验方法介绍分为三部分,第一部分为数据集训练与可视化,第二部分介绍特征提取的主要策略,在第三部分将介绍此次实验使用的LightGBM模型。

2.1 数据集训练与可视化

2.1.1 用户通话记录

用户通话记录数据

通话号码长度分布

不同通话类型所占比例

打入和打出电话所占比例

打入和打出电话不同长度出现次数

打入和打出电话号码不同头部出现次数

每日活跃次数

打入和打出情况下每天的活跃次数

5种不同类型下每天的活跃次数

通话号码不同长度出现次数

已给风险用户的通话号码长度出现次数

通话号码头部出现次数(仅截取主要部分)

已给风险用户通话号码头部出现次数(仅截取主要部分)

2.1.2 用户短信记录

用户短信记录数据

短信号码长度分布

短信号码不同头部出现次数

已给风险用户的短信号码头部出现次数

短信号码不同长度出现次数

已给风险用户的短信号码长度出现次数

接收/发送短信情况下不同短信头部出现次数

接收/发送短信情况下不同短信长度出现次数

2.1.3 用户网站/App访问记录

用户网站/App访问记录数据

用户访问网站/APP分别占的比例

两种类型每日活跃次数

2.2 特征提取

经过对可视化结果的分析,对特征进行如下处理:

  • 通话记录:

    • voice_time:将end_time、start_time转为时间格式并计算通话时长(end_time-start_time);
    • voice_date:取start_time的前两位
  • 短信记录:sms_date:取start_time的前两位。

  • 对已给特征使用常规的提取方法,如取:sum、mean、min、max、median等。

  • 将提取的特征与in_out、call_type、wa_type等进行结合。

  • 多变量进行结合,如:

    1. voice_feature[‘voice_cnt_peruniquecall’]= voice_feature[‘voice_opp_num_unique’]/voice_feature[‘voice_date_cnt’],求每天有通话的号码数量等。

经过以上特征处理,最终得到如下特征:

feature,importance
sms_opp_head_max_in,92
voice_len_mean_in,70
sms_opp_len_mean_in,57
voice_cnt_peruniquecall,56
wa_type1_date_mean,54
wa_dura_sum_percnt,50
wa_type0_namecnt_perday,50
sms_opp_head_min_in,49
voice_head_mean_in,47
sms_opp_head_mean_in,41
sms_opp_len_mean,39
voice_opp_head_min,39
voice_headinunique_perday,37
voice_head_mean_type1,36
wa_type0_dura_perday,36
wa_down_flow_median,35
voice_time_median,35
voice_date_mean_type1,34
voice_timesum_peruniquecall,34
voice_head_mean_out,33
sms_start_time_mean,33
voice_time_min,33
voice_start_mean_in,33
wa_type1_dura_perday,33
voice_head_max_type1,32
wa_namecnt_perday,32
sms_callunique_perday,31
voice_len_max_in,31
voice_start_mean_out,30
sms_calluniquein_mean_perday,30
sms_calluniquein_perday,30
sms_len_perday,30
voice_headoutunique_perday,29
voice_time_mean_out,29
voice_len_mean_type1,29
wa_type1_date_cnt,29
wa_up_flow_median,28
wa_type1_namecnt_perday,28
voice_head_unique_in,28
wa_type0_namedura_perday,28
wa_type0_date_mean,27
voice_headout_perday,27
voice_timeoutmean_percall,26
voice_headin_perday,26
voice_opp_head_mean,26
sms_callcnt_perday,26
wa_visit_date_cnt,26
wa_type1_namevicnt_perday,26
wa_type0_dura_mean,25
voice_opp_head_max,25
voice_date_cnt_in,25
wa_type1_namedura_perday,25
wa_name_count_uinque,24
wa_type0_visitcnt_mean,24
voice_time_max,24
sms_opp_num_count_in,23
wa_type0_date_cnt,23
voice_headmean_peruniquecall,23
wa_type0_namevicnt_perday,23
wa_type1_namevicntall_perday,23
voice_time1mean_percall,23
wa_visit_cnt_mean,23
wa_type1_dura_mean,23
sms_opp_head_max,22
voice_opp_len_max,22
wa_visit_dura_median,22
sms_head_unique_perday,22
voice_cntoutsum_perday,22
voice_opp_unique_in,22
wa_down_flow_mean,22
wa_type1_downflow_mean,22
sms_start_time_mean_in,21
voice_time_mean_type1,21
wa_visitdura_perday,21
wa_up_flow_std,21
voice_time_mean_in,21
sms_opp_len_sum,21
wa_namedura_perday,20
sms_start_time_mean_out,20
wa_type0_up_persec,20
wa_type1_visitcnt_all,20
wa_type0_visitcnt_perday,20
voice_timeoutunique_percall,20
voice_len_mean_out,20
wa_up_flow_max,20
wa_type0_flow_mean,19
voice_cntoutmean_perday,19
voice_timeoutsum_perday,19
voice_head_peruniquecall,19
wa_type1_upflow_mean,19
sms_calluniquemeanout_perday,19
sms_calluniquemeanin_perday,19
wa_type1_visitcnt_perday,19
voice_time_std,19
wa_visitcnt_perday,19
wa_type1_down_percnt,19
wa_flow_sum_perday,19
sms_opp_head_min,19
wa_type0_downflow_all,18
voice_cntinsum_perday,18
wa_type1_flow_mean,18
sms_calluniqueout_mean_perday,18
voice_numcnt3mean_perday,18
wa_type1_name_unique,18
sms_opp_head_mean_out,17
wa_down_flow_std,17
voice_timemean_peruniquecall,17
voice_lenmean_peruniquecall,17
voice_cnt_perday,17
wa_type0_name_unique,17
sms_opp_head_mean,17
voice_timeout_percall,16
voice_opp_unique_out,16
wa_type0_down_perday,16
wa_type0_namevicntall_perday,16
wa_flow,16
sms_date_cnt_in,16
wa_upflowcnt_perday,16
voice_timeinunique_percall,16
sms_opp_len_max,15
wa_up_flow_mean,15
wa_visit_dura_std,15
sms_date_cnt,15
wa_visit_dura_mean,15
voice_numcnt1mean_perday,15
voice_opp_len_mean,15
voice_date_mean_type2,15
voice_len_max_out,15
wa_namevicnt_perday,15
sms_date_mean_in,14
voice_lensum_peruniquecall,14
voice_timeoutsum_percall,14
voice_time_sum_out,14
wa_upflow_perday,14
voice_timeoutmean_perday,14
voice_time_mean_type3,14
wa_type1_visitcnt_mean,14
wa_type0_upflow_mean,14
voice_time_sum_type3,13
wa_downflowcnt_perday,13
wa_type1_up_perday,13
wa_flow_sum_percnt,13
sms_date_cnt_out,13
wa_down_flow_max,13
voice_timemean_percall,13
sms_calluniquecntin_perday,13
voice_timein_percall,13
voice_date_mean_out,12
voice_time_sum_in,12
voice_date_count_type1,12
voice_time_sum_type1,12
voice_date_count_type3,12
wa_type1_up_persec,12
voice_head_mean_type2,12
voice_time1_percall,12
voice_time2_percall,12
voice_time3_percall,12
voice_len_peruniquecall,12
wa_type0_upflow_all,12
wa_flow_sum_persecond,12
wa_type0_down_percnt,12
voice_opp_len_unique,11
wa_type0_visitcnt_all,11
wa_type0_up_perday,11
sms_calluniqueout_perday,11
voice_time3mean_percall,11
wa_down_flow_sum,11
voice_timeinmean_percall,11
wa_visit_cnt_std,11
voice_date_mean_type3,11
voice_date_cnt_out,10
wa_up_flow_sum,10
wa_upflowdura_persec,10
voice_time2mean_percall,10
voice_cntinmean_perday,10
voice_head_mean_type3,10
sms_opp_head_min_out,10
wa_visit_cnt_median,10
wa_visit_cnt_sum,10
voice_timeinsum_perday,10
wa_type0_downflow_mean,9
wa_type1_down_perday,9
sms_opp_num_unique_in,9
wa_visit_dura_sum,9
sms_opp_num_count_unique,8
voice_opp_count_all,8
sms_calluniquecntout_perday,8
voice_date_count_type2,8
sms_date_mean_out,8
voice_date_cnt,8
voice_time_mean_type2,8
voice_time_mean,8
voice_opp_num_unique,8
voice_numcnt1_perday,8
voice_numcnt2mean_perday,8
sms_opp_num_count_out,8
wa_visit_cnt_max,8
wa_type1_upflow_all,7
voice_opp_count_out,7
voice_numcnt2_perday,7
wa_downflowdura_persec,7
voice_headsum_peruniquecall,7
wa_visit_dura_max,7
voice_timeinsum_percall,7
voice_date_mean_in,6
wa_downflow_perday,6
sms_opp_len_mean_out,6
voice_time_sum,6
sms_opp_num_count_all,6
voice_time_percall,6
voice_head_unique_out,6
voice_num_cnt_type1,6
voice_num_cnt_type3,6
voice_opp_head_unique,5
sms_opp_num_unique_out,5
wa_type1_downflow_all,4
voice_len_sum_out,4
sms_opp_head_max_out,4
voice_numcnt3_perday,4
sms_opp_head_unique,3
voice_timeinmean_perday,3
voice_head_max_type3,3
voice_time_sum_type2,2
voice_head_max_type2,2
voice_len_sum_in,2
voice_opp_count_in,2
voice_num_cnt_type2,0

在特征工程中,删除了一些低分的特征,最终确定维数为228。

2.3 LightGBM

LightGBM与其他流行算法采用depth-wise的叶子生长策略不同,其使用的是带深度限制的leaf-wise的叶子生长策略。与depth-wise相比,leaf-wise算法收敛得更快。但leaf-wise的一个缺点就是:参数选择不当可能会产生比较深的决策树从而产生过拟合。因此LightGBM在Leaf-wise上增加了一个最大深度限制,在保证高效率的同时防止过拟合。

在调参方面,由于LightGBM使用的是leaf-wise算法,因此调节使用的是num_leaves控制模型复杂度,大致设置为num_leaves=2^max_depth。另外,min_data_in_leaf参数用于处理过拟合的问题,设置大可以防止过拟合,但需要注意可能会导致欠拟合。

由于特征过多,必须要考虑多过拟合的处理,所以设置较小的num_leavea和max_depth以避免过深的树,同时要设置合适的min_data_in_leaf避免过拟合或欠拟合。

以下为参数设置:

  1. lgb_params = {
  2. 'boosting_type': 'gbdt',
  3. 'objective': 'binary',
  4. 'is_training_metric': False,
  5. 'learning_rate': 0.08,
  6. 'num_leaves':16,
  7. 'max_depth':6,
  8. 'min_data_in_leaf':40,
  9. 'verbosity':-1,
  10. 'is_training_metric':False,
  11. 'feature_fraction': 0.8,
  12. 'bagging_fraction': 0.8,
  13. 'bagging_freq':1,
  14. 'is_unbalance':True
  15. }

三、实验结果

通过特征提取和调整模型参数,提交结果前最终线下测试结果为0.809,线上测试结果为0.760,最终排名142/211。

比赛结果截图:

四、心得体会

本次实训对我来说实际上是一次很大的考验。因为先前既没有python的基础,也没有上过数据挖掘理论课,所以一开始对相关的理论概念一无所知。

在这样的情况下,我从网上的教程一步步开始学习,包括学习python的网站以及在同学推荐下看数据挖掘和机器学习的网课,慢慢摸索。尽管这样,在初赛阶段,写出来的代码和测试结果仍然惨不忍睹(线上测试分数只有0.39)。

后来,在同学的帮助下(包括模型讲解和编码的指导)和参考了助教提供的baseline,逐渐把分数提高,最终有这样的成绩。

可以说现在我依然对数据挖掘相关的理论知识一知半解,仅仅停留在照着葫芦画瓢的阶段。但至少在这个过程中我逐渐熟悉了python的使用,以及一些很实用的python库如numpy、pandas等,还算是有些收获。

上传的附件 cloud_download 基于移动网络通讯行为的用户风险识别.zip ( 950.08kb, 0次下载 )

发送私信

一个月总有那么三十几天不想上班

9
文章数
7
评论数
最近文章
eject