【数据挖掘实战】——科大讯飞:跨境广告ROI预测(Baseline)

news2024/11/20 3:29:05

🤵‍♂️ 个人主页:@Lingxw_w的个人主页

✍🏻作者简介:计算机科学与技术研究生在读
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 

目录

一、赛题背景

二、赛事任务

三、赛题数据

四、评价指标

五、Baseline解题思路

1、读取数据

2、数据预处理

3、LGBMRegressor

4、可视化


一、赛题背景

跨境电商广告 ROI(收入/广告消耗)预测一直以来都是效果类广告领域的重要挑战。在当前全球化背景下,海外媒体流量成本不断攀升,加之广告主对广告投入产出的关注日益加强,使得对广告投放效果的预测成为当下迫切需要解决的问题。

在解决这个问题过程中,人工智能和大数据技术发挥着至关重要的作用。通过对广告投放数据的深入分析,我们可以挖掘出潜在的规律和趋势,从而为广告主提供更精准的效果预测。这样的预测结果可以帮助广告主更好地制定广告策略,优化广告素材和投放时机,以提高整体营销效能。

二、赛事任务

本次大赛提供了讯飞AI营销旗下独立站电商业务的广告投放数据作为训练样本。参赛选手需基于所提供的数据样本构建预测模型,并在每天的前 13 小时内,每小时生成当日 ROI 的预测值。这将有助于检验选手模型在不同时间点的预测准确性,进而优化广告投放策略。

三、赛题数据

出于数据安全保证的考虑,所有数据均为脱敏处理后的数据。训练集提供了若干天中13点以前每小时的样本,每条记录以广告ID和日期作为标识,其特征数据包含该小时内各类广告指标信息,标签是该广告在当天的ROI。测试集的区别仅为每条记录不包含当天的ROI字段。具体的数据字段定义将随数据集一起提供。

 下载地址:Datamining_project: 数据挖掘实战项目代码

赛题数据集由三部分组成:

  • 基础信息(用户、广告)

  • 当前投放信息(广告)

  • 累计投放信息(广告)

四、评价指标

依据提交的结果文件,采用加权平均绝对误差(Weighted Mean Absolute Error, WMAE)进行评价。

WMAE 的定义如下:

WMAE = (1/N) * Σ [w(t) * |y_true(t) - y_pred(t)|]

其中,N 是预测样本数量;w(t) 是时间加权因子,范围为 [0, 1],随着 t(当前小时)接近 12(一天中午以前)而递增。我们选用线性递增函数表示 w(t):w(t) = (t+1)/ 13,其中 t 为当前小时(0-12);y_true(t) 是真实的当天 ROI;y_pred(t) 是预测的当天 ROI。

通过使用 WMAE 作为评估指标,我们鼓励参赛者开发出在一整天各个时间点都表现良好的预测模型。排名将根据参赛者提交的预测结果的 WMAE 从低到高进行,WMAE 越低表示预测性能越好。请注意不要使用规则将每天其他小时的预测值用最后一小时预测值替代,任何利用数据泄露提交的结果,最终成绩都将被作废。

五、Baseline解题思路

赛题是一个比较典型的计算广告类型的题目,需要对ROI进行回归。但在题中包含了较多的ID类型,如用户ID和广告ID等。

此外赛赛题中还报告了时间因素,可从用户+广告的角度考虑进一步的特征工程。

导入需要的一些库;

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

1、读取数据

读取数据

train_data = pd.read_csv('跨境电商效果广告ROI预测挑战赛公开数据/train.csv')
test_data = pd.read_csv('跨境电商效果广告ROI预测挑战赛公开数据/testA.csv')

train_data['datetime'] = pd.to_datetime(train_data['datetime'])
test_data['datetime'] = pd.to_datetime(test_data['datetime'])
train_data['datetime_hour'] = train_data['datetime'].dt.hour
test_data['datetime_hour'] = test_data['datetime'].dt.hour

train_data.drop('datetime', axis=1, inplace=True)
test_data.drop('datetime', axis=1, inplace=True)

