如何使用Python预测广告点击率

后端 潘老师 1周前 (04-14) 16 ℃ (0) 扫码查看

精准预测广告点击率(CTR)对于广告投放效果的提升还是蛮重要的,Python凭借其丰富的库和强大的数据处理能力,成为预测广告点击率的有力工具。接下来,我们就从基础方法入手,逐步深入到高级技巧,全面了解如何使用Python完成这一任务。

一、基础方法:基于简单特征的预测

(一)环境搭建

在开始预测广告点击率之前,需要先安装一些必备的Python库。这些库就像是我们在预测工作中的“得力助手”,分别负责不同的工作。打开终端,输入下面这条命令,就能把它们安装好:

pip install pandas numpy scikit-learn xgboost

其中,pandas用于数据处理,能帮助我们轻松地读取、清洗和整理数据;numpy擅长数值计算,处理各种数字运算都不在话下;scikit-learn提供了许多常用的机器学习算法;xgboost则是一种高性能的梯度提升算法,在处理大规模数据时表现出色。

(二)数据准备

假设手头有一份名为ad_clicks_dataset.csv的数据集,它包含了不少关键信息,比如用户ID(user_id)、年龄(age)、性别(gender)、广告ID(ad_id)、广告主题(ad_topic)、广告类型(ad_type)、时间戳(timestamp)以及是否点击(clicked)。这些信息就是我们进行预测的“原材料”。

(三)代码实践与步骤解析

下面这段代码展示了如何利用Logistic Regression和XGBoost这两种模型来预测广告点击率:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
import xgb as xgb
from sklearn.model_selection import GridSearchCV

# 加载数据集
data = pd.read_csv('ad_clicks_dataset.csv')

# 处理缺失值
data = data.fillna(method='ffill')

# 编码分类变量
le = LabelEncoder()
data['gender'] = le.fit_transform(data['gender'])
data['ad_topic'] = le.fit_transform(data['ad_topic'])
data['ad_type'] = le.fit_transform(data['ad_type'])

# 缩放数值特征
scaler = StandardScaler()
numerical_features = ['age']
data[numerical_features] = scaler.fit_transform(data[numerical_features])

# 分割数据集
X = data.drop(['user_id', 'ad_id', 'timestamp', 'clicked'], axis=1)
y = data['clicked']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练Logistic Regression模型
clf_lr = LogisticRegression()
clf_lr.fit(X_train, y_train)
y_pred_lr = clf_lr.predict(X_test)
print("Logistic Regression Accuracy:", accuracy_score(y_test, y_pred_lr))
print("Logistic Regression Classification Report:\n", classification_report(y_test, y_pred_lr))

# 训练XGBoost模型
xgb_model = xgb.XGBClassifier()
param_grid = {
   'max_depth': [3, 5, 7],
    'learning_rate': [0.1, 0.5, 1],
    'n_estimators': [50, 100, 200],
    'gamma': [0, 0.25, 1.0]
}
grid_search = GridSearchCV(estimator=xgb_model, param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)
best_model = grid_search.best_estimator_
y_pred_xgb = best_model.predict(X_test)
print("XGBoost Accuracy:", accuracy_score(y_test, y_pred_xgb))
print("XGBoost Classification Report:\n", classification_report(y_test, y_pred_xgb))
  1. 数据处理阶段:首先,使用pandasread_csv函数加载数据集。接着处理缺失值,这里采用ffill方法,简单来说就是用前一个非缺失值来填充当前缺失值。然后,对于像性别、广告主题、广告类型这样的分类变量,使用LabelEncoder进行编码,将它们转化为数字形式,方便模型处理。对于数值特征,比如年龄,通过StandardScaler进行缩放,让不同特征在数值上具有可比性。
  2. 数据集分割:把处理好的数据分成训练集和测试集,这里测试集占比20%,random_state设置为42是为了保证每次运行代码时,数据分割的结果都是一样的,方便我们进行比较和验证。
  3. 模型训练与评估:先训练Logistic Regression模型,训练完成后用测试集进行预测,并计算准确率和生成分类报告。然后训练XGBoost模型,通过GridSearchCV来寻找最优的超参数组合,找到最优模型后同样进行预测和评估。

