导语:预流失用户,即有流失倾向,但还没有开始真正流失的用户。相较于流失用户而言,预流失用户处于观望阶段,或许对现有产品有所顾虑,或许对于潜在的流向(竞品)有所顾虑,或许是在等待些什么;流失用户,即已经流失了的用户,或许是因为游戏弃坑,或许选择了其他产品,用户肯定还在玩些什么,只是不再来你这儿了。文章介绍了如何通过经典的机器学习(Machine Learning, ML)方法来寻找那些流失可能性比较高的用户、寻找那些回流意愿比较大的用户。运营同学针对这些用户就可以重点干预,降低预流失用户比例,拉高用户的回流比例。
背景
在日常游戏运营中,我们常常需要提高目标用户的留存率、提高流失用户的回流率、精准运营、节约运营资源。基于以上的述求,我们将经典机器学习实践于预流失和流失挽回两个场景。
模型整体设计流程图如下:
预流失与流失挽回概述
- 预流失
预流失用户,即有流失倾向,但还没有开始真正流失的用户。相较于流失用户而言,预流失用户处于观望阶段,或许对现有产品有所顾虑,或许对于潜在的流向(竞品)有所顾虑,或许是在等待些什么。
- 流失挽回
流失用户,即已经流失了的用户,或许是因为游戏弃坑,或许选择了其他产品,用户肯定还在玩些什么,只是不再来你这儿了。
获得训练数据
- 基础数据
基础数据是最基础也是最重要的第一步,需要我们去寻找、清洗各种原始数据,原始数据包括用户的登录数据、充值数据和用户数据几个模块。
模型训练自然是数据越多越好的。
- 给用户打标签
预流失,判断用户是否会流失,如果上上周活跃,上周不活跃则是流失用户,label=1;反之上周活跃,则label=0。我们可以以周为单位,读取过去四周、八周或者更多的原始数据。
在流失挽回场景,label的判断逻辑正好相反,如下图所示
准备训练测试数据
- 训练测试数据划分
根据自己的数据集大小合理的划分出三种数据,验证集在训练的时候用于模型调参,测试集在最后的最后模型所有参数设定后用于验证模型效果。
- 正负样本均衡
如果实际数据中正负样本的比例严重不均衡,则有必要处理一下。处理办法是有放回的随机采样,code 示例如下:
正负样本均衡
import random
pos_vs_neg = 1.0
pos_data_count = train_df.filter(train_df[‘ilabel’] == 1).count()
neg_data_count = train_df.filter(train_df[‘ilabel’] == 0).count()
gap = pos_data_count-neg_data_count*pos_vs_neg
print('from ', pos_data_count, neg_data_count, ‘to’, pos_data_count, neg_data_count*pos_vs_neg, ‘gap’, gap)
if gap>0: # 正样本多,取样负样本
data_add = train_df.filter(train_df[‘ilabel’] == 0).sample(True, gap/neg_data_count, random.randint(1, 1000))
train_df = train_df.union(data_add)
elif gap
data_add = train_df.filter(train_df[‘ilabel’] == 1).sample(True, -gap/pos_data_count, random.randint(1, 1000))
train_df = train_df.union(data_add)
print(train_df.filter(train_df[‘ilabel’] == 1).count(), train_df.filter(train_df[‘ilabel’] == 0).count())
print(‘balancing data finish’)
(左滑可查看完整代码,下同)
特征工程
- 特征选取
这里只简单的截取了一些常用到的特征,大家可以根据自己的场景增加各种简单特征、组合特征。日期特征需要注意一下,不同的游戏上线时间不一样、日期格式的数据也不方便运算,比如20181231,20190101,20190102其实都只差一天,但是数值上却差了很大,这里我们直接将日期转换成距今天天数,日期数据数值化,很方便后续的计算处理。