最近在作Kaggle上的wiki文章流量预测项目,这里因为我的电脑配置问题,我一直都是用的Kaggle的kernel,可是咱们知道kernel的内存限制是16G,以下:
git
在处理数据过程当中发现会超出,虽然咱们都知道对于大数据的处理有诸如spark等分布式处理框架,可是依然存在下面的问题:github
因此这里仍是考虑针对数据进行内存方面的优化,以达到减小内存占用,并在kernel上正常运行为最终目的;web
这个不用多说,虽然通常为了省事,都是开头一块儿load到内存中,可是特殊状况下,这里仍是要注意的,以下:
app
能够看到,虽然可用数据文件不少,可是因为当前处理须要的仅仅是train2.csv,因此只加载其便可,不要小看这一步,这里每一个文件加载过来都是几百M的;框架
这里是在预处理部分能作的对内存影响最大的一部分,基本思路以下:机器学习
以下是未作转换前的DataFrame信息:
分布式
以下是我对原始数据各字段的类型转换以及转换后的DataFrame信息:
工具
看到内存占用直接降了一半,不要小看这几百M,在DataFrame进行各类apply、groupby运算时,临时占用的内存是很是多的,也很容易超过峰值致使kernel重启;学习
PS:固然,这里若是直接加载时指定数据类型也是能够的,我这边为了展现转换先后效果,因此直接指定,实时上更常见的作法时,先直接加载,info或者describe看数据信息,而后判断数据应该的类型,修改代码为直接指定;测试
作过期序数据预测的朋友应该直到,时序数据构建时,一个特色是须要链接训练和测试数据,而后同时针对这些数据作时序上的延迟特征、各类维度的统计特征等等,所以这里就涉及到数据链接,必定要注意要用union_categoricals代替pd.concat,若是直接使用concat,那么category类型的列会被转为object,那么在链接的过程当中,内存就会超过峰值,致使kernel重启,那就悲剧了。。。。
以下,是对数据作reshape的操做,这个是该竞赛数据的一个特色,因为其把每一天对应的访问数据都放到了一块儿,也就是一行中包含了一篇文章的每一天的访问量,而这是不利于后续作延迟特征构建的,须要将每一天的信息单独做为一行,所以须要reshape:
以下这种链接、即时销毁的方式虽然看着丑,可是效果仍是能够的:
以下是采起这种方式连接后的DataFrame信息,其实难点不在于DataFrame多大,而是它在运算过程当中的内存峰值会超过限制:
https://www.kaggle.com/c/web-traffic-time-series-forecasting
https://www.kaggle.com/holoong9291/web-traffic-time-series-forecasting
你们能够到个人Github上看看有没有其余须要的东西,目前主要是本身作的机器学习项目、Python各类脚本工具、数据分析挖掘项目以及Follow的大佬、Fork的项目等:
https://github.com/NemoHoHaloAi