iT邦幫忙

3

【Python】如何在有限的記憶體(8G)內做17萬筆資料的 Apriori 演算法,或者有更快方法?

各位大大好,小弟是資料分析新手,目前遇到一個一直卡關的問題:

我目前在做商品的關聯性分析,需要用到Apriori演算法
原本的 raw dataset 有170萬筆,我在前期資料整理時就常常會出現memory error的問題,後來我的夥伴跟我說可以用抽樣的方式來做所以只需要處理17萬筆資料,前期處理也順利完成。

但問題來了,在我做好這17W筆資料的 one-hot encoding 後,要丟入 mlxtend 套件的 Apriori 函式時,每次做到最後這一步,電腦都跑神久,不然就是畫面直接凍結。

在用 jupyternotebook 環境實作時,為了清出記憶體空間,我也使用

del data
gc.collect()

這類的方法,但似乎沒啥用,有沒有大大知道怎麼處理這種問題的 Q_Q
或者有沒有這種演算法的雲端運算資源可以使用?
還是我該去網咖包一台高級一點的電腦來跑嗚嗚?

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2019-07-25 08:16:49 檢舉
沒code沒辦法知道你做了啥...
只能叫你去加記憶體了,現在在低點,趁現在加也不錯。
huahualiu iT邦新手 2 級 ‧ 2019-07-25 09:35:35 檢舉
阿 抱歉,等等補個code
嗚嗚但是我是用筆電@@@
跑得快 iT邦新手 3 級 ‧ 2019-07-25 09:42:20 檢舉
雲端電腦租一台算完就關掉?
fillano iT邦超人 1 級 ‧ 2019-07-25 09:43:08 檢舉
除非記憶體焊在主機板上沒有插槽,筆電也是可能換記憶體的。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
11
張小馬~
iT邦新手 3 級 ‧ 2019-07-25 10:47:44
最佳解答

大家回覆比較偏向於硬體方面,小弟補充分享些數據分析的經驗。

跑關聯分析,重點在於【資料裡有幾個不同的商品】?
舉例17萬筆,裡面有幾個不同的商品?10個、100個、1000個、10000個,我處理起來的方式會不太一樣。因為重點在於不同商品間的交叉矩陣,這才是最吃資源的,反而和17萬跟170萬的關係比較小。(我指跑關聯分析的時候,不是指資料整理階段,資料整理階段直接就跟資料筆數有關沒錯。)

首先關於運算時間和運算進度,這不會有任何系統可以告訴你啥時會跑完或是進度60%這樣,尤其你又用Python的話,我的經驗就是自己測:

  1. 1,000筆資料20個不同商品的關聯分析,跑多久?
  2. 10,000筆資料20個不同商品的關聯分析,跑多久?
  3. 1,000筆資料40個不同商品的關聯分析,跑多久?
  4. 10,000筆資料40個不同商品的關聯分析,跑多久?

這些大概都幾秒鐘了不起三五分鐘的事,多測幾種不同的資料組合,你自己腦海大概就會有個迴歸函數出現,進而推測你的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快蠻多的。但缺點就是只能跑二商品組合。

我會建議你先跑「真的能跑出結果的」,再去思考這樣的結果無法達成你想要的哪些分析目的,進而逐步調整。很多分析都是慢慢調整而生的,無法一次到位,甚至真的可能被各種系統環境限制住而無法做到心裡想做到的分析,這都難免。

經驗分享,提供參考。

huahualiu iT邦新手 2 級 ‧ 2019-07-25 14:46:12 檢舉

大大謝謝你的分享,我覺得學到很多!受教了
我的資料集總共有34000種品項,我想做的事情是:我目前已經有前20名熱銷商品以及170萬筆銷售資料,我想找出含有這20項熱銷商品的關聯分析表,然後再進一步分析商品組合給予折扣這樣。

34000!這會跑到天荒地老的,試著降低品項數n吧...
/images/emoticon/emoticon28.gif

如果你會自己寫,又只需要二商品關聯,那就自己寫就好,也不過就20x34000的矩陣,這樣是一定跑得出來。這篇雖然不是在講語法,但有講統計值的算法原理,可以參考看看。

1
舜~
iT邦高手 1 級 ‧ 2019-07-25 09:28:21

您可以組電腦叢集來跑分析,
電腦叢集....現在應該說雲端比較能理解(?)~~XD
簡單說就是將多台電腦當成一台電腦/服務使用,來突破單台電腦的效能瓶頸

我以前有一位實驗室的學長,跑論文數據分單台電腦跑一次要超過1周@@
受不了拿了一些實驗室沒在用的舊電腦組了叢集來跑,時間縮減到只要3天多就跑完~~

有的VM也有可以跨主機的虛擬機器叢集~

不然就是直接買(或找免費)網路雲端運算使用~~
說到這個...怎麼突然想到彼特幣XD

huahualiu iT邦新手 2 級 ‧ 2019-07-25 09:41:25 檢舉

謝謝大大
另外我還想請教一個問題是,不知道你知不知道,一般在跑數據的時候,我怎麼知道現在跑運算的進度是多少?
不然我每次按下 run 我都不知到這一按要等多久 QQ

froce iT邦大師 1 級 ‧ 2019-07-25 10:02:29 檢舉

你不會知道,因為電腦自己也不一定會知道。

fillano iT邦超人 1 級 ‧ 2019-07-25 10:02:59 檢舉

看了一下Apriori演算法,他是可能改成分散式的運算。但是你用的工具我不熟,我也沒真的在做資料分析XD。參考:

https://wizardforcel.gitbooks.io/dm-algo-top10/content/apriori.html

他底下提到一個「方法3 劃分」,就是將尋找頻繁項集的工作切開成數個部份,各部份尋找各自的頻繁項集,然後再彙整出整體的頻繁項集,接下來才用整體的頻繁項集來對資料做分析。

如果是記憶體不夠,我會把資料切開成數個部份,一個部份一個部份分析,然後再匯總。接下來用匯總出來的特徵集來分析資料。

這種解決方法叫做divide and conquer。

0
海綿寶寶
iT邦大神 1 級 ‧ 2019-07-25 13:48:44

我不會

我只想替這個問題按個讚
終於有人不是拿 python 去爬網頁了
/images/emoticon/emoticon02.gif

原本的 raw dataset 有170萬筆,我在前期資料整理時就常常會出現memory error的問題,後來我的夥伴跟我說可以用抽樣的方式來做所以只需要處理17萬筆資料,前期處理也順利完成。

既然可以因為「memory error」的原因
170萬->17萬 = 抽樣 1/10
不如再抽一次
17萬->1萬7千 = 1/10
應該就過關了
/images/emoticon/emoticon05.gif

可能領域差別,我身邊反而很少拿Python做爬蟲的欸,都是拿去做機器學習相關的,迴歸模型、分類模型、模型分數、預測一類的。
我如果遇到懶得自己寫成SQL Function的東西時,會去找看看Python有沒有寫好的module,然後改成用Python來做這樣,然後爬蟲部分反而是用按鍵精靈做...哈哈......(莫名)

我要發表回答

立即登入回答