功能丰富的推荐系统

功能丰富的推荐系统

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.

 

 

posted @ 2020-07-02 14:04  吴建明wujianming  阅读(260)  评论(0编辑  收藏  举报