2、数据预处理

在训练模型之前,我们通常都要对训练数据进行一定的处理。将类别编号就是一种常用的处理方法,比如把类别“男”,“女”编号为0和1。可以使用sklearn.preprocessing中的LabelEncoder处理这个问题。

将n个类别编码为0~n-1之间的整数(包含0和n-1)。LabelEncoder

from sklearn.preprocessing import LabelEncoder

for col in ['ad_id', 'ad_set_id', 'campaign_id', 'product_id', 'account_id', 'post_id_emb', 'post_type', 'countries']:
    lbl = LabelEncoder()
    lbl.fit(list(train_data[col]) + list(test_data[col]))
    train_data[col] = lbl.transform(list(train_data[col]))
    test_data[col] = lbl.transform(list(test_data[col]))

3、LGBMRegressor

from lightgbm import LGBMRegressor
model = LGBMRegressor()

train_data['product_id_roi_mean'] = train_data['product_id'].map(train_data.groupby(['product_id'])['roi'].mean())
test_data['product_id_roi_mean'] = test_data['product_id'].map(train_data.groupby(['product_id'])['roi'].mean())

train_data['account_id_roi_mean'] = train_data['account_id'].map(train_data.groupby(['account_id'])['roi'].mean())
test_data['account_id_roi_mean'] = test_data['account_id'].map(train_data.groupby(['account_id'])['roi'].mean())

train_data['countries_roi_mean'] = train_data['countries'].map(train_data.groupby(['countries'])['roi'].mean())
test_data['countries_roi_mean'] = test_data['countries'].map(train_data.groupby(['countries'])['roi'].mean())

train_data['datetime_hour_roi_mean'] = train_data['datetime_hour'].map(train_data.groupby(['datetime_hour'])['roi'].mean())
test_data['datetime_hour_roi_mean'] = test_data['datetime_hour'].map(train_data.groupby(['datetime_hour'])['roi'].mean())

model.fit(
    train_data.iloc[:].drop('roi', axis=1),
    train_data.iloc[:]['roi'], categorical_feature=['ad_id', 'ad_set_id', 'campaign_id', 'product_id', 'account_id', 'post_id_emb', 'post_type', 'countries']
)

df = pd.read_csv('提交示例.csv')
df['roi'] = model.predict(test_data.iloc[:].drop('uuid', axis=1))
df.to_csv('submit.csv', index=None)

4、可视化

# coding: utf-8
import lightgbm as lgb
import pandas as pd
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV

# 加载数据
print('加载数据...')
df_train = pd.read_csv('../data/regression.train.txt', header=None, sep='\t')
df_test = pd.read_csv('../data/regression.test.txt', header=None, sep='\t')

# 取出特征和标签
y_train = df_train[0].values
y_test = df_test[0].values
X_train = df_train.drop(0, axis=1).values
X_test = df_test.drop(0, axis=1).values

print('开始训练...')
# 直接初始化LGBMRegressor
# 这个LightGBM的Regressor和sklearn中其他Regressor基本是一致的
gbm = lgb.LGBMRegressor(objective='regression',
                        num_leaves=31,
                        learning_rate=0.05,
                        n_estimators=20)

# 使用fit函数拟合
gbm.fit(X_train, y_train,
        eval_set=[(X_test, y_test)],
        eval_metric='l1',
        early_stopping_rounds=5)

# 预测
print('开始预测...')
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration_)
# 评估预测结果
print('预测结果的rmse是:')
print(mean_squared_error(y_test, y_pred) ** 0.5)

参考链接:

机器学习应用之LGBM详解 - 知乎

2023 iFLYTEK A.I.开发者大赛-讯飞开放平台

其他数据挖掘实战案例: [订阅链接]

【数据挖掘实战】——航空公司客户价值分析(K-Means聚类案例)

【数据挖掘实战】——中医证型的关联规则挖掘(Apriori算法)

【数据挖掘实战】——家用电器用户行为分析及事件识别(BP神经网络)

