行业资讯 2025年08月6日
0 收藏 0 点赞 631 浏览 7520 个字
摘要 :

文章目录 一、基础方法:基于简单特征的预测 (一)环境搭建 (二)数据准备 (三)代码实践与步骤解析 (四)相关开源类库介绍 (五)案例分析 (六)代码优化方向 ……




  • 一、基础方法:基于简单特征的预测
    • (一)环境搭建
    • (二)数据准备
    • (三)代码实践与步骤解析
    • (四)相关开源类库介绍
    • (五)案例分析
    • (六)代码优化方向
  • 二、高级方法:结合标题和图片特征预测
    • (一)引言
    • (二)环境准备
    • (三)数据准备
    • (四)代码实现与原理
    • (五)总结
    • (六)案例拓展

    精准预测广告点击率(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.zuozi.net/10501.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号