功能丰富的推荐系统
功能丰富的推荐系统
Feature-Rich Recommender Systems
交互数据是用户偏好和兴趣的最基本指示。在以前引入的模型中起着至关重要的作用。然而,交互数据通常非常稀疏,有时可能会有噪声。为了解决这个问题,可以在推荐模型中集成一些附加信息,比如条目的特性、用户的概要信息,甚至是交互发生的上下文。利用这些特性有助于提出建议,因为这些特性可以有效地预测用户的兴趣,特别是在缺少交互数据的情况下。因此,推荐模型也必须具备处理这些特性的能力,并赋予模型一些内容/上下文感知能力。为了演示这种类型的推荐模型,介绍了另一个关于在线广告推荐的点击率(CTR)的任务,并给出了一个匿名广告数据。有针对性的广告服务引起了广泛的关注,并经常被当作推荐引擎。推荐符合用户个人口味和兴趣的广告对于提高点击率非常重要。
数字营销人员使用在线广告向客户展示广告。点击率是衡量广告客户在广告上获得的点击次数的一个指标,用公式计算的百分比表示:
点击率是预测算法有效性的一个重要指标。点击率预测是一项预测网站上的东西被点击的可能性的任务。CTR预测模型不仅适用于有针对性的广告系统,也适用于一般商品(如电影、新闻、产品)推荐系统、电子邮件活动,甚至搜索引擎。还与用户满意度、转化率密切相关,有助于设定广告活动目标,因为可以帮助广告商设定现实的期望值。
from collections import defaultdict
from d2l import mxnet as d2l
from mxnet import gluon, np
import os
1. An Online Advertising Dataset
随着互联网和移动技术的飞速发展,网络广告已经成为互联网行业重要的收入来源,并产生了绝大部分的收入。重要的是要展示相关的广告或激起用户兴趣的广告,以便将散客转化为付费客户。介绍的数据集是一个在线广告数据集。由34个字段组成,第一列表示目标变量,该变量指示广告是否被单击(1)或否(0)。所有其列都是分类特性。这些列可能表示广告id、站点或应用程序id、设备id、时间、用户配置文件等。由于匿名化和隐私问题,这些特征的真正语义尚未公开。
以下代码从服务器下载数据集并将其保存到本地数据文件夹中。
#@save
d2l.DATA_HUB['ctr'] = (d2l.DATA_URL + 'ctr.zip',
'e18327c48c8e8e5c23da714dd614e390d369843f')
data_dir = d2l.download_extract('ctr')
Downloading ../data/ctr.zip from http://d2l-data.s3-accelerate.amazonaws.com/ctr.zip...
有一个训练集和一个测试集,分别由15000个和3000个样本/行组成。
2. Dataset Wrapper
为了方便数据加载,实现了一个CTRDataset,从CSV文件加载广告数据集,供DataLoader使用。
#@save
class CTRDataset(gluon.data.Dataset):
def __init__(self, data_path, feat_mapper=None, defaults=None,
min_threshold=4, num_feat=34):
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, dtype=np.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
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: idx for idx, feat in enumerate(cnt)}
for i, cnt in feat_mapper.items()}
self.defaults = {i: len(cnt) for i, cnt 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]))
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']
下面的示例加载训练数据并打印出第一条记录。
train_data = CTRDataset(os.path.join(data_dir, 'train.csv'))
train_data[0]
(array([ 143., 145., 227., 237., 957., 1250., 1471., 1566., 1624.,
1960., 2008., 2061., 2154., 2304., 2305., 2360., 2745., 2746.,
2747., 2748., 2892., 2988., 3165., 3170., 3194., 3195., 3230.,
3653., 3687., 3693., 3729., 3752., 3784., 3803.]), [1.0])
可以看出,这34个字段都是范畴特征。每个值表示对应项的一个热索引。标签0表示未单击。这个CTRDataset还可以用于加载其数据集,如Criteo display Advertision challenge数据集和Avazu点击率预测数据集。
3. Summary
- Click-through rate is an important metric that is used to measure the effectiveness of advertising systems and recommender systems.
- Click-through rate prediction is usually converted to a binary classification problem. The target is to predict whether an ad/item will be clicked or not based on given features.