最近在作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