16.8. Hệ thống giới thiệu giàu tính năng

Dữ liệu tương tác là dấu hiệu cơ bản nhất về sở thích và sở thích của người dùng. Nó đóng một vai trò quan trọng trong các mô hình được giới thiệu trước đây. Tuy nhiên, dữ liệu tương tác thường cực kỳ thưa thớt và đôi khi có thể ồn ào. Để giải quyết vấn đề này, chúng ta có thể tích hợp thông tin phụ như các tính năng của các mục, hồ sơ của người dùng và thậm chí trong bối cảnh mà sự tương tác xảy ra vào mô hình đề xuất. Sử dụng các tính năng này rất hữu ích trong việc đưa ra các khuyến nghị ở chỗ các tính năng này có thể là một dự đoán hiệu quả của người dùng quan tâm đặc biệt là khi dữ liệu tương tác là thiếu. Do đó, điều cần thiết là các mô hình đề xuất cũng có khả năng đối phó với các tính năng đó và cung cấp cho mô hình một số nhận thức nội dung/bối cảnh. Để chứng minh loại mô hình đề xuất này, chúng tôi giới thiệu một nhiệm vụ khác về tỷ lệ nhấp (CTR) cho các khuyến nghị quảng cáo trực tuyến [McMahan et al., 2013] và trình bày dữ liệu quảng cáo ẩn danh. Các dịch vụ quảng cáo được nhắm mục tiêu đã thu hút sự chú ý rộng rãi và thường được đóng khung như các công cụ đề xuất. Việc đề xuất quảng cáo phù hợp với sở thích cá nhân và sở thích của người dùng là rất quan trọng để cải thiện tỷ lệ nhấp chuột.

Các nhà tiếp thị kỹ thuật số sử dụng quảng cáo trực tuyến để hiển thị quảng cáo cho khách hàng. Tỷ lệ nhấp là một số liệu đo lường số lần nhấp nhà quảng cáo nhận được trên quảng cáo của họ cho mỗi số lần hiển thị và nó được biểu thị dưới dạng phần trăm được tính theo công thức:

(16.8.1)\[\text{CTR} = \frac{\#\text{Clicks}} {\#\text{Impressions}} \times 100 \% .\]

Tỷ lệ nhấp chuột là một tín hiệu quan trọng chỉ ra hiệu quả của các thuật toán dự đoán. Dự đoán tỷ lệ nhấp chuột là một nhiệm vụ dự đoán khả năng một cái gì đó trên một trang web sẽ được nhấp. Các mô hình về dự đoán CTR không chỉ có thể được sử dụng trong các hệ thống quảng cáo được nhắm mục tiêu mà còn trong mục chung (ví dụ: phim, tin tức, sản phẩm) hệ thống giới thiệu, chiến dịch email và thậm chí cả công cụ tìm kiếm. Nó cũng liên quan chặt chẽ đến sự hài lòng của người dùng, tỷ lệ chuyển đổi và có thể hữu ích trong việc thiết lập các mục tiêu chiến dịch vì nó có thể giúp các nhà quảng cáo đặt ra kỳ vọng thực tế.

import os
from collections import defaultdict
from mxnet import gluon, np
from d2l import mxnet as d2l

16.8.1. Một bộ dữ liệu quảng cáo trực tuyến

Với những tiến bộ đáng kể của Internet và công nghệ di động, quảng cáo trực tuyến đã trở thành một nguồn thu nhập quan trọng và tạo ra phần lớn doanh thu trong ngành công nghiệp Internet. Điều quan trọng là hiển thị các quảng cáo hoặc quảng cáo có liên quan rằng lợi ích của người dùng để khách truy cập thông thường có thể được chuyển đổi thành khách hàng trả tiền. Tập dữ liệu chúng tôi giới thiệu là một tập dữ liệu quảng cáo trực tuyến. Nó bao gồm 34 trường, với cột đầu tiên đại diện cho biến đích cho biết một quảng cáo đã được nhấp (1) hay không (0). Tất cả các cột khác là các tính năng phân loại. Các cột có thể đại diện cho id quảng cáo, trang web hoặc id ứng dụng, id thiết bị, thời gian, hồ sơ người dùng, v.v. Ngữ nghĩa thực sự của các tính năng không được tiết lộ do ẩn danh và mối quan tâm riêng tư.

Mã sau tải tập dữ liệu từ máy chủ của chúng tôi và lưu nó vào thư mục dữ liệu cục bộ.

#@save
d2l.DATA_HUB['ctr'] = (d2l.DATA_URL + 'ctr.zip',
                       'e18327c48c8e8e5c23da714dd614e390d369843f')

data_dir = d2l.download_extract('ctr')

Có một bộ đào tạo và một bộ thử nghiệm, bao gồm 15000 và 3000 mẫu/dòng, tương ứng.

16.8.2. Gói dữ liệu

Để thuận tiện cho việc tải dữ liệu, chúng tôi triển khai CTRDataset tải tập dữ liệu quảng cáo từ tệp CSV và có thể được sử dụng bởi 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_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]))

    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']

Ví dụ sau tải dữ liệu đào tạo và in ra bản ghi đầu tiên.

train_data = CTRDataset(os.path.join(data_dir, 'train.csv'))
train_data[0]
(array([ 143.,  145.,  227.,  257.,  957., 1250., 1471., 1566., 1624.,
        1979., 2008., 2061., 2087., 2304., 2305., 2360., 2745., 2746.,
        2747., 2748., 2892., 2988., 3165., 3168., 3194., 3195., 3289.,
        3681., 3687., 3705., 3731., 3747., 3779., 3798.]),
 [1.0])

Như có thể thấy, tất cả 34 trường là các tính năng phân loại. Mỗi giá trị đại diện cho chỉ số một nóng của mục nhập tương ứng. Nhãn \(0\) có nghĩa là nó không được nhấp. CTRDataset này cũng có thể được sử dụng để tải các bộ dữ liệu khác như thử thách quảng cáo hiển thị Criteo Dataset và dự đoán tỷ lệ nhấp qua Avazu Dataset.

16.8.3. Tóm tắt * Tỷ lệ nhấp chuột là một số liệu quan trọng được sử dụng để đo lường hiệu quả của hệ thống quảng cáo và hệ thống giới thiệu. Mục tiêu là dự đoán xem quảng cáo/mục sẽ được nhấp hay không dựa trên các tính năng đã cho.

16.8.4. Bài tập

  • Bạn có thể tải tập dữ liệu Criteo và Avazu với CTRDataset được cung cấp. Điều đáng chú ý là tập dữ liệu Criteo bao gồm các tính năng có giá trị thực để bạn có thể phải sửa đổi mã một chút.

Discussions