Kaggle实战——点击率预估

本文介绍了一个使用Kaggle广告数据集进行点击率预估的实战案例,涉及模型包括FFM, FM, GBDT和DNN。首先介绍了数据集的下载和处理,接着详细讲解了各个模型的原理,特别是FFM的Field概念和FM的矩阵分解思想。接着展示了如何预处理数据以供FFM, GBDT和DNN使用,最后通过LightGBM训练GBDT并利用其输出训练FM。文章提供了完整的代码和模型训练过程,以及训练结果的初步分析。" 120124681,7414383,Java编程命名规范详解,"['Java', '编程语言', '接口', '抽象类']

原创文章,转载请注明出处: http://blog.youkuaiyun.com/chengcheng1394/article/details/78940565

请安装TensorFlow1.0,Python3.5
项目地址:
https://github.com/chengstone/kaggle_criteo_ctr_challenge-

前言

点击率预估用来判断一条广告被用户点击的概率,对每次广告的点击做出预测,把用户最有可能点击的广告找出来,是广告技术最重要的算法之一。

数据集下载

这里写图片描述
这次我们使用Kaggle上的Display Advertising Challenge挑战的criteo数据集。
下载数据集请在终端输入下面命令(脚本文件路径:./data/download.sh):
wget –no-check-certificate https://s3-eu-west-1.amazonaws.com/criteo-labs/dac.tar.gz
tar zxf dac.tar.gz
rm -f dac.tar.gz
mkdir raw
mv ./*.txt raw/

解压缩以后,train.txt文件11.7G,test.txt文件1.35G。
数据量太大了,我们只使用前100万条数据。
head -n 1000000 test.txt > test_sub100w.txt
head -n 1000000 train.txt > train_sub100w.txt
然后将文件名重新命名为train.txt和test.txt,文件位置不变。

Data fields

Label

Target variable that indicates if an ad was clicked (1) or not (0).

I1-I13

A total of 13 columns of integer features (mostly count features).

C1-C26

A total of 26 columns of categorical features. The values of these features have been hashed onto 32 bits for anonymization purposes.

数据中含有Label字段,表示这条广告是否被点击,I1-I13一共13个数值特征(Dense Input),C1-C26共26个Categorical类别特征(Sparse Input)。

网络模型

这里写图片描述
模型包含三部分网络,一个是FFM(Field-aware Factorization Machines),一个是FM(Factorization Machine),另一个是DNN,其中FM网络包含GBDT和FM两个组件。通常在数据预处理的部分,需要做特征交叉组合等特征工程,以便找出帮助我们预测的特征出来,这绝对是技术活。

这次我们跳过特征工程的步骤,把这些组件和深度神经网络组合在一起,将挑选特征的工作交给模型来处理。其中FFM使用了LibFFM,FM使用了LibFM,GBDT使用了LightGBM,当然你也可以使用xgboost

GBDT

给入训练数据后,GBDT会训练出若干棵树,我们要使用的是GBDT中每棵树输出的叶子结点,将这些叶子结点作为categorical类别特征输入给FM。有关决策树的使用,请参照Facebook的这篇文章Practical Lessons from Predicting Clicks on Ads at Facebook
这里写图片描述

FM

FM用来解决数据量大并且特征稀疏下的特征组合问题,先来看看公式(只考虑二阶多项式的情况):n代表样本的特征数量, xi 是第i个特征的值, w0 wi wi j 是模型参数。
这里写图片描述
从公式可以看出来这是在线性模型基础上,添加了特征组合 xixj ,当然只有在特征 xi xj 都不为0时才有意义。然而在实际的应用场景中,训练组合特征的参数是很困难的。因为输入数据普遍存在稀疏性,这导致 xi xj 大部分情况都是0,而组合特征的参数 wi j 只有在特征不为0时才能训练出有意义的值。

比如跟购物相关的特征中,女性可能会更关注化妆品或者首饰之类的物品,而男性可能更关注体育用品或者电子产品等商品,这说明特征组合训练是有意义的。而商品特征可能存在几百上千种分类,通常我们将类别特征转成One hot编码的形式,这样一个特征就要变成几百维的特征,再加上其他的分类特征,这导致输入的特征空间急剧膨胀,所以数据的稀疏性是实际问题中不可避免的挑战。

为了解决二次项参数训练的问题,引入了矩阵分解的概念。在上一篇文章中我们讨论的是电影推荐系统,我们构造了用户特征向量和电影特征向量,通过两个特征向量的点积得到了用户对于某部电影的评分。如果将用户特征矩阵与电影特征矩阵相乘就会得到所有用户对所有影片的评分矩阵。

如果将上面的过程反过来看,实际上对于评分矩阵,我们可以分解成用户矩阵和电影矩阵,而评分矩阵中每一个数据点就相当于上面讨论的组合特征的参数 wi j

对于参数矩阵W,我们采用矩阵分解的方法,将每一个参数 wi j 分解成两个向量(称之为隐向量)的点积。这样矩阵就可以分解为 W=VTV ,而每个参数

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值