新闻详情

新闻详情

首页 / 资讯中心 / 详情

面向点击率(CTR)预测的特征丰富推荐系统:广告数据集构建与处理实战(d2l-en)

发布时间:2026/10/2 9:18:25来源:尧图网络
面向点击率(CTR)预测的特征丰富推荐系统:广告数据集构建与处理实战(d2l-en)
文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载点击率Click-Through Rate, CTR是衡量在线广告与推荐系统效果的核心指标CTR 预测本质上是一个基于海量稀疏分类特征广告 ID、站点/应用 ID、设备 ID、用户画像、时间上下文等的二分类问题。本文以《动手学深度学习》d2l-en推荐系统章节中的 CTR 篇chapter_recommender-systems/ctr.md为主体完整讲解匿名在线广告数据集的下载与解析、CTRDataset数据封装器的源码级实现字段映射、低频值截断、全局索引偏移等关键技术并结合仓库中CTRDataset在 FM因子分解机 与 DeepFM 中的实际调用方式演示如何用该封装器复用 Criteo、Avazu 等其他 CTR 数据集。读完本文你将掌握如何把匿名稀疏分类特征正确编码成模型可用的数值张量这一 CTR 建模前置环节的完整实战方案。为什么交互数据需要特征丰富化交互数据interaction data是用户偏好与兴趣最直接的体现也是此前章节中矩阵分解Matrix Factorization、AutoRec 等模型赖以工作的基础。但交互数据通常极度稀疏且伴随噪声。缓解这一问题的通用思路是把侧信息side information——物品特征、用户画像、交互发生时的上下文时间、设备、站点等——整合进推荐模型。在交互数据匮乏时这些特征能成为用户兴趣的有效预测信号因此推荐模型必须有能力处理这类特征从而获得一定的内容/上下文感知能力content/context awareness。CTR 预测正是展示这类特征丰富推荐模型的标准任务它不仅服务于定向广告系统targeted advertising也可直接迁移到通用物品电影、新闻、商品推荐、邮件营销email campaigns甚至搜索引擎场景。它与用户满意度、转化率conversion rate密切相关还能帮助广告主设定现实的投放预期。CTR 的定义与任务形式数字营销人员通过在线广告向用户展示广告而点击率CTR衡量广告主收到的点击次数占展示次数impressions的比例以百分比形式表达$$ \textrm{CTR} \frac{#\textrm{Clicks}} {#\textrm{Impressions}} \times 100 % .$$CTR 是评估预测算法有效性的重要信号。CTR 预测任务则是预测网站上某条内容被点击的可能性。从建模角度看CTR 预测通常被转换为二分类问题给定特征预测某条广告/物品是否会被点击点击为 1未点击为 0。正因如此CTR 模型通常以交叉熵类损失如SigmoidBinaryCrossEntropyLoss训练输出层使用 sigmoid 函数。匿名在线广告数据集结构、下载与切分34 个字段的匿名分类特征随着互联网与移动技术的发展在线广告已成为互联网行业重要的收入来源其核心诉求是向用户展示与其兴趣相关的广告将普通访客转化为付费客户。本章使用的数据集即为此类匿名在线广告数据集其结构如下共34 个字段fields第一列是目标变量表示广告是否被点击1 点击0 未点击其余 33 列全部是分类特征categorical features可能对应广告 ID、站点或应用 ID、设备 ID、时间、用户画像等出于匿名化与隐私保护的考虑特征的真实语义不予公开undisclosed。也正因字段语义未知该数据集非常适合验证纯特征工程 泛化模型在 CTR 任务上的能力——模型无法依赖任何人工理解的字段含义。数据集下载与目录结构d2l 通过DATA_HUB机制管理外部数据集ctr数据集的注册与下载代码如下仓库实现在 d2l/mxnet.py 中与章节完全一致#tab mxnet #save d2l.DATA_HUB[ctr] (d2l.DATA_URL ctr.zip, e18327c48c8e8e5c23da714dd614e390d369843f) data_dir d2l.download_extract(ctr)其中元组第二项是数据文件的SHA-1 校验和用于在下载后校验文件完整性。d2l.download_extract(name, folderNone)的底层实现见 d2l/mxnet.py会先调用download获取文件再根据扩展名.zip或.tar/.gz解压到本地数据目录并返回解压后的数据目录路径def download_extract(name, folderNone): Download and extract a zip/tar file. Defined in :numref:sec_utils fname download(name) base_dir os.path.dirname(fname) data_dir, ext os.path.splitext(fname) if ext .zip: fp zipfile.ZipFile(fname, r) elif ext in (.tar, .gz): fp tarfile.open(fname, r) else: assert False, Only zip/tar files can be extracted. fp.extractall(base_dir) return os.path.join(base_dir, folder) if folder else data_dir解压后的数据包含训练集与测试集两部分数据集样本数训练集train.csv15,000 行测试集test.csv3,000 行两个文件都以tab\t分隔每行34 1 35个字段1 个标签 34 个特征值注意代码中从下标 1 遍历到NUM_FEATS共 34 个特征列。CTRDataset封装器源码级解析为方便数据加载d2l 实现了一个继承gluon.data.Dataset的CTRDataset类可直接交给DataLoader使用。该类同时被 FM 和 DeepFM 章节复用并完整保存在 d2l/mxnet.py 中。下面逐块拆解其核心逻辑。类签名与参数#tab mxnet #save class CTRDataset(gluon.data.Dataset): def __init__(self, data_path, feat_mapperNone, defaultsNone, min_threshold4, num_feat34):各参数含义如下参数默认值作用data_path必填CSVtab 分隔文件路径feat_mapperNone字段 → 特征值 → 整数索引 的映射为None时自动构建defaultsNone每个字段的兜底索引低频/未见过特征值映射到它为None时自动构建min_threshold4频次低于该值的特征值将被丢弃视为低频num_feat34特征字段数本数据集固定为 34feat_mapper与defaults同时传入的意义在于测试集必须复用训练集构建的映射保证训练阶段见过的特征值集合在测试阶段完全一致这是避免数据泄漏和保证评估公平的关键设计见下文 FM/DeepFM 的数据加载示例。逐行解析与低频截断self.NUM_FEATS, self.count, self.data num_feat, 0, {} feat_cnts defaultdict(lambda: defaultdict(int)) self.feat_mapper, self.defaults feat_mapper, defaults self.field_dims np.zeros(self.NUM_FEATS, dtypenp.int64) with open(data_path) as f: for line in f: instance {} values line.rstrip(\n).split(\t) if len(values) ! self.NUM_FEATS 1: continue label np.float32([0, 0]) label[int(values[0])] 1 instance[y] [np.float32(values[0])] for i in range(1, self.NUM_FEATS 1): feat_cnts[i][values[i]] 1 instance.setdefault(x, []).append(values[i]) self.data[self.count] instance self.count self.count 1解析过程要点格式校验按 tab 切分后字段数必须是NUM_FEATS 135否则跳过该行起到脏数据过滤作用标签处理label np.float32([0, 0])构造一个长度为 2 的向量再按标签值置位——代码中的label[int(values[0])] 1实际得到[0, 1]点击或[1, 0]未点击形式适配SigmoidBinaryCrossEntropyLoss的输入约定instance[y]则保存标量标签0/1频次统计对每个字段内每个特征值计数供后续低频截断使用原始值保留每个样本的原始特征字符串按字段顺序存入instance[x]列表。特征映射与字段维度if self.feat_mapper is None and self.defaults is None: feat_mapper {i: {feat for feat, c in cnt.items() if c min_threshold} for i, cnt in feat_cnts.items()} self.feat_mapper {i: {feat_v: idx for idx, feat_v in enumerate(feat_values)} for i, feat_values in feat_mapper.items()} self.defaults {i: len(feat_values) for i, feat_values in feat_mapper.items()} for i, fm in self.feat_mapper.items(): self.field_dims[i - 1] len(fm) 1 self.offsets np.array((0, *np.cumsum(self.field_dims).asnumpy() [:-1]))这段代码是 CTR 特征编码的核心含义如下低频截断只保留每个字段内出现次数 min_threshold的特征值其余一律丢弃减少维度爆炸并抑制噪声字典化保留的特征值按枚举顺序映射为0, 1, 2, ...的稠密索引兜底索引defaults取该字段特征值数量len(feat_values)即未见过/被截断值统一指向的索引相当于每个字段的UNKNOWN槽位字段维度field_dims[i - 1] len(fm) 1即每个字段的词汇表大小 保留特征值数 1多出的 1 就是兜底索引全局偏移offsets由field_dims的累加和构造前一个字段的累加和作为下一个字段的起始偏移从而把每个字段内部从 0 开始的局部索引转换成整个拼接词汇表上唯一的全局索引。这种字段内局部索引 字段间偏移的做法对应nn.Embedding(num_inputs, num_factors)num_inputs int(sum(field_dims))这类全局嵌入表的查找方式是 FM/DeepFM 实现能够把 34 个字段拼成一张大嵌入表的前提。取数与索引映射def __len__(self): return self.count def __getitem__(self, idx): feat np.array([self.feat_mapper[i 1].get(v, self.defaults[i 1]) for i, v in enumerate(self.data[idx][x])]) return feat self.offsets, self.data[idx][y]__len__返回解析成功的样本数跳过格式错误行后__getitem__对样本的每个原始特征字符串v通过feat_mapper[i 1].get(v, defaults[i 1])查表得到该字段内的局部索引未命中低频或测试集新值时回落到兜底索引最后加上offsets把局部索引提升为全局唯一索引与标签y一起返回供DataLoader直接产出训练批次。实际加载示例#tab mxnet train_data CTRDataset(os.path.join(data_dir, train.csv)) train_data[0]输出即第一个样本的(全局索引特征向量, 标签)二元组。可以看到34 个字段全部是分类特征每个值都是对应条目的one-hot 索引全局化后标签 0 表示未被点击。这种表示正是后续nn.Embedding直接可查的输入格式。复用CTRDataset加载 FM / DeepFM 训练数据CTRDataset的实战价值在于其可复用性。以 FM 章节 的完整数据加载代码为例#tab mxnet batch_size 2048 data_dir d2l.download_extract(ctr) train_data d2l.CTRDataset(os.path.join(data_dir, train.csv)) test_data d2l.CTRDataset(os.path.join(data_dir, test.csv), feat_mappertrain_data.feat_mapper, defaultstrain_data.defaults) train_iter gluon.data.DataLoader( train_data, shuffleTrue, last_batchrollover, batch_sizebatch_size, num_workersd2l.get_dataloader_workers()) test_iter gluon.data.DataLoader( test_data, shuffleFalse, last_batchrollover, batch_sizebatch_size, num_workersd2l.get_dataloader_workers())关键点测试集复用训练集映射feat_mappertrain_data.feat_mapper, defaultstrain_data.defaults保证两阶段词汇表一致测试集出现的新特征值落入训练时定义的兜底索引批大小 2048训练集 15,000 行约 8 个批次last_batchrollover处理余数num_workersd2l.get_dataloader_workers()启用多进程数据加载该工具函数定义于 d2l/mxnet.py与 FM/DeepFM 的训练设置保持一致训练时net FM(train_data.field_dims, num_factors20)FM 章节DeepFM 则使用DeepFM(field_dims, num_factors10, mlp_dims[30, 20, 10])DeepFM 章节field_dims正是由CTRDataset在构造时统计得到的每字段词汇表大小。扩展到其他 CTR 数据集CTRDataset的设计使其不仅限于本章的匿名广告数据还可以用来加载业界经典的公开 CTR 数据集例如Criteo 展示广告挑战赛数据集Criteo Display Advertising Challenge包含约 13 个整数特征与 26 个分类特征特征真实语义同样经过脱敏Avazu CTR 预测数据集Avazu Click-Through Rate Prediction包含点击标签以及应用/站点/设备/广告位等多维分类字段。使用要点与限制如下Avazu 等全分类特征数据集通常可直接用CTRDataset加载调整num_feat为对应字段数即可Criteo 数据集包含实值real-valued特征而CTRDataset当前实现按字符串分类特征处理因此需要先对实值列做离散化/分箱bucketization或将数值列单独建模后再拼接——这是章节练习题中明确提示需要略微修订代码的原因无论加载哪种数据都应遵循训练集构建feat_mapper/defaults测试集复用的规范以保持一致的特征空间。小结CTR 是衡量广告系统与推荐系统效果的重要指标CTR 预测通常转化为二分类问题基于给定特征预测广告/物品是否被点击侧信息广告 ID、站点、设备、用户画像、时间等能显著缓解交互数据稀疏带来的冷启动与泛化问题是特征丰富推荐系统的关键CTRDataset以低频截断 字段内字典映射 全局偏移 兜底索引四步把 34 个匿名分类字段编码为全局 one-hot 索引向量完整实现可在 d2l/mxnet.py 中查阅测试集必须复用训练集的feat_mapper与defaults这是保证特征空间一致、评估结果可信的前提该封装器可直接复用于 Avazu 等全分类特征数据集对含实值特征的 Criteo 数据集需先对其数值列进行离散化再套用本封装器。延伸练习建议尝试用CTRDataset加载 Criteo 与 Avazu 数据集注意 Criteo 的实值特征需要先分箱离散化才能被本封装器处理将本封装器与 FM、DeepFM 章节的模型衔接调整num_feat与min_threshold观察其对模型输入维度与训练效果的影响。赞分享文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载相关推荐D2L项目特征丰富推荐系统与CTR预测终极指南在当今数字化营销时代精准推荐已成为提升用户体验和商业价值的关键。D2L项目通过特征丰富的推荐系统架构为CTR预测提供了强有力的技术支撑。本文将带你深入理解这文档教程人工智能深度学习NLP计算机视觉强化学习动手学深度学习d2l-zh特征丰富的 CTR 数据集与 CTRDataset 点击率预测数据管线实战动手学深度学习d2l zh特征丰富的 CTR 数据集与 CTRDataset 点击率预测数据管线实战 本篇指南聚焦《动手学深度学习》中文版d2l zh人工智能深度学习机器学习教程如何构建高效的特征丰富推荐系统从CTR预测到DeepFM模型的完整指南如何构建高效的特征丰富推荐系统从CTR预测到DeepFM模型的完整指南 D2L项目d2l en是一个基于Python的深度学习教程特别专注于特征丰富的推文档教程人工智能深度学习NLP计算机视觉强化学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

并查集求连通分量:从USACO语言题看最少连接数建模 2026/10/2 10:12:03

并查集求连通分量:从USACO语言题看最少连接数建模

刷 USACO 的题刷久了,你会发现很多题其实就差一层窗户纸。P3026 [USACO11OPEN] Learning Languages S 就是这样一道典型的“连通分量”入门题:题面围绕着农场里的牛和语言绕来绕去,但一旦你把模型想清楚,代码量可以短到只有几十行…

阅读更多 →
低轨卫星与5G融合:NTN协议栈改造、链路仿真与组网选型实战 2026/10/2 10:12:03

低轨卫星与5G融合:NTN协议栈改造、链路仿真与组网选型实战

简介:这份《中国卫星互联网产业发展研究白皮书》由赛迪顾问物联网产业研究中心与新浪5G联合发布,面向通信、航天、投资及政策研究领域的从业者与学习者,系统梳理卫星互联网的产业全貌。资源包内含1个PDF文件,大小约923KB&#xff…

阅读更多 →
类型安全容器设计:从C++模板到Docker权限管理 2026/10/2 10:11:56

类型安全容器设计:从C++模板到Docker权限管理

“类型安全容器设计”这几个字,放在不同的技术语境里,指向的东西完全不一样。做应用层开发的人第一反应是 C 的 std::vector、std::map,或者 Java 里的 ArrayList、HashMap;干嵌入式的会想到 LVGL 的 lv_obj 容器、lottie 动画容器…

阅读更多 →
差越小积越大:从平方差公式到均值不等式的最值原理 2026/10/2 10:11:56

差越小积越大:从平方差公式到均值不等式的最值原理

前几天辅导一个初三的孩子,题目很简单:x和y加起来等于10,问xy最大能到多少。他思路很快,先试了1和9,又试了2和8,再试3和7,发现乘积从9涨到16又涨到21,马上猜到4和6应该更大&#xff…

阅读更多 →
wrk压测工具部署与实战:从已编译包到业务级压测 2026/10/2 10:11:50

wrk压测工具部署与实战:从已编译包到业务级压测

简介:一份已编译的wrk HTTP压测工具包,专为需要评估Web服务器、API接口或负载均衡器性能的开发、测试与运维人员准备。wrk基于LuaJIT脚本,支持通过自定义脚本模拟请求模式、校验响应状态、控制请求速率,能够灵活构造高并发测试场景…

阅读更多 →
JMeter随机变量全解析:从参数化原理到压测实战技巧 2026/10/2 10:11:50

JMeter随机变量全解析:从参数化原理到压测实战技巧

做性能测试这些年,我越来越发现一个道理: 真正影响压测结果真实性的,往往不是并发数调得高不高,而是测试数据准备得够不够“像”生产环境。 比如模拟100个用户同时登录,如果所有人用的都是同一个账号,那测…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