【数据挖掘实战】——应用系统负载分析与容量预测(ARIMA模型)

【数据挖掘实战】——电力窃漏电用户自动识别(LM神经网络和决策树)

【数据挖掘实战】——基于水色图像的水质评价(LM神经网络和决策树)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端Vue自定义列表表格信息展示可用于商品规格参数展示

前端Vue自定义列表表格信息展示可用于商品规格参数展示 &#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13131 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- table-list:表格数组 数组里对象可自定义字段 …

Kubernetes 和 Prometheus

资源监控系统是容器编排系统必不可少的组件&#xff0c;也是服务治理的核心之一。而 Prometheus 本质上是一个开源的服务监控系统和时序数据库&#xff0c;是 CNCF 起家的第二个项目&#xff0c;目前已经成为 Kubernetes 生态圈中的监控系统的核心。 Prometheus 的核心组件 Pro…

Run in PaddleX 2.0,一站式搞定飞桨精选模型开发全流程!

2020年4月&#xff0c;飞桨推出了 PaddleX 全流程开发工具&#xff08;以下简称 PaddleX 1.0 系列&#xff09;&#xff0c;其在社区收获了广泛的影响力。PaddleX 1.0 系列采用本地单机版的方式&#xff0c;将深度学习开发全流程从数据准备、模型训练与优化到多端部署端到端打通…

【支付系统】如何生成订单号

通常我们都会用数据库中的主键作为订单号,而id的生成方式又以自增,uuid,雪花id最为常见.但是这些并不适合作为订单号.订单号一般要体现出年月日等信息.方便快速定位是哪个时间的订单.如果我们直接使用时间作为id,会有重复的可能.这里就给大家介绍一种最为简单的一种方式. 时间自…

企业进销存管理系统的设计与实现_kaic

摘 要 企业的进销存管理系统在日常经营过程中起着至关重要的作用&#xff0c;直接影响产品生产 的成本、进度、质量和企业效益。本论文项目以某化工企业对进销存管理系统的需求为 背景&#xff0c;针对企业存在的部门运作独立、信息资源共享度低等造成的进销存管理低率低下、 有…

【console】console用法大全:

文章目录 一、console.log普通信息/console.info提示性信息/console.error错误信息/console.warn警示信息二、console.time()和console.timeEnd()>查看执行所用时间三、console.group()和console.groupEnd()>让控制台输出的语句产生不同的层级嵌套关系四、console.profil…

什么是HTTP 500内部服务器错误,要怎么修复

HTTP 500是一种原始的错误代码&#xff0c;它指示网站服务器在处理请求时发生了内部错误&#xff0c;不过具体错误原因是不确定的。一般情况下&#xff0c;这种错误通常是由服务器程序上的bug或者配置问题造成的。当服务器收到请求时&#xff0c;尝试执行它时&#xff0c;但是发…

使用径向基函数(RBF)神经网络对我们自己的excel数据进行分类---包括详细的python代码,RBFRegressor

文章目录 一、 径向基神经网络&#xff08;Radial Basis Function Neural Network&#xff09;是什么&#xff1f;二、径向基函数(RBF)神经网络对我们自己的excel数据进行分类---包括详细的python代码总结 一、 径向基神经网络&#xff08;Radial Basis Function Neural Networ…

Go 将引入标准库 v2 版本,首个动手的是:math/rand/v2!

大家好&#xff0c;我是煎鱼。 最近 Go 核心团队负责人 Russ Cox&#xff08;下称&#xff1a;rsc&#xff09;发起了一项 “讨论”。希望正式开启 Go 标准库的 v2 版本&#xff0c;相当于老树发新芽了。 Go 标准库升级 v2 原因 这次会发起这个提案的最直接原因是&#xff1a;我…

编译原理笔记8:语法分析(2)上下文无关文法 CFG

