第六章:项目实战之推荐/广告系统
第一部分:推荐系统基础与召回算法
第三节:推荐数据基础准备
一、推荐系统的数据基础:一切从“行为”开始
推荐系统的核心是“理解用户兴趣”,而兴趣的根源是行为数据。
无论是电影推荐、商品推荐还是信息流推送,其本质都依赖于对用户行为的捕捉与建模。
常见的数据类型如下表:
| 数据类型 | 示例 | 用途 |
|---|---|---|
| 用户行为日志 | 点击、点赞、收藏、购买、播放 | 构建用户画像、兴趣偏好 |
| 用户属性信息 | 年龄、性别、地域、设备 | 人群分层、个性化推荐 |
| 内容信息 | 标题、标签、类别、价格、图片 | 特征提取、内容相似性计算 |
| 上下文信息 | 时间、天气、节日、设备类型 | 场景化推荐 |
| 反馈数据 | 停留时长、跳出率、转化率 | 评估推荐效果 |
推荐系统的数据不是“静态的表格”,而是持续更新的动态流。
二、数据来源:从日志到特征的演化路径
推荐系统最重要的输入是行为日志。
这些日志通过前端埋点(Tracking)与后端采集(Kafka/Flink)形成完整的数据闭环。
1.用户行为日志收集(Logging)
| 类型 | 示例 | 说明 |
|---|---|---|
| 曝光日志(Impression) | 用户看到的内容ID | 代表推荐机会 |
| 点击日志(Click) | 用户点击行为 | 代表显性兴趣 |
| 停留日志(Stay) | 浏览时长、播放时间 | 表示潜在兴趣 |
| 转化日志(Conversion) | 下单、购买、注册 | 表示最终目标达成 |
这些数据通过埋点 SDK 自动上传到日志系统,然后流入数据仓库。
典型技术栈:Kafka + Flink + HDFS + Hive + Spark
2.数据清洗(Data Cleaning)
行为日志往往包含大量噪声,需要清洗和标准化处理。
常见操作:
-
去除异常数据(如机器人点击、爬虫访问)
-
过滤无效曝光(如网络延迟、缓存重复)
-
时间统一化(时区、时间戳格式)
-
用户标识统一(user_id映射、匿名ID归一化)
# 示例:清洗日志数据
df = df.drop_duplicates(['user_id', 'item_id', 'timestamp'])
df = df[df['action'].isin(['click', 'view', 'purchase'])]
df['event_time'] = pd.to_datetime(df['event_time'])
3.数据存储(Data Storage)
清洗后的数据进入数据仓库或特征平台,常见结构:
| 层级 | 名称 | 说明 |
|---|---|---|
| ODS层 | 原始数据层 | 日志原样存储 |
| DWD层 | 清洗明细层 | 清洗、去重后数据 |
| DWS层 | 汇总层 | 聚合后的行为统计(如点击次数) |
| ADS层 | 应用层 | 提供模型训练或分析用数据 |
工具常见组合:Hive + SparkSQL + Airflow + Redis
三、特征工程:把行为“转化”为模型可理解的信号
推荐算法不直接使用原始日志,而是使用特征(Feature)。
特征是算法建模的语言,决定了模型理解用户和内容的能力。
1.用户特征(User Features)
| 类型 | 示例 | 描述 |
|---|---|---|
| 静态特征 | 性别、年龄、地区 | 基础属性 |
| 动态特征 | 最近点击的内容、时间分布 | 反映近期兴趣 |
| 行为统计特征 | 点击次数、平均停留时长 | 兴趣强度 |
| 嵌入向量 | 通过Embedding表示的兴趣分布 | 模型输入核心特征 |
示例:
用户最近点击了5篇科技文章,可提取为“科技类兴趣权重高”的embedding。
2.内容特征(Item Features)
| 类型 | 示例 | 描述 |
|---|---|---|
| 类别特征 | 类目ID、标签、品牌 | 表示内容属性 |
| 文本特征 | 标题、简介 | 经过BERT或TF-IDF提取向量 |
| 图像特征 | 封面图片 | 通过CNN或CLIP生成特征向量 |
| 热度特征 | 点击量、收藏量 | 反映内容受欢迎程度 |
图像类推荐(如电商、短视频)常使用 ResNet / CLIP 预训练向量做内容特征。
3.用户-内容交互特征(Cross Features)
交叉特征用于描述“特定用户对特定内容的关系”,例如:
| 特征 | 示例 | 含义 |
|---|---|---|
| 用户点击该类目次数 | user_click_count(item.category_id) | 偏好度 |
| 用户是否看过该内容 | has_viewed(item_id) | 历史交互 |
| 用户上次点击与当前时间间隔 | time_diff(last_click, now) | 时间衰减特征 |
四、负样本构造:推荐系统的“反面教材”
推荐任务通常是二分类问题(喜欢 vs 不喜欢),但日志里只有正样本(点击/购买),没有“没兴趣”的负样本。
因此我们需要人工构造负样本。
常见负采样策略:
| 策略 | 描述 | 适用场景 |
|---|---|---|
| 随机采样 | 随机选择未点击内容 | 快速但噪声大 |
| 按曝光采样 | 从曝光但未点击中选取 | 更真实反映用户选择 |
| 按相似度采样 | 选取与点击内容相似但未选的 | 细粒度建模兴趣边界 |
# 示例:基于曝光采样构造负样本
neg_samples = all_impressions[~all_impressions['item_id'].isin(clicked_items)]
neg_samples = neg_samples.sample(n=len(clicked_items))
注意:负样本比例会直接影响模型训练稳定性。常用正负比 1:4 或 1:10。
五、样本标注与数据集划分
1.样本标注
通常将用户行为转化为标签:
-
点击、收藏、购买 → 正样本(label=1)
-
曝光未点击 → 负样本(label=0)
2.数据集划分
保持时间一致性是推荐系统的关键!
| 数据集 | 时间区间 | 用途 |
|---|---|---|
| 训练集 | 历史数据(如过去30天) | 模型训练 |
| 验证集 | 最近7天数据 | 调参验证 |
| 测试集 | 最新数据(线上前一天) | 模型评估 |
不能随机划分,因为用户兴趣具有时间连续性。
六、数据可视化与分析
在训练模型前,必须先“看懂数据”。
推荐系统中的数据分析常用图表包括:
-
用户行为分布(点击率、购买率)
-
内容热度Top-N统计
-
用户兴趣标签词云
-
时间维度趋势图(早晨、午间、夜间行为差异)
经验:优秀的推荐系统工程师,首先是一个数据分析高手。
七、本节总结:数据是推荐算法的“地基”
| 模块 | 目标 | 工具 |
|---|---|---|
| 行为日志收集 | 采集用户与内容交互行为 | Kafka / Flink |
| 数据清洗 | 去重、过滤、统一时间格式 | Spark / Pandas |
| 特征工程 | 构建用户与内容特征 | TF.Transform / Feature Store |
| 负样本构造 | 生成合理训练标签 | Pandas / PyTorch Dataset |
| 数据分析 | 理解用户行为分布 | matplotlib / seaborn |
优质的数据集,是训练出高性能推荐模型的第一步。
本节学习目标总结
| 学习要点 | 内容 |
|---|---|
| 理解推荐系统数据的组成与来源 | 行为日志 + 属性特征 + 上下文 |
| 掌握数据清洗与特征构造方法 | 统一格式、Embedding转换 |
| 能够生成训练样本与负样本 | 正负样本比例与采样策略 |
| 了解推荐系统数据分析思路 | 行为分布与兴趣画像 |

被折叠的 条评论
为什么被折叠?