(四)相关开源类库介绍

  1. Scikit – Learn:它就像是一个机器学习的“百宝箱”,里面包含了各种各样的机器学习算法,Logistic Regression就是其中之一。这个库使用起来很方便,对于初学者快速上手机器学习任务非常友好。
  2. XGBoost:它是一个高性能的梯度提升算法库,特别适合处理大规模数据。在面对复杂的数据关系时,它能展现出强大的学习能力,从而得到比较准确的预测结果。
  3. FuxiCTR:这是一个专门用于CTR预测的开源库,支持多种模型和框架。在实际应用中,如果需要尝试不同的模型来优化CTR预测,它会是一个不错的选择。

(五)案例分析

  • 案例1:不同模型比较:Logistic Regression比较适合处理简单的线性分类问题。比如,当数据中的特征和点击行为之间呈现比较简单的线性关系时,它能快速给出预测结果。而XGBoost在处理复杂的非线性关系时表现更出色。如果数据中的特征和点击行为之间的关系很复杂,不是简单的线性关系,XGBoost就能更好地捕捉这些关系,从而提高预测的准确性。
  • 案例2:超参数优化:使用GridSearchCV尝试不同的超参数组合,就像是在一个参数的“迷宫”里寻找最优路径。通过这种方式,可以找到最适合当前数据的模型配置,进一步提升模型的性能。

(六)代码优化方向

  1. 并行计算:利用多核CPU的优势,让计算过程更快。就好比让多个人一起干活,效率自然就提高了。这样可以减少模型训练和预测所花费的时间。
  2. 数据预处理:保证数据的清洁和格式化非常重要。这就像我们整理房间一样,把数据整理得井井有条,模型“工作”起来也会更高效,性能自然也就提高了。

二、高级方法:结合标题和图片特征预测

(一)引言

在预测广告点击率这件事上,标题和图片是两个非常重要的影响因素。接下来,我们就看看如何使用更高级的方法,把标题和图片的特征结合起来,更精准地预测CTR。

(二)环境准备

这次,除了之前安装的库,还需要安装一些新的库。在终端输入下面的命令:

pip install pandas numpy scikit-learn xgboost transformers torch torchvision

这些新安装的库主要用于处理文本和图像数据,帮助我们提取标题和图片中的有用信息。

(三)数据准备

假设有一个名为ad_data.csv的数据集,它包含了广告标题(title)、图片路径(image_path)和点击标签(clicked)这些信息。这些数据就是我们接下来进行高级预测的基础。

(四)代码实现与原理

下面这段代码展示了如何使用BERT和Swin Transformer结合标题和图片特征来预测CTR:

import pandas as pd
import torch
from transformers import BertTokenizer, BertModel
from torchvision import models, transforms
from torch.utils.data import Dataset, DataLoader
import torch.nn as nn
import torch.optim as optim

# 加载数据集
data = pd.read_csv('ad_data.csv')

# 定义数据集类
class AdDataset(Dataset):
    def __init__(self, data, tokenizer, transform):
        self.data = data
        self.tokenizer = tokenizer
        self.transform = transform

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        title = self.data.iloc[idx, 0]
        image_path = self.data.iloc[idx, 1]
        clicked = self.data.iloc[idx, 2]

        # 处理标题
        inputs = self.tokenizer(title, return_tensors='pt', max_length=512, padding='max_length', truncation=True)
        title_ids = inputs['input_ids'].squeeze()
        attention_mask = inputs['attention_mask'].squeeze()

        # 处理图片
        image = Image.open(image_path)
        image = self.transform(image)
        image = image.unsqueeze(0)

        return {
            'title_ids': title_ids,
            'attention_mask': attention_mask,
            'image': image,
            'clicked': torch.tensor(clicked, dtype=torch.long)
        }

