16.8. Hệ thống Đề xuất Giàu Đặc trưng

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

Các nhà tiếp thị số sử dụng quảng cáo trực tuyến để phát quảng cáo tới khách hàng. Tỷ lệ nhấp chuột là tỷ lệ số lần nhấp chuột nhận được trên số lần hiển thị quảng cáo, được biểu diễn dưới dạng phần trăm theo công thức:

(16.8.1)\[\text{CTR} = \frac{\#\text{số lần nhấp chuột}} {\#\text{số lần hiển thị}} \times 100 \% .\]

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

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

16.8.1. Tập dữ liệu Quảng cáo Trực tuyến

Với những bước tiến đá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à sản sinh phần lớn doanh thu trong ngành công nghiệp Internet. Việc hiển thị quảng cáo có liên quan và thu hút sự chú ý của người dùng là rất quan trọng để biến những người dùng vãng lai trở thành những khách hàng trả tiền tiềm năng. 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 biểu diễn biến mục tiêu cho biết liệu một quảng cáo được nhấp vào (1) hay không (0). Tất cả các cột còn lại là các đặc trưng theo hạng mục. Các cột này có thể biểu diễn id của quảng cáo, id trang web hay ứng dụng, id thiết bị, thời gian, hồ sơ người dùng, v.v. Ngữ nghĩa thực tế của các đặc trưng này không được tiết lộ để ẩn danh hoá dữ liệu và bảo mật thông tin cá nhân.

Đoạn mã dưới đây tải tập dữ liệu về từ máy chủ của chúng tôi và lưu vào một thư mục.

#@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...

Tập dữ liệu bao gồm tập huấn luyện và tập kiểm tra, gồm lần lượt 15000 và 3000 mẫu/dòng.

16.8.2. Wrapper Tập dữ liệu

Để thuận tiện trong việc nạp dữ liệu, ta lập trình lớp CTRDataset nạp vào 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: 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']

Ví dụ dưới đây nạp tập huấn luyện và in ra bản ghi đầu tiên.

train_data = CTRDataset(os.path.join(data_dir, 'train.csv'))
train_data[0]
(array([ 143.,  146.,  227.,  245.,  957., 1250., 1471., 1566., 1624.,
        1875., 2008., 2061., 2240., 2304., 2305., 2360., 2745., 2746.,
        2747., 2748., 2892., 2988., 3165., 3181., 3194., 3195., 3627.,
        3683., 3687., 3703., 3723., 3744., 3785., 3806.]),
 [1.0])

Như có thể thấy, toàn bộ 34 trường đều là đặc trưng theo hạng mục. Mỗi giá trị biểu diễn chỉ số one-hot của trường tương ứng. Nhãn \(0\) nghĩa là quảng cáo này không được nhấp vào. Lớp CTRDataset này cũng có thể được sử dụng để nạp các tập dữ liệu khác như tập dữ liệu trong cuộc thi hiển thị quảng cáo Criteo. và tập dữ liệu dự đoán tỷ lệ nhấp chuột Avazu.

16.8.3. Tóm tắt

  • Tỷ lệ nhấp chuột là một phép đo quan trọng được sử dụng để đo độ hiệu quả của hệ thống quảng cáo và hệ thống đề xuất.
  • Dự đoán tỷ lệ nhấp chuột thường được chuyển đổi thành bài toán phân loại nhị phân. Mục tiêu của bài toán là dự đoán liệu một quảng cáo/sản phẩm có được nhấp vào hay không dựa vào các đặc trưng cho trước.

16.8.4. Bài tập

Bạn có thể nạp tập dữ liệu Criteo và Avazu với CTRDataset đã được cung cấp không? Chú ý rằng tập dữ liệu Criteo gồm các đặc trưng mang giá trị số thực nên bạn có thể phải chỉnh sửa lại đoạn mã một chút.

16.8.5. Thảo luận

16.8.6. Những người thực hiện

Bản dịch trong trang này được thực hiện bởi:

  • Đoàn Võ Duy Thanh
  • Đỗ Trường Giang
  • Phạm Hồng Vinh
  • Lê Khắc Hồng Phúc
  • Nguyễn Văn Cường

Cập nhật lần cuối: 05/10/2020. (Cập nhật lần cuối từ nội dung gốc: 30/06/2020)