目录 CFG 概述及其四元组表示产生式集合表示 CFGCFG&#xff0c;用推导&#xff0c;产生语言直接推导由 CFG 产生语言在&#xff1f;为啥从右往左叫规范&#xff1f;凭什么歧视左&#xff1f; 总结一下这些奇奇怪怪的东西 前几篇博客中说到的词法分析&#xff0c;做的是从 【xy…

驱动开发:内核注册表增删改查

注册表是Windows中的一个重要的数据库&#xff0c;用于存储系统和应用程序的设置信息&#xff0c;注册表是一个巨大的树形结构&#xff0c;无论在应用层还是内核层操作注册表都有独立的API函数可以使用&#xff0c;而在内核中读写注册表则需要使用内核装用API函数&#xff0c;如…

Spring Cloud灰度部署

1、背景(灰度部署) 在我们系统发布生产环境时&#xff0c;有时为了确保新的服务逻辑没有问题&#xff0c;会让一小部分特定的用户来使用新的版本&#xff08;比如客户端的内测版本&#xff09;&#xff0c;而其余的用户使用旧的版本&#xff0c;那么这个在Spring Cloud中该如何…

第五届双态IT北京用户大会回顾 | 基于运维数据治理的数智化转型

专题演讲人&#xff1a;擎创科技CTO 葛晓波 文末附有本场专题演讲视频 ●前言 各行业的云原生发展程度各有不同&#xff0c;并不是所有业务应用都适合云原生的形态&#xff0c;如若过度追求云原生化反而会使得企业运维压力骤增&#xff0c;运维成本激增。 从数字化转型的角度…

软考:软件工程:软件定义,特点,软件生命周期,软件危机,软件开发模型

软考&#xff1a;软件工程: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1&#…

C++——vector容器模拟实现

目录 1. 基本成员函数 2. 默认成员函数 2.1 构造函数 2.2 析构函数 2.3 拷贝构造函数 2.4 赋值运算符重载函数 3. 容器访问相关函数 3.1 operator[ ]运算符重载 3.2 迭代器 3.3 范围for 4. vector空间增长问题 4.1 vector 容量和大小 4.2 vector扩容 4.3 重新定义…

均匀B样条采样从LiDAR数据中快速且鲁棒地估计地平面

文章&#xff1a;Fast and Robust Ground Surface Estimation from LiDAR Measurements using Uniform B-Splines 作者&#xff1a;Sascha Wirges, Kevin Rsch, Frank Bieder and Christoph Stiller 编辑&#xff1a;点云PCL 代码&#xff1a; https://github.com/KIT-MRT/poin…

全志V3S嵌入式驱动开发(编译器升级到7.5)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 看过我们文章的朋友都知道&#xff0c;前面为了做v3s的驱动&#xff0c;对linux kernel进行了两次升级。第一次升级是从4.10.y升级到4.14.y&#x…

【Python】open打开文件出现的错误解决

一、Python中关于打开open打开文件出现的错误解决 &#xff08;第一种&#xff09;UnicodeDecodeError: ‘utf-8’.......... &#xff08;第二种&#xff09;UnicodeDecodeError: ‘gbk’......... 二、问题解决 两种解决方式针对不同错误&#xff0c;实际应用中可以都试试…

PCB设计实验|第五周|LED显示电路PCB库设计|3月27日

目录 实验四 LED显示电路PCB库设计 一、实验原理 二、实验环境 三、实验结果 四、实验总结 实验四 LED显示电路PCB库设计 一、实验原理 LED(Light- Emitting-Diode中文意思为发光二极管)是一种能够将电能转化为可见光的半导体&#xff0c;它改变了白炽灯钨丝发光与节能…

裁剪图片软件有哪些?这些图片裁剪工具很好用

有哪些好用的图片裁剪软件呢&#xff1f;有时候&#xff0c;将一张大图缩小到更小的尺寸可以改善图片的质量&#xff0c;因为它可以减少像素和噪点。这对于那些需要在网上展示高质量图片的人来说尤其重要。裁剪后的图片可能更清晰、更锐利&#xff0c;并且更适合在各种设备上观…