【干货】数据挖掘比赛大数据处理和建模经验

有同学反馈,我们决赛的数据比较大,由于机器资源的限制,在处理数据和构建模型的时候,会遇到一些瓶颈。以下来抛一下我们了解的一些处理思路:

1 采样

可以对数据进行下采样,然后使用不同的子集进行特征抽取和建模,最后再进行集成。

2 特征处理

在处理大规模原始数据时,需要充分借助外存(硬盘)空间,只把真正需要处理的数据放进内存。一般而言,采用流式、分块的方式处理数据可以解决大部分问题。以下是一些具体的技巧。

 

a) 只加载需要的数据到内存。有些特征可以通过单条数据直接得到,如星期特征。这种情况下,可以使用 streaming 的方式进行处理,每次读入若干数据(chunk),处理,生成特征,然后再写到硬盘。使用 pandas 的 read_csv,可以设置 chunksize 参数,譬如 for chunk in read_csv ( infile, chunksize=10000 );

 

b) 只保留需要的数据在内存。决赛的数据可以直接装到 16G 内存中,每次生成一条样本的特征,就把特征直接写入硬盘,不在内存保留。如果生成的特征较多,可以分多次生成,写到分散的特征文件,最后进行一个 merge 操作。在 merge 的时候,可以对多个特征文件按照统一的 key 进行排序,然后同时扫描多个特征文件,进行merge,再写到硬盘;

 

c) 充分利用排序加速。在上面的 streaming 处理方式中,有时预先对文件按照某些 key 排序,可以加速处理。譬如统计某个 user 在各个 clickTime 之前的平均转化率,可以对 train.csv 按照 user & clickTime (当然可以结合其他的 key,如 positionID)进行排序,然后扫描文件进行统计。又譬如统计某个 user 在 clickTime 前安装的 app 数量,可以对 train.csv 和 user_app_actions.csv 同时按照 user & time 进行排序,然后交替扫面两个文件,生成统计特征。对于排序操作,则可以直接使用 Linux 自带的 sort 命令,在小内存下完成排序操作。

 

综上,在处理大文件的时候,可以借鉴 split-apply-combine 的思路。

3 在线学习和外存学习

不少开源的工具支持外存和在线学习,使用这些工具,无需一次性把所有数据加载到内存,造成内存瓶颈。常用的一些工具如下:

a) Vowpal Wabbit:支持 LR + 高阶特征组合,在线学习

b) Libffm:支持外存学习

c) XGBoost:支持外存学习

d) Keras:通过模型的 fit_generator 方法,支持批量读入数据进行训练

写在最后

本次比赛提供了比较大的数据,也是想让选手们体验现实业务场景里面的大数据问题。在这样的情况下,如何找到一个高效有效的数据处理和模型构建方法,也是本次比赛的一个挑战。

在下届比赛中,我们会联合腾讯云,提供更强大的计算资源和机器学习工具平台。敬请期待。

你可能感兴趣的:(腾讯算法大赛,腾讯广告)