[广告技术]可能是最快的将dataframe 转为libffm的代码了

2019年02月19日 7597点热度 0人点赞 0条评论

前言

LibFFM 在之前的好几界CTR比赛之中都取得了非常不错的成绩。但是在使用上, 最大的问题莫过于其特殊的libffm格式了。下面会覆盖两个问题:
* 简述libffm数据格式
* 单机将pandas DataFrame 转成libffm 的实现(已优化)

什么是libffm格式

这部分内容主要参考: https://www.jianshu.com/p/9c2c2421ef2e

假设有下面数据:

其中:

  • User / Movie / Genre 是类别, 可以进行One Hot Encoder
  • Price是连续值,不需要One Hot转换

转换过程

首先需要明确fieldfeature

如上面的数据集:

  • fields 有:

    User / Movie / Genre / Price

  • Feature 有:

    User-YuChin -> 0
    Movie-3Idiots -> 1
    Genre-Comedy -> 2
    Genre-Drama -> 3
    Price -> 5

转换结果

1:1:1 2:2:2 3:3:1 3:4:1 4:5:9.99

转换代码

Kaggle 的一个方案

在Kaggle上面有一个人分享了一个实现:

https://www.kaggle.com/mpearmain/pandas-to-libffm

具体代码就不贴上来了, 但是这里面用了两层for循环, 可想而知速度并不会太快。 特别是对于数据量一般都很大的广告数据来说。

一个并行实现的方案

https://blog.csdn.net/songbinxu/article/details/80298195

主要思路:

先将一份数据分开成多份, 然后每个核单独进行计算。计算结果最终进行合并。

对于这种实现方案, 我觉得最大的问题在于数据分发到多核之上。 这个序列化过程并不会非常快。

我的单核实现方案:

实际性能:

使用的数据: 2014 Kaggle Avazu 的训练数据(为了方便, 没有使用其测试数据部分)

data.shape: (40428967, 24)

运行日志:

可以看到, 每一列的处理速度在2分钟左右。 秒杀上面的2层for循环!

RangerWolf

保持饥渴的专注,追求最佳的品质

文章评论