各位大大好,小弟是資料分析新手,目前遇到一個一直卡關的問題:
我目前在做商品的關聯性分析,需要用到Apriori演算法
原本的 raw dataset 有170萬筆,我在前期資料整理時就常常會出現memory error的問題,後來我的夥伴跟我說可以用抽樣的方式來做所以只需要處理17萬筆資料,前期處理也順利完成。
但問題來了,在我做好這17W筆資料的 one-hot encoding 後,要丟入 mlxtend 套件的 Apriori 函式時,每次做到最後這一步,電腦都跑神久,不然就是畫面直接凍結。
在用 jupyternotebook 環境實作時,為了清出記憶體空間,我也使用
del data
gc.collect()
這類的方法,但似乎沒啥用,有沒有大大知道怎麼處理這種問題的 Q_Q
或者有沒有這種演算法的雲端運算資源可以使用?
還是我該去網咖包一台高級一點的電腦來跑嗚嗚?
大家回覆比較偏向於硬體方面,小弟補充分享些數據分析的經驗。
跑關聯分析,重點在於【資料裡有幾個不同的商品】?
舉例17萬筆,裡面有幾個不同的商品?10個、100個、1000個、10000個,我處理起來的方式會不太一樣。因為重點在於不同商品間的交叉矩陣,這才是最吃資源的,反而和17萬跟170萬的關係比較小。(我指跑關聯分析的時候,不是指資料整理階段,資料整理階段直接就跟資料筆數有關沒錯。)
首先關於運算時間和運算進度,這不會有任何系統可以告訴你啥時會跑完或是進度60%這樣,尤其你又用Python的話,我的經驗就是自己測:
這些大概都幾秒鐘了不起三五分鐘的事,多測幾種不同的資料組合,你自己腦海大概就會有個迴歸函數出現,進而推測你的17萬筆資料n個不同商品的關聯分析,需要多久時間,你心裡有個底後,就放著讓它去跑吧……
有時候跑得慢不是因為記憶體限制,而是「它就是需要跑這麼久」,你想像一下一萬個不同商品,光是某二商品的矩陣就高達10000^2,背後還要幫你算出support, confidence, lift……
你終究要等這麼久的,那為什麼不一開始就等(誤)。
當然,這前提是你還沒摸到8G的上限。
在硬體有更進一步突破之前,該跑這麼久的東西,就是得跑這麼久,而且話說回來,我不認為是8G的問題,而是n太大,但這我不敢說死,坐等其他大神經驗分享。
我經驗上有這些處理方式:
一、降低n
首先,不要跑到單商品,把可以group起來的先group起來,例如摺疊傘有x種顏色,不要當作x種商品,就當作1種商品(摺疊傘),或是把所有雨傘包括直立式都當作1種商品,更過分的可以把雨衣雨鞋都當作1種商品。其實你的商品資料庫應該有商品階層,試著往上一層去跑。但當然,如果這不符合你的分析目標,例如你就是想知道買黃色衣服的會不會比較喜歡買黃色雨傘?那這就不是一個好解法。
其次,剔除不需要分析的商品,商品銷售大都會搭配折價券、商品券、點數卡之類的,這如果不是你的分析目標,那就把這種先篩選掉吧~
當你的n下降,執行時間都會快上許多。
二、只看【某二單商品】關聯
Apriori是一口氣幫你做出所有組合和單商品的關係,例如會有【買了A+B+C之後,買D的狀況】,如果你不需要這麼複雜,只想看【買了A之後,買D的狀況】……這我忘記Apriori有沒有參數可以調,就是限制二商品這樣(你可以研究一下),因為其實support, confidence, lift並不難寫,如果你不是要一條龍直接跑到有圖出來,又只需要跑某二單商品組合的結構化資料的話,像我現在是自己寫成 SQL function 在跑,印象中當初相較下是比Python快蠻多的。但缺點就是只能跑二商品組合。
我會建議你先跑「真的能跑出結果的」,再去思考這樣的結果無法達成你想要的哪些分析目的,進而逐步調整。很多分析都是慢慢調整而生的,無法一次到位,甚至真的可能被各種系統環境限制住而無法做到心裡想做到的分析,這都難免。
經驗分享,提供參考。
大大謝謝你的分享,我覺得學到很多!受教了
我的資料集總共有34000種品項,我想做的事情是:我目前已經有前20名熱銷商品以及170萬筆銷售資料,我想找出含有這20項熱銷商品的關聯分析表,然後再進一步分析商品組合給予折扣這樣。
34000!這會跑到天荒地老的,試著降低品項數n吧...
如果你會自己寫,又只需要二商品關聯,那就自己寫就好,也不過就20x34000的矩陣,這樣是一定跑得出來。這篇雖然不是在講語法,但有講統計值的算法原理,可以參考看看。
您可以組電腦叢集來跑分析,
電腦叢集....現在應該說雲端比較能理解(?)~~XD
簡單說就是將多台電腦當成一台電腦/服務使用,來突破單台電腦的效能瓶頸
我以前有一位實驗室的學長,跑論文數據分單台電腦跑一次要超過1周@@
受不了拿了一些實驗室沒在用的舊電腦組了叢集來跑,時間縮減到只要3天多就跑完~~
有的VM也有可以跨主機的虛擬機器叢集~
不然就是直接買(或找免費)網路雲端運算使用~~
說到這個...怎麼突然想到彼特幣XD
謝謝大大
另外我還想請教一個問題是,不知道你知不知道,一般在跑數據的時候,我怎麼知道現在跑運算的進度是多少?
不然我每次按下 run 我都不知到這一按要等多久 QQ
你不會知道,因為電腦自己也不一定會知道。
看了一下Apriori演算法,他是可能改成分散式的運算。但是你用的工具我不熟,我也沒真的在做資料分析XD。參考:
https://wizardforcel.gitbooks.io/dm-algo-top10/content/apriori.html
他底下提到一個「方法3 劃分」,就是將尋找頻繁項集的工作切開成數個部份,各部份尋找各自的頻繁項集,然後再彙整出整體的頻繁項集,接下來才用整體的頻繁項集來對資料做分析。
如果是記憶體不夠,我會把資料切開成數個部份,一個部份一個部份分析,然後再匯總。接下來用匯總出來的特徵集來分析資料。
這種解決方法叫做divide and conquer。
我不會
我只想替這個問題按個讚
終於有人不是拿 python 去爬網頁了
原本的 raw dataset 有170萬筆,我在前期資料整理時就常常會出現memory error的問題,後來我的夥伴跟我說可以用抽樣的方式來做所以只需要處理17萬筆資料,前期處理也順利完成。
既然可以因為「memory error」的原因
170萬->17萬 = 抽樣 1/10
不如再抽一次
17萬->1萬7千 = 1/10
應該就過關了