↑↑↑关注后"星标"炼丹笔记
炼丹笔记干货
作者:Kaggle竞赛宝典摘自Chris Deotte的分享
降低数据大小的四大绝技
简介
在非常多的问题中,例如商品推荐数据存储(大量的用户和商品,还有购买金额等信息),金融数据存储(大量的标的,价格等),我们不可避免的都会碰到数据过大的问题,如果对这类数据进行处理显得直观重要,本文我们介绍碰到大数据时,我们采用的四种策略。
四大节省内存的方式
01
数据类型转换
通过数据转换往往可以帮助我们节省好几倍的内存,同时因为类型的转换,在一些数值计算中还可以起到加速运算的作用。我们以American Express竞赛为案例:
1. customer_ID从64 bytes降低为4bytes
长度为64的字符串,每行使用64个字节!
- 我们可以将此转换为仅使用4字节或8字节的int32或int64。典型的技巧如获取十六进制字符串的最后16个字母,然后将该base16数字转换为base10并另存为int64。
2. S_2将10 bytes降低为3 bytes
此列是带时间的日期。由长度为10的字符串提供,每行使用10个字节!
- 如果我们用pd.datetime进行转化,那么变为4个字节。
- 或者,我们可以将此列保存为三列,分别为year,month,day,每列为int8,并且每行仅使用3个字节。
3. 类别特征,从8 bytes降低为1 bytes
将一些最大值为8个值的类别列转化为int8的正数,这样就变成了1个byte,将原先8个bytes转化为了1个byte。
4. 数值特征,从8 bytes降低为2 bytes
对于一些将float64转化为float32而不损失信息的字段可以直接转化,还有很多字段可以直接从float64转化为float16,这样就可以转化为2个bytes。
02
选择存储文件形式
通过数值类型转化策略转化之后,我们需要将文件保存到磁盘。而这个时候有两个重要属性:
- 压缩比;
- 一些文件格式(如Feather、Parquet和Pickle)会压缩数据。NumPy中的np.savez()也会对数据进行压缩,一般压缩之后数据还会变小很多。
- 保存顺序;
- 一些文件格式(如CSV)逐行保存数据。一些文件格式(如Parquet)逐列保存数据。这将影响以后读取数据。如果将来我们想读取行的子集。也许行顺序更好更快。如果将来我们想读取列的子集,那么列顺序可能会更好更快。
03
多文件存储与否
这个对于数据大小影响不大,如果一次处理整个训练和测试数据集有困难,那么我们可以考虑分块处理,并将数据作为单独的文件保存到磁盘。如果可以一起存储处理,则直接单个文件即可。
04
噪音处理
有非常多的数据存在噪音,而这些噪音处理之后对于数据的训练预测有帮助而没什么害处,例如American Express中的一些数据本来是int型,后来加了噪音变成了float型,此处如果稍加处理则可以节省大量的内存。
小结
适用于所有数据存储问题。
参考文献
- How To Reduce Data Size