用户画像 (User Profile)
一句话概述
用户画像是广告精准投放的基础,通过采集和分析用户的基础属性、兴趣偏好、行为特征等多维数据,构建结构化的用户标签体系,实现"千人千面"的广告投放。
用户画像体系架构
flowchart LR
subgraph 数据采集层
A1[客户端埋点]
A2[服务端日志]
A3[第三方数据]
A4[CRM 数据]
end
subgraph 数据处理层
B[标签计算引擎<br/>离线+实时]
C[(用户标签存储<br/>HBase/Redis)]
end
subgraph 数据应用层
D1[广告定向]
D2[人群圈选]
D3[Lookalike]
D4[个性化推荐]
end
A1 & A2 & A3 & A4 --> B
B --> C
B --> D1 & D2 & D3 & D4
用户标识体系 (User ID)
主要标识类型
| 标识 |
平台 |
特点 |
现状 |
| IDFA |
iOS |
Apple 广告标识符 |
ATT 后获取率 ~20% |
| GAID |
Android (海外) |
Google 广告标识符 |
可重置 |
| OAID |
Android (国内) |
移动安全联盟标准 |
国内安卓主流 |
| IMEI |
Android |
设备硬件标识 |
Android 10+ 限制获取 |
| Cookie |
Web |
浏览器标识 |
第三方 Cookie 将淘汰 |
| 手机号 |
通用 |
用户注册信息 |
需用户授权,隐私敏感 |
| UnionID |
平台内 |
平台统一用户ID |
平台内跨应用打通 |
ID Mapping (跨设备识别)
目标: 将同一用户在不同设备/平台上的标识关联起来
方法:
1. 确定性匹配 (Deterministic)
- 登录账号关联: 同一账号在手机+平板+PC 登录
- 手机号关联: 不同 App 使用同一手机号注册
- 准确率: ~100%,但覆盖率低
2. 概率性匹配 (Probabilistic)
- 基于设备特征相似度: IP + UA + 时间模式
- 基于行为模式相似度: 浏览/搜索行为
- 准确率: 60%–80%,覆盖率高
```mermaid
flowchart LR
A[IDFA_A] --> B[UserID 123]
C[OAID_B] --> B
D[Cookie_C] --> B
隐私时代的 ID 方案
| 方案 |
说明 |
| 第一方 ID |
平台自有登录 ID,最可靠 |
| UID 2.0 |
基于邮箱的加密标识 (The Trade Desk) |
| Topics API |
Google 基于兴趣主题的匿名方案 |
| CAID |
中国广告协会互联网广告标识 |
| 设备指纹 |
基于设备特征的概率性标识 |
标签体系
标签分类
| 基础属性 |
兴趣偏好 |
行为特征 |
价值标签 |
| 年龄 |
兴趣分类 |
活跃度 |
LTV |
| 性别 |
内容偏好 |
使用时长 |
付费能力 |
| 地域 |
品牌偏好 |
消费行为 |
流失风险 |
| 设备 |
价格敏感度 |
搜索行为 |
忠诚度 |
| 职业 |
风格偏好 |
社交行为 |
|
| 学历 |
|
App使用 |
|
标签层级
| 层级 |
示例 |
数量 |
| 一级标签 |
美妆、汽车、游戏、教育 |
~20 |
| 二级标签 |
护肤品、彩妆、美容仪器 |
~200 |
| 三级标签 |
面膜、精华液、防晒霜 |
~2000 |
| 四级标签 |
抗老精华、美白精华 |
~10000+ |
标签属性
标签定义:
{
"tag_id": "interest_beauty_skincare",
"tag_name": "护肤品",
"category": "兴趣偏好",
"level": 2,
"parent": "interest_beauty",
"score": 0.85, // 置信度
"source": "behavior", // 来源
"update_time": "2024-01-15",
"ttl": "30d" // 有效期
}
标签计算
离线标签计算
数据源 → ETL → 特征提取 → 标签计算 → 标签存储
典型流程 (Spark/Hive):
1. 用户行为日志 (浏览/搜索/点击/购买)
2. 按用户聚合行为数据 (最近 30 天)
3. 特征提取:
- 浏览美妆内容次数 / 总浏览次数 = 美妆兴趣度
- TF-IDF 提取关键词兴趣
- 消费金额分位数 → 消费能力等级
4. 模型预测:
- 年龄/性别预测 (分类模型)
- 兴趣标签预测 (多标签分类)
5. 写入标签存储 (HBase/Redis)
更新频率: T+1 (每天更新)
实时标签计算
实时行为流 → Flink → 实时标签更新 → Redis
典型场景:
1. 用户刚搜索了"机票" → 实时打上"近期出行"标签
2. 用户刚浏览了汽车页面 → 实时更新"汽车兴趣"分数
3. 用户刚完成购买 → 实时更新"已转化"状态
Flink 处理逻辑:
- 窗口聚合: 最近 1 小时行为统计
- 规则触发: 特定行为触发标签更新
- 模型推理: 在线模型实时预测
标签计算示例
兴趣标签
-- Hive SQL: 计算用户兴趣标签
WITH user_behavior AS (
SELECT
user_id,
content_category,
COUNT(*) as view_cnt,
SUM(stay_duration) as total_duration
FROM user_view_log
WHERE dt >= date_sub(current_date, 30)
GROUP BY user_id, content_category
),
user_total AS (
SELECT user_id, SUM(view_cnt) as total_cnt
FROM user_behavior
GROUP BY user_id
)
SELECT
b.user_id,
b.content_category as interest_tag,
b.view_cnt / t.total_cnt as interest_score,
b.total_duration
FROM user_behavior b
JOIN user_total t ON b.user_id = t.user_id
WHERE b.view_cnt / t.total_cnt > 0.1 -- 兴趣度阈值
消费能力标签
-- 基于消费行为的消费能力分级
SELECT
user_id,
CASE
WHEN avg_order_amount >= 500 THEN 'high'
WHEN avg_order_amount >= 100 THEN 'medium'
ELSE 'low'
END as spending_level,
NTILE(10) OVER (ORDER BY total_amount) as spending_decile
FROM (
SELECT
user_id,
AVG(order_amount) as avg_order_amount,
SUM(order_amount) as total_amount
FROM order_log
WHERE dt >= date_sub(current_date, 90)
GROUP BY user_id
) t
特征工程 (Feature Engineering)
特征分类
| 类型 |
示例 |
存储 |
更新频率 |
| 静态特征 |
年龄、性别、设备型号 |
HBase |
低频 |
| 统计特征 |
7天点击次数、30天消费金额 |
HBase |
T+1 |
| 实时特征 |
最近1小时行为、当前session |
Redis |
实时 |
| 交叉特征 |
用户×广告主历史交互 |
在线计算 |
实时 |
特征存储架构
flowchart TD
A[离线特征 HBase<br/>T+1 更新 / 全量特征] --> D[Feature Store<br/>统一特征服务]
B[近线特征 Redis<br/>分钟级更新 / 热门特征] --> D
C[实时特征 本地缓存<br/>秒级更新 / Session特征] --> D
人群圈选
基于标签的圈选
圈选条件:
(年龄 IN [25-35])
AND (性别 = 女)
AND (兴趣 CONTAINS '美妆')
AND (消费能力 IN ['high', 'medium'])
AND (最近30天活跃)
预估覆盖: 1,200 万用户
基于行为的圈选
圈选条件:
最近7天浏览过"面膜"相关内容 ≥ 3次
AND 最近30天有电商购买行为
AND 未购买过品牌X的产品
预估覆盖: 80 万用户
人群包技术实现
小规模人群 (< 100万):
存储: HashSet / Redis Set
查询: O(1) 精确匹配
中规模人群 (100万 - 1亿):
存储: Bitmap (RoaringBitmap)
查询: O(1),支持交并差集运算
空间: 1亿用户 ≈ 12MB
大规模人群 (> 1亿):
存储: 分布式 Bitmap / Bloom Filter
查询: Bloom Filter 有误判率 (可接受)
画像质量评估
评估指标
| 指标 |
说明 |
目标 |
| 覆盖率 |
有标签的用户占比 |
> 80% |
| 准确率 |
标签预测的准确性 |
> 75% |
| 时效性 |
标签更新的及时性 |
离线 T+1,实时秒级 |
| 一致性 |
不同来源标签的一致性 |
> 90% |
| 区分度 |
标签对人群的区分能力 |
信息增益 > 阈值 |
标签准确率验证
方法1: 与真实数据对比
预测性别 vs 注册性别 → 准确率
方法2: 广告效果验证
使用标签定向的广告 CTR vs 随机投放 CTR
提升越大 → 标签越有效
方法3: 人工抽样验证
随机抽样用户,人工判断标签是否合理
与大数据开发的关联
- 数据采集: 用户行为日志的采集和传输 (Kafka/Flume)
- 离线计算: Spark/Hive 计算用户标签 (T+1)
- 实时计算: Flink 实时更新用户标签
- 特征存储: HBase/Redis 存储用户特征,Feature Store 建设
- 人群包计算: Bitmap/Bloom Filter 的大规模人群包管理
- ID Mapping: 跨设备用户识别的数据处理
- 数据质量: 标签覆盖率、准确率的监控和治理
面试高频问题
- 用户画像系统的整体架构是怎样的?
- 常见的用户标识有哪些?ID Mapping 如何实现?
- 离线标签和实时标签的计算方式有什么区别?
- 如何评估用户画像的质量?
- 隐私保护对用户画像的影响?如何应对?
- 人群包的技术实现方案?(Bitmap vs Bloom Filter)
推荐阅读