热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PaddlePaddle实战|KDD Cup Regular ML Track基线实现解析

素有数据挖掘领域“世界杯”之称的KDDCup正在火热进行中,百度作为此次大赛的主办方,除了提供10,000美金特别奖,还为使用Paddle

素有数据挖掘领域“世界杯”之称的KDD Cup正在火热进行中,百度作为此次大赛的主办方,除了提供10,000美金特别奖,还为使用PaddlePaddle的参赛选手精心提供了KDD Cup Regular ML Track基线支持,此基线能够在Linux和单机CPU/GPU上运行,通过使用基线,参赛队伍可以更方便地进行特征工程和网络的优化,高效完成训练,并获得更好的结果。

为了让选手更方便地使用此基线,我们将为大家剖析KDD Cup Regular ML Track基线的技术特点和使用过程。

本文对应代码地址:

https://github.com/PaddlePaddle/models/tree/develop/PaddleRec/ctr/Paddle_baseline_KDD2019

阅读本文请参考GitHub代码库。

数据预处理

问题定义:

通过给定的用户query记录,展示记录,用户对出行方式点击行为等原始数据预测用户选择的出行方式(transportmode 1 - transport mode 11)。注意有一部分记录(plans)没有返回点击行为,题目要求没有点击同样需要预测。我们将问题重新定义为二分类问题。对每一个transport mode的点击行为都给出一个0到1的概率值(包括上述未点击行为,强行定义为transport mode 0),进而表示为对给定一种mode的ctr预估问题。

特征预处理:

特征预处理的作用是将原始数据转换成一条一条可以用作训练模型的实例(instances)。我们采用json格式保存instances,其中一条instance的json示例:

{"mode_min_distance": 1,"pid": "","weather": {"min_temp": "10","wea": "q","wind": "12","max_temp": "25"},"plan_rank": 1,"query": {"hour": "09","weekday": "3","d2": 40.0,"o2": 39.92,"o1": 116.43,"d1": 116.57},"eta_rank": 3,"label": 0,"mode_min_eta": 3,"price_rank": 3,"profile": [0],"mode_rank1": 11,"mode_rank2": 3,"mode_rank3": 4,"mode_rank4": 7,"mode_rank5": 1,"mode_max_eta": 1,"plan": {"distance": 0.13730889964270376,"price": 0.00760043431053203,"eta": 0.07021413598936856,"transport_mode": 11},"mode_max_distance": 7,"whole_rank": 5,"mode_max_price": 4,"mode_min_price": -1,"distance_rank": 4
}

注意每一条instance通过json直接解析成Python的dict结构(本文例子中有dict嵌套结构),我们可以自定义生成自己的特征和label供模型训练或者预测,dict中的键为特征名,值为特征值。

代码:preprocess_dense.py/preprocess.py 为训练样本生成代码, pre_test_dense.py/pre_process_test.py 为测试样本生成代码。带有dense后缀的为生成dense特征和sparse特征的处理脚本,不带后缀的为全sparse特征的处理脚本。具体选用哪种生成策略或者结合两种生成策略可自定义处理,这里仅提供大致思路,特征工程方面的拓展工作在此框架下比较方便。本文后续实现模型将以同时生成dense和sparse特征为例,详情见preprocess_dense.py。

组建模型