# 初始化BERT和Swin模型
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
bert_model = BertModel.from_pretrained('bert-base-uncased')
swin_model = models.swin_bert_tiny(weights='IMAGENET1K_V1')

# 定义自定义模型
class AdModel(nn.Module):
    def __init__(self):
        super(AdModel, self).__init__()
        self.bert = bert_model
        self.swin = swin_model
        self.dropout = nn.Dropout(0.1)
        self.fc = nn.Linear(768 + 768, 2)

    def forward(self, title_ids, attention_mask, image):
        title_features = self.bert(title_ids, attention_mask=attention_mask).pooler_output
        image_features = self.swin(image).flatten()
        combined_features = torch.cat((title_features, image_features), dim=1)
        output = self.dropout(combined_features)
        output = self.fc(output)
        return output

# 初始化数据集和数据加载器
dataset = AdDataset(data, tokenizer, transform)
batch_size = 32
data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 训练模型
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = AdModel().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=1e-5)

for epoch in range(5):
    model.train()
    total_loss = 0
    for batch in data_loader:
        title_ids = batch['title_ids'].to(device)
        attention_mask = batch['attention_mask'].to(device)
        image = batch['image'].to(device)
        clicked = batch['clicked'].to(device)

        optimizer.zero_grad()

        outputs = model(title_ids, attention_mask, image)
        loss = criterion(outputs, clicked)

        loss.backward()
        optimizer.step()

        total_loss += loss.item()
    print(f'Epoch {epoch+1}, Loss: {total_loss / len(data_loader)}')

# 评估模型
model.eval()
with torch.no_grad():
    total_correct = 0
    for batch in data_loader:
        title_ids = batch['title_ids'].to(device)
        attention_mask = batch['attention_mask'].to(device)
        image = batch['image'].to(device)
        clicked = batch['clicked'].to(device)

        outputs = model(title_ids, attention_mask, image)
        _, predicted = torch.max(outputs, dim=1)
        total_correct += (predicted == clicked).sum().item()

    accuracy = total_correct / len(data)
    print(f'Test Accuracy: {accuracy:.4f}')
  1. 数据处理与数据集构建:先加载数据集,然后定义一个AdDataset类。在这个类里,对标题进行分词、编码等处理,把标题转化为模型能理解的数字形式;对图片则进行读取、缩放、归一化等操作。这样处理后的数据就可以方便地输入到模型中。
  2. 模型初始化:使用预训练的BERT和Swin Transformer模型,BERT擅长处理文本,Swin Transformer在图像领域表现出色。同时,定义一个自定义模型AdModel,把BERT和Swin Transformer的输出特征进行融合,再通过全连接层输出预测结果。
  3. 训练与评估:初始化数据集和数据加载器,把数据分成一个个小批次输入模型进行训练。在训练过程中,使用交叉熵损失函数和Adam优化器。训练完成后,对模型进行评估,计算预测的准确率。

(五)总结

通过结合BERT和Swin Transformer来处理标题和图片特征,可以显著提高CTR预测的准确性。这种方法利用了多模态特征融合技术,能够更好地捕捉用户的偏好和行为,从而为广告投放提供更精准的预测支持。

(六)案例拓展

  • CTR驱动的广告图像生成:利用多模态大语言模型生成CTR优化的广告图像。简单来说,就是根据预测CTR的结果,生成更有可能吸引用户点击的广告图像,从而提高广告的点击率。
  • 深度CTR预测模型:使用深度神经网络直接从原始图像像素和其他特征预测CTR。这种方法能够挖掘出数据中更深层次的信息,进一步提高预测的准确性。

掌握了这些用Python预测广告点击率的方法,无论是在面试中应对相关问题,还是在实际项目里优化广告投放效果,有兴趣的朋友可以去试试了,提高下自己投放广告的点击率。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/17167.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】