手游付费预测 · 高价值用户识别

付费用户只占 2%、收入高度集中——在用户注册后 7 天,提前识别「谁会付费、谁是鲸鱼」,把运营资源投给对的人。
228.8 万真实玩家 · tap4fun《野蛮时代》DataCastle 2018
数据边界:付费金额为真实充值流水,无任何合成;建模特征已主动剔除 pay_count(数据泄漏),PR-AUC 为去泄漏后的真实信号。
付费率 · 前 7 日注册用户
1.81%
41,439 / 2,288,007
ARPPU · 前 7 日付费者人均
29.52
ARPU 0.53 元
鲸鱼收入占比
42.1%
前 1% 付费者贡献 · TOP10% 占 80.3%
PR-AUC · 去泄漏后
0.082
基线 2.3% 的 3.6 倍 · top10% 覆盖 40.4%

收入长尾 · 付费者按付费金额十等分

前 10% 付费者贡献 80.3% 流水,后 50% 只占 2.1% —— 典型长尾,运营必须定向头部
最顶端的 1% 付费者(415 人)就贡献了 42.1% 流水 → 鲸鱼识别是资源分配的关键。

价值分层 · 人数占比

付费者内部:鲸鱼 1% / 海豚 9% / 小鱼 90%(付费者仅占全体 1.81%)

价值分层 · 收入占比

鲸鱼 415 人贡献 51.5 万 —— 前 1% 占 42.1% 流水,少而贵

付费 vs 非付费 · 前 7 日行为

付费者行为 = 非付费者的多少倍,注册后 7 天已明显分化
在线时长 非付费 7.8 → 付费 140.2 分钟(17.9×)· PVP 参战 1.7 → 25.2(14.6×)· PVP 胜场 0.7 → 18.3(27.5×)· PVE 参战 2.1 → 41.0(19.1×)· PVE 胜场 1.9 → 37.4(19.5×)

特征重要性 · 什么早期行为最能预测付费(排名)

在线时长断层第一(53.7%),在线 + PVE 参与度合计约 89%
Method · ①

设计与准备 —— 把业务问题变成可计算的问题

「该优先给谁」不是一句话能算的,要先把它拆成两个机器学习任务,再定下 4 个关键设计决策。这 4 个决策是本项目严谨性的地基。

A任务转化
「该优先给谁」→ 两个可计算问题
分类:前 7 日行为 → 45 日内「会不会付费」;② 回归:付费用户内 → 「付多少」。一个识别,一个定价。
B数据与特征
228.8 万真实玩家 × 109 字段
特征只用「前 7 日行为」= 在线时长 + PVP/PVE 对战参与度;标签是「注册后前 45 日累计付费(含前 7 日)」→ 因此主动剔除 pay_count(它是标签子集,属目标泄漏,见第 ③ 页)。
1时间切分(不用随机)
register_time 的 0.8 分位切分 —— 早 80%(183.0 万)训练 → 晚 20%(45.8 万)测试
真实部署是「用过去预测未来」,必须按注册时间先后切;随机切分会把同一批用户的未来信息漏进训练集、高估效果。时间切分后 test 是模型「从未见过」的未来用户,评估才可信。
2PR-AUC 而非准确率
付费率仅 2%,看 PR-AUC
全判「不付费」就有 98% 准确率却毫无价值;PR-AUC 对正类极稀敏感(基线 = 正类率 2.3%)。
3两阶段建模
① 分类 RandomForestClassifier(n_estimators=150, class_weight='balanced') ② 回归 GradientBoostingRegressor(log1p 尺度,只在付费用户内)
「会不会付」与「付多少」是两个分布:付费率 2% 极端不平衡 + 金额幂律长尾。混在一个模型里会被鲸鱼极端值带偏;两阶段各自优化,分类专注「识别」、回归专注「估值」,更稳、可解释。
4log1p 变换
对付费金额取 log(1+x)
金额服从幂律长尾(偏度 22.6),log 后偏度降到 1.27,回归不再被少数鲸鱼主导(见下方对比图)。

log1p 变换 —— 为什么能改善回归

付费金额(prediction_pay_price,付费用户内)分布:左 = 原始(偏度 22.6),右 = log1p 后(偏度 1.27)
原始金额(元)
log1p 后
34% 的付费者金额挤在 0–1 元、最大值却高达 32,978 元 —— 偏度 22.6;log1p 后分布明显更均匀,回归不再被少数鲸鱼主导。
Method · ②

执行与分析 —— 怎么跑的,跑出了什么

一条 SQL 管道取数 + 两个模型,跑完后从画像、早期信号、预测力、业务价值四层看结果。

执行

环节工具做了什么
取数 / 画像SQL(DuckDB)付费画像(付费率 / ARPU / ARPPU)+ 价值分层(鲸鱼 / 海豚 / 小鱼)
分类RandomForest会不会付费,class_weight='balanced' 处理 2% 不平衡
回归GradientBoosting付费金额,log1p 尺度,只在付费用户内
切分 / 评估时间 80/20ROC-AUC / PR-AUC / R² / RMSE

付费画像(真实 SLG 结构)

低付费率、高客单、长尾
指标
付费率(前7日)1.81%
ARPPU29.52 元
鲸鱼(前1%)贡献42.1%
付费者在线 / 非付费140 / 7.8 分钟

预测力

前 7 日行为能提前识别付费
指标
ROC-AUC0.773
PR-AUC0.082(基线 3.6×)
最强特征在线时长 53.7%
次强特征PVE 参与 35%

业务价值(lift)

把模型分数从高到低排,定向 top X% 能覆盖多少真实付费者
定向覆盖真实付费者相对随机(lift)
top 1%4.6%4.6×
top 5%17.1%3.4×
top 10%40.4%4.0×
top 20%64.8%3.2×
Improvement · ③

改善 —— 主动发现并修掉一个数据泄漏

第一次跑出的指标很漂亮(PR-AUC 0.917),但进一步核验后发现它背后是循环论证,于是主动修掉。

改善的大致流程

STEP 1
发现异常
pay_count(前7日付费次数)放进特征,PR-AUC 冲到 0.917、top1% lift 冲到 43.5×——漂亮得不像话。
STEP 2
定位原因
「预测时点」一问:pay_count 是标签(前 45 日付费、含前 7 日)的子集——「前7日已付费 ⇒ 45日已付费」是循环论证(目标泄漏)。
STEP 3
主动修正
剔除 pay_count,只用纯行为特征,回答「不看付费信号,能否提前识别」。
STEP 4
真实信号
得到没那么漂亮、但更可信的结果,并能解释为什么会虚高。
含 pay_count(泄漏)
PR-AUC 0.917
top1% lift 43.5×(纯行为同口径仅 4.5×)—— 「用付费预测付费」,循环论证,答不出早期识别的真问题。
剔除后(真实)
PR-AUC 0.082
基线 2.3% 的 3.6 倍 · top 10% 覆盖 40.4% 付费者(4× 随机)——真实、可解释、可落地。