点击率预估

kaggle-2014-criteo-3 Idiots

数据集有13维数值型特征和26维hash编码的类别型特征。评价指标是logloss,取得了0.444的成绩。主要使用了GBDT和FFM。

步骤:

  1. 为GBDT准备特征。包括13维数值型特征,以及对26维类别型特征做特征编码后出现次数超过4百万次的稀疏特征。
  2. 使用GBDT进行训练,30棵深度为7的树。获取30维类别型特征——特征名:特征值=treeNum:LeafNum。
  3. 为FFM准备特征。
    • 13维数值型特征中,大于2的特征值变为 (log(x))2 ;小于2的特征值变为’SP’+str(value),其中SP代表special value,value是特征的取值。然后将这13维数值型特征当做类别型特征处理,进行one-hot编码
    • 26维类别型特征中,出现次数小于10的特征值变成’less’。例如对于类别型特征C1,第1~3个样本的取值是78c64a1d,第4~7个样本的取值为65a24a1d。做onehot编码后,特征C1-78c64a1d有3个样本取值为1,特征C1-65a24a1d有4个样本取值为1。那么在处理第1~3个样本时,把C1:78c64a1d编码为C1less:1;在处理第4~7个样本时,把C1:65a24a1d编码成C1less:1。
    • 30维GBDT特征直接被包含进来
    • 对上述三组特征做hash编码,转换成 106 维特征
  4. 使用FFM进行训练,k=4。对于只在训练集中出现的特征值,对应的权重为0。
  5. 平均CTR在训练集中是0.263,在提交的测试集中是0.266,因此对每一个预测值-0.003

为什么可以使用GBDT作为高维特征?

为了增强线性模型的表达能力,可以在特征工程上多下功夫。比如把连续特征(如年龄)离散化,20~25编码成类别1,26~40编码成类别2,然后做onehot编码,送入分类器训练,等价于为每一个类别训练了一个线性分类器,这样原本的线性模型就变成了分段线性的模型,即非线性模型。又比如把两个类别型的特征组合起来,性别+商品类别=新特征,在点击率预估的应用中,为女性+化妆品训练一个权重,肯定比单独为女性训练一个权重,为化妆品训练一个权重的拟合效果更好。因为如果化妆品的权重高了,那么男性+化妆品的点击率肯定也高,这就不大合适了。

GBDT特征可以看作是上述两种特征变换的实现。就一棵树来说,从根节点到叶子节点代表了一条建立在多个特征上的规则,也许是26

为什么可以用hash编码来处理特征?

来源:http://blog.csdn.net/dm_ustc/article/details/45771757

特征维数太高,使用hash trick可以降维。原本n维的特征向量通过hash变成d维,此时肯定有多个原始维度冲突的情形,但实验表明这对问题求解影响不大(参考链接1)。

  1. Simple and scalable response prediction for display advertising 。
  2. Feature Hashing for large scale multitask learning。经典。
  3. Hashing algorithm for large scale learning。介绍最小哈希在特征哈希的作用。
  4. http://www.cnblogs.com/kemaswill/p/3903099.html
  5. http://hunch.net/~jl/projects/hash_reps/。有微博大牛转发过这条链接。是hash trick应用在机器学习中论文总结。
  6. https://breezedeus.github.io/2014/11/20/breezedeus-feature-hashing.html。结合实际项目谈在multi-task中的应用,总结的挺好。

kaggle-2015-avazu-owenzhang

利用2014年10月21日00时~2014年10月30日23时的数据做训练,预测2014年10月31日的点击率

特征工程
  1. 对组合 site/app based features进行平均数编码,构建exp_features特征,特征取app_or_web, app_site_id, as_domain等。

    exp_feature=_sum+credkmean_cnt+credk

    其中 _sum_cnt 是在给定特征值下的点击率, mean 是所有样本的点击率, credk 是先验概率的权重。第21天的样本的exp_feature是0,第23天的exp_feature中的 _sum_cnt mean 根据21、22两天的数据计算。代码里提供了last_day_only选项,即只考虑第22天的数据,但是默认是FALSE,可能效果不如考虑全部历史数据好。除此之外,app_id=ecad2386占了绝大多数样本,因此设计特征app_or_web=app_id==’ecad2386’?1:0,先对app_or_web做meanEncode,获得的exp_app_or_web作为mean传入其它特征的平均数编码的计算。

  2. 构建exp2_feature特征,其中特征取app_or_web, device_ip, app_site_id等。对于第23天的样本,根据21、22天的样本,对每一个特征计算

    diff=(_sum+credk_mean_mean(_cnt+credk))power

    即后验概率与先验概率之比。代码中power=0.25。然后更新先验概率
    _mean=_meandiff

    直至循环完成。对第23天的样本,exp2_feature=diff_feature。feature_diff是根据21、22天计算的。而根据21、22天,预测第23天的样本被点击的概率,可根据公式


    pred=_mean0featuresdiff_featurepred=pred_mean0mean(pred)

    其中 _mean0 是21,22天的总点击率。预测的logloss在0.4左右。

  3. 将时间特征转换成距离2014年10月21日00时,已过多少小时。 根据当前小时的对该device_ip的推荐次数,前一小时的推荐次数、后一小时的推荐次数、今天的推荐次数、昨天的推荐次数、今天的推荐次数-昨天的推荐次数、昨天的点击率构建7个特征。

  4. FM特征。用第21天的数据训练FM,获取第22天各样本被点击的概率;用第21、22天的数据训练FM,获取第23天各样本被点击的概率,以此类推。

  5. GBDT特征。n_trees = 30, max_depth=6, eta=0.3, min_child_weight=50, colsample_bytree=0.5。

分类器
  1. 8个RandomForest分类器,取8个分类器输出的均值。n_estimators=32, max_depth=40, min_samples_split=100, min_samples_leaf=10, max_features=8。每次随机抽取30%的样本做训练。

  2. 4个xgboost分类器,取4个分类器输出的均值。xgb_n_trees = 300, max_depth=15, eta=0.02, objective=binary:logistic, eval_metric=logloss, min_child_weight=50, subsample=1.0, colsample_bytree=0.5。将样本随机分成4份,每一小份样本训练一个分类器。

  3. 4个LogisticRegression分类器,取均值。

  4. 4个FM分类器,取均值。

  5. 模型融合。y={‘rf’: 0.075, ‘xgb’: 0.175, ‘vw’: 0.225, ‘fm’: 0.525}

  6. 微调

    pred[site_id=='17d1b03f'] *= 0.13 / pred[site_id=='17d1b03f'].mean()
    pred *= 0.161 / pred.mean()

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值