本文采用模型参考DeepFM论文(https://arxiv.org/abs/1703.04247),参见network_confv6, 其他基于fm&deep的更加花哨的模型组建请参考networks文件夹下其他文件,读者也可以开脑洞自定义实现,注意使用其他模型的时候需要对应修改instance喂入模型的格式。

训练模型

定义instance喂入模型格式

本文使用PaddlePaddle Dataset接口。Dataset是一个工厂类,有如下两种:

(1)QueueDataset:每轮训练从指定的文件列表里读取数据。

(2)InMemoryDataset:用户可以调用LoadIntoMemory把数据读到内存。每轮训练从内存中读取数据。

用户创建Dataset时,默认是QueueDataset(具体使用查看文档)。参见map_reader.py中实现MapDataset示例, 在用户实现的dataset类中,用户可以根据自己的特征实现任意的处理逻辑,在generate_sample()函数中定义每个instance输入到模型的格式,注意在示例中,一共通过feature_name定义了 "dense_feature", "context" + str(idx), "context_fm","label" 这四类输入格式。在local_train.py中使用dataset的示例:

dense_feature = fluid.layers.data(name="dense_feature",shape=[DIM_DENSE_FEATURE], dtype='float32')
context_feature = [fluid.layers.data(name="context"+ str(i), shape=[1], lod_level=1, dtype="int64")for i in range(0,NUM_CONTEXT_FEATURE)]
context_feature_fm = fluid.layers.data(name="context_fm",shape=[1], dtype='int64', lod_level=1)
label = fluid.layers.data(name='label', shape=[1],dtype='int64')print("ready to network")
loss, auc_var, batch_auc_var, accuracy, predict =ctr_deepfm_dataset(dense_feature, context_feature, context_feature_fm, label,args.embedding_size,args.sparse_feature_dim)print("ready to optimize")
optimizer = fluid.optimizer.SGD(learning_rate=1e-4)
optimizer.minimize(loss)
exe = fluid.Executor(fluid.CPUPlace())
exe.run(fluid.default_startup_program())
dataset = fluid.DatasetFactory().create_dataset()
dataset.set_use_var([dense_feature] + context_feature +[context_feature_fm] + [label])
pipe_command = PYTHON_PATH + " map_reader.py%d" % args.sparse_feature_dim
dataset.set_pipe_command(pipe_command)
dataset.set_batch_size(args.batch_size)
thread_num = 1
dataset.set_thread(thread_num)

注意set_pipe_command(pipe_command), pipe command是对原始的数据做处理,生成PaddlePaddle可以识别的格式。Dataset读取的每一行原始数据,都会用这里的命令做处理。可以是一个执行python脚本或者二进制等任意Linux命令,用户可以写自己的逻辑。pipe command生成var的顺序需要和set_user_var保持一致。

接下来就需要在pipe_command中处理数据。

在Pipe Command中处理数据

PaddlePaddle中提供了基类paddle.fluid.incubate.data_generator.MultiSlotDataGenerator,用户可以继承并实现自己的处理数据的逻辑。生成的数据需要与set_use_var中设置的顺序保持一致。具体代码参考map_reader.py中自定义处理原始数据代码,用户需实现generate_sample()函数来处理每一行数据:

def _process_line(self, line):instance &#61; json.loads(line)"""profile &#61;instance["profile"]len_profile &#61; len(profile)if len_profile >&#61; 10:user_profile_feature&#61; profile[0:10]else:profile.extend([0]*(10-len_profile))user_profile_feature&#61; profileif len(profile) > 1 or (len(profile)&#61;&#61; 1 and profile[0] !&#61; 0):for p inprofile:ifp >&#61; 1 and p <&#61; 65:user_profile_feature[p- 1] &#61; 1"""context_feature &#61; []context_feature_fm &#61; []dense_feature &#61; [0] *self.dense_lengthplan &#61; instance["plan"]for i, val inenumerate(self.dense_feature_list):dense_feature[i]&#61; plan[val]if (instance["pid"] &#61;&#61;""):instance["pid"]&#61; 0query &#61;instance["query"]weather_dic &#61;instance["weather"]for fea in self.pid_list:context_feature.append([hash(fea&#43; str(instance[fea])) % self.hash_dim])context_feature_fm.append(hash(fea&#43; str(instance[fea])) % self.hash_dim)for fea inself.query_feature_list:context_feature.append([hash(fea&#43; str(query[fea])) % self.hash_dim])context_feature_fm.append(hash(fea&#43; str(query[fea])) % self.hash_dim)for fea inself.plan_feature_list:context_feature.append([hash(fea&#43; str(plan[fea])) % self.hash_dim])context_feature_fm.append(hash(fea&#43; str(plan[fea])) % self.hash_dim)for fea inself.rank_feature_list:context_feature.append([hash(fea&#43; str(instance[fea])) % self.hash_dim])context_feature_fm.append(hash(fea&#43; str(instance[fea])) % self.hash_dim)for fea inself.rank_whole_pic_list:context_feature.append([hash(fea&#43; str(instance[fea])) % self.hash_dim])context_feature_fm.append(hash(fea&#43; str(instance[fea])) % self.hash_dim)for fea in self.weather_feature_list:context_feature.append([hash(fea&#43; str(weather_dic[fea])) % self.hash_dim])context_feature_fm.append(hash(fea&#43; str(weather_dic[fea])) % self.hash_dim)label &#61;[int(instance["label"])]return dense_feature, context_feature,context_feature_fm, labeldef generate_sample(self, line):def data_iter():dense_feature,sparse_feature, sparse_feature_fm, label &#61; self._process_line(line)#feature_name&#61; ["user_profile"]feature_name&#61; []feature_name.append("dense_feature")for idxin self.categorical_range_:feature_name.append("context"&#43; str(idx))feature_name.append("context_fm")feature_name.append("label")yieldzip(feature_name, [dense_feature] &#43; sparse_feature &#43; [sparse_feature_fm] &#43;[label])return data_iter

至此&#xff0c;模型定义&#xff0c;数据格式处理逻辑&#xff0c;训练流程都已确定&#xff0c;执行Python local_trian.py就可以开始训练了。

相信你已经掌握了如何使用KDD Cup Regular ML Track 基线&#xff0c;快去实际操作吧。如果还没有报名参加KDD Cup 2019&#xff0c;点击前往https://dianshi.baidu.com/competition/29/rule&#xff0c;报名截止日期为2019年5月23日。

百度大脑AI Studio还为此次参赛选手提供了免费Tesla V100的算力支持。作为当前性能最好的工业级训练卡之一&#xff0c;参赛者选择一人一卡&#xff08;单机&#xff09;项目模式下不必再担心CPU性能不足的问题。前往https://aistudio.baidu.com/aistudio/questionnaire?activityid&#61;371&#xff0c;或点击左下角“阅读原文”&#xff0c;即可在线申请算力邀请码。

参赛过程中如有任何疑问&#xff0c;欢迎加入KDD Cup 2019官方讨论群。入群方法如下&#xff1a;

识别下方二维码&#xff0c;添加PaddlePaddle小助手&#xff08;申请时请备注“KDD”&#xff09;&#xff0c;小助手会在第一时间邀您入群。

更多信息欢迎关注&#xff1a;

https://github.com/PaddlePaddle/models/tree/develop/PaddleRec/ctr/Paddle_baseline_KDD2019


推荐阅读
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 学习Linux下使用caffe进行模型训练(三)
    前言不管是训练过程中,查看网络学习的状态,还是训练结束后,使用模型去执行特定任务,都需要一个可被观察的输出呈现在研究者面前,最好是可视化的图形而非冰冷的数字。因此,本次讲的是通过c ... [详细]
  • Matplotlib在数据科学中的可视化应用与技术解析
    Matplotlib和数据可视化 数据的处理、分析和可视化已经成为Python近年来最为重要的应用领域之一,其中数据的可视化指的是将数据呈现为漂亮的统计图表ÿ ... [详细]
  • 吴裕雄数据挖掘实战案例(13):GBDT模型的深入应用与解析
    #导入第三方包importpandasaspdimportmatplotlib.pyplotasplt#读入数据defaultpd.read_excel(r&amp;# ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文将详细探讨 Python 编程语言中 sys.argv 的使用方法及其重要性。通过实际案例,我们将了解如何在命令行环境中传递参数给 Python 脚本,并分析这些参数是如何被处理和使用的。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 深入探讨前端代码优化策略
    本文深入讨论了前端开发中代码优化的关键技术,包括JavaScript、HTML和CSS的优化方法,旨在提升网页加载速度和用户体验。 ... [详细]
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • PHP开发人员薪资水平分析:工程师平均工资概况
    PHP开发人员薪资水平分析:工程师平均工资概况 ... [详细]
  • 在Windows环境下离线安装PyTorch GPU版时,首先需确认系统配置,例如本文作者使用的是Win8、CUDA 8.0和Python 3.6.5。用户应根据自身Python和CUDA版本,在PyTorch官网查找并下载相应的.whl文件。此外,建议检查系统环境变量设置,确保CUDA路径正确配置,以避免安装过程中可能出现的兼容性问题。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 原文:http:blog.csdn.netdamotianshengarticledetails406284171.Knn算法介绍:百度百科:http:baike.b ... [详细]
author-avatar
HH小娃娃
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有