冷启动用户没有行为数据,画像怎么建?
先说结论
冷启动的核心思路是「有多少数据用多少数据,没有数据用推断」。新用户注册时已经有一些信息了(注册渠道、设备型号、国家、语言),这些就是冷启动画像的基础。
冷启动画像分三个阶段递进:注册即刻(基于注册信息)→ 前24小时(基于首日行为)→ 前7天(基于累积行为)。随着用户行为数据增多,画像从粗粒度逐步变精细。
群体画像是兜底方案。当个人数据不够时,用该群体的平均画像替代——比如「来自日本的iOS用户」的平均消费水平和兴趣偏好。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
用户画像系统有一个天然的缺陷:新用户刚注册,没有任何行为数据,标签几乎全是空的。推荐系统查这个用户的画像,返回一片空白——怎么做个性化推荐?这就是冷启动问题。我在某出海硬件品牌做画像时,每天有上万新增用户,他们在前3天的画像覆盖率只有30%左右。面试官问这道题,是想看你在「数据不完美」的情况下怎么解决问题。
冷启动画像的三个阶段
| 阶段 | 时间点 | 可用数据 | 画像策略 | 覆盖率 |
|---|---|---|---|---|
| T+0(注册即刻) | 注册那一秒 | 注册渠道、设备型号、国家、语言 | 规则推断+群体画像 | 40-50% |
| T+1(首日行为) | 注册后24小时 | 首次浏览/点击/搜索行为 | 实时标签补充 | 60-70% |
| T+7(累积行为) | 注册后7天 | 多天行为累积 | 常规标签计算 | 85-90% |
| T+30(成熟用户) | 注册后30天 | 完整行为历史 | 全量标签覆盖 | 95%+ |
T+0阶段:注册信息推断
用户注册的那一刻,我们已经知道了一些信息。这些信息虽然粗糙,但足以做基础的画像推断。
-- T+0冷启动画像:基于注册信息推断标签
INSERT OVERWRITE TABLE ads_user_profile_cold PARTITION (dt='${bizdate}')
SELECT
user_id,
-- 基础属性:直接从注册信息获取
country,
device_type, -- iOS/Android
language,
acquisition_channel, -- 来源渠道:Facebook/TikTok/Organic
-- 推断标签:基于设备型号推断消费能力
CASE
WHEN device_model LIKE '%Pro Max%' OR device_model LIKE '%Ultra%'
THEN 'high' -- 旗舰机用户,消费能力大概率较高
WHEN device_model LIKE '%SE%' OR device_model LIKE '%lite%'
THEN 'low' -- 入门机用户
ELSE 'medium'
END AS predicted_spending_power,
-- 推断标签:基于来源渠道推断用户质量
CASE
WHEN acquisition_channel = 'organic' THEN 'high' -- 自然流量质量高
WHEN acquisition_channel = 'referral' THEN 'high' -- 朋友推荐
WHEN acquisition_channel = 'facebook' THEN 'medium' -- 付费广告
ELSE 'unknown'
END AS predicted_user_quality,
-- 群体画像兜底:用同渠道+同国家用户的平均值
g.avg_7d_spend AS predicted_first_week_spend
FROM dwd_user_register r
LEFT JOIN dim_group_profile g
ON r.country = g.country AND r.acquisition_channel = g.channel
WHERE r.dt = '${bizdate}';
群体画像:个人数据不够时的兜底方案
群体画像是冷启动最实用的兜底策略。思路很简单:新用户虽然没有个人行为数据,但和他「类似」的用户群体有大量数据。
-- 构建群体画像:按国家+渠道+设备类型聚合
CREATE TABLE dim_group_profile AS
SELECT
country,
acquisition_channel AS channel,
device_type,
-- 该群体的平均行为指标(作为新用户的默认值)
AVG(total_amount_usd) AS avg_total_spend,
AVG(login_cnt_7d) AS avg_login_7d,
PERCENTILE_APPROX(total_amount_usd, 0.5) AS median_spend,
-- 该群体的标签分布(最常见的值作为默认值)
-- 比如日本iOS用户最常见的value_level是什么
MAX(CASE WHEN rn = 1 THEN value_level END) AS mode_value_level,
COUNT(*) AS group_size
FROM (
SELECT *,
ROW_NUMBER() OVER(
PARTITION BY country, acquisition_channel, device_type, value_level
ORDER BY COUNT(*) DESC
) AS rn
FROM ads_user_profile
WHERE dt = '${bizdate}'
AND register_days >= 30 -- 只用成熟用户的数据
GROUP BY country, acquisition_channel, device_type, value_level
) t
GROUP BY country, acquisition_channel, device_type;
关键细节:群体画像只用注册满30天的成熟用户来计算,避免用其他新用户的不完整数据来推断。同时GROUP BY的维度不能太细(国家+渠道+设备类型最多3层),否则每个群体的样本量太少,统计意义不大。
T+1阶段:首日行为快速补充
用户注册后的第一天行为数据非常珍贵——它比注册信息更能反映用户的真实偏好。
-- T+1阶段:用首日行为更新画像
-- 这部分走Flink实时计算,24小时内逐步丰富画像
-- 首日行为标签(在dws层计算)
SELECT user_id,
COUNT(DISTINCT event_name) AS first_day_event_types, -- 首日探索了多少功能
SUM(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS first_day_purchase,
MAX(CASE WHEN event_name = 'search' THEN search_keyword END) AS first_search,
-- 基于首日行为重新判断用户类型
CASE
WHEN SUM(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) > 0
THEN 'fast_converter' -- 首日就付费,高质量用户
WHEN COUNT(DISTINCT event_name) >= 5
THEN 'active_explorer' -- 首日探索多种功能,潜力用户
WHEN COUNT(*) <= 2
THEN 'bouncer' -- 首日只做了1-2个动作就走了
ELSE 'observer' -- 浏览但不互动
END AS first_day_type
FROM dwd_user_event
WHERE dt = '${bizdate}'
AND DATEDIFF('${bizdate}', register_date) = 0 -- 只看注册当天的行为
GROUP BY user_id;
首日行为标签和注册推断标签合并后,画像覆盖率从40%提升到65%左右。特别是first_day_type这个标签,对后续的用户分层和运营策略非常有价值——首日就付费的用户后续LTV是普通用户的5-8倍。
面试高频追问
追问一:推断标签(如设备型号推断消费能力)准确率有多少?
我做过验证:用设备型号推断消费能力的准确率大约65%。旗舰机用户中70%确实是高消费,但也有30%是分期购买或者二手机用户。这个准确率不算高,但在冷启动阶段够用了——毕竟替代方案是「什么都不知道」。关键是在标签元数据里标注这是推断标签(predicted_),和确定性标签(actual_)区分开,让下游系统知道这个标签的置信度。
追问二:群体画像会不会导致所有新用户看到一样的推荐?
会有这个问题。解决方案有两个:①在群体画像的基础上加随机探索——推荐系统对冷启动用户用70%群体画像推荐+30%随机探索,既不会完全冷启动,又能发现该用户的个性化偏好;②加速标签补充——首日行为数据走Flink实时计算,用户每做一个动作就更新一次画像,尽快从群体画像过渡到个人画像。我在出海硬件品牌的数据显示,用户平均在注册后4小时就能积累足够的行为数据来替换群体画像。
追问三:冷启动画像怎么和推荐系统配合?
推荐系统查画像API时,API层做分层返回:如果Redis里有该用户的实时标签就返回实时标签;如果没有就查冷启动画像表;如果连冷启动画像都没有(极端情况,刚注册还没写入),就返回全局热门推荐。三层兜底,确保推荐系统永远有数据可用。同时在响应里加一个confidence字段,告诉推荐系统这个画像的置信度——realtime标签的confidence=1.0,冷启动推断标签的confidence=0.6,群体画像的confidence=0.3。推荐系统可以根据置信度调整推荐策略。
实战踩坑
我在某出海硬件品牌做冷启动画像时,一开始用「全球平均值」作为群体画像的兜底。结果发现日本用户和巴西用户的行为差异巨大——日本用户平均消费是巴西用户的4倍。用全球平均值给日本新用户做推荐,推的都是低价商品,体验很差。
后来我把群体画像细化到「国家+渠道+设备类型」三维度,效果好了很多。日本iOS自然流量用户看到的是高端产品推荐,巴西Android广告用户看到的是性价比产品推荐。个性化程度虽然还不够,但比全球一刀切好太多了。
教训:群体画像的粒度要够细。全球平均值没有意义——不同国家、不同渠道、不同设备类型的用户差异很大。但粒度也不能太细(比如细到城市+年龄+性别),否则每个群体的样本量太少,统计不可靠。国家+渠道+设备类型三维度是一个不错的平衡点。
总结
冷启动画像的核心策略是三阶段递进:T+0用注册信息推断+群体画像兜底,T+1用首日行为快速补充,T+7常规标签覆盖。推断标签要标注置信度,群体画像要分群体细化。面试时能讲清楚冷启动的分阶段策略和准确率验证,说明你考虑问题全面、不回避「数据不完美」的现实。
下一篇聊一个性能调优话题:数据倾斜导致标签计算任务跑了4小时——怎么优化到30分钟?
你们的新用户冷启动画像覆盖率有多少?用了什么兜底策略?评论区聊聊~
关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长
用户画像面试通关手册
第16-20篇:性能调优、架构设计与技术选型
Wood聊大数据
9年大数据老兵,聊技术、聊职场、聊成长