降低数据大小的四大绝招。

2022-10-27 14:51:37 浏览数 (1)

↑↑↑关注后"星标"炼丹笔记

炼丹笔记干货

作者: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型,此处如果稍加处理则可以节省大量的内存。

小结

适用于所有数据存储问题。

参考文献

  1. How To Reduce Data Size

0 人点赞