Python購物籃數(shù)據(jù)(關聯(lián)分析)


最近在看一個超級好看的劇绽族,里面的女主涂著紅紅的口紅卵酪,我也涂了~

文中需要用到MLxtend烹骨,MLxtend是一個基于Python的開源項目莫绣,主要為日常處理數(shù)據(jù)科學相關的任務提供了一些工具和擴展烟瞧。

一诗鸭、安裝包:MLxtend

pip?install?mlxtend


這里不用更新,這樣已經(jīng)可以了


一開始参滴,出現(xiàn)了這個强岸,我就認為沒有裝,可是獅虎說我裝了砾赔,他讓我restart一下


Restart以后:


這次就好了蝌箍,原因可能是,上一次沒有刷新暴心,沒反應過來


加載數(shù)據(jù)時妓盲,出現(xiàn)新問題如下,還好我之前遇到過专普,于是就解決了:

二悯衬、加載數(shù)據(jù)

1.出現(xiàn)問題


二、解決方法


由于已經(jīng)是csv格式檀夹,所以直接輸入:


pd.read_csv:



無從下手筋粗,應該規(guī)定一下每一行、每一列的意義

每一行:一個購物籃

每一列:購物籃中的商品

先看看pd讀的對不對:



但是被截斷了


獅虎說這個很奇怪击胜,所以我們換一個讀亏狰,不用pandas了


然后按行打右畚啤:


再將這些存在一個數(shù)組中:

統(tǒng)計商品種類:

一共是120類

One-Hot編碼:


1偶摔、什么是獨熱碼

獨熱碼,在英文文獻中稱做 one-hot code, 直觀來說就是有多少個狀態(tài)就有多少比特促脉,而且只有一個比特為1辰斋,其他全為0的一種碼制策州,更加詳細參加one_hot code(維基百科)。在機器學習中對于離散型的分類型的數(shù)據(jù)宫仗,需要對其進行數(shù)字化比如說性別這一屬性够挂,只能有男性或者女性或者其他這三種值,如何對這三個值進行數(shù)字化表達藕夫?一種簡單的方式就是男性為0孽糖,女性為1,其他為2毅贮,這樣做有什么問題办悟?

  使用上面簡單的序列對分類值進行表示后,進行模型訓練時可能會產(chǎn)生一個問題就是特征的因為數(shù)字值得不同影響模型的訓練效果滩褥,在模型訓練的過程中不同的值使得同一特征在樣本中的權重可能發(fā)生變化病蛉,假如直接編碼成1000,是不是比編碼成1對模型的的影響更大瑰煎。為了解決上述的問題铺然,使訓練過程中不受到因為分類值表示的問題對模型產(chǎn)生的負面影響,引入獨熱碼對分類型的特征進行獨熱碼編碼酒甸。

? ? ? ? 可以這樣理解魄健,對于每一個特征,如果它有m個可能值插勤,那么經(jīng)過獨熱編碼后诀艰,就變成了m個二元特征(如成績這個特征有好,中饮六,差變成one-hot就是100, 010, 001)其垄。并且,這些特征互斥卤橄,每次只有一個激活绿满。因此,數(shù)據(jù)會變成稀疏的窟扑。

這樣做的好處主要有:

(1)解決了分類器不好處理屬性數(shù)據(jù)的問題

(2)在一定程度上也起到了擴充特征的作用


明天繼續(xù)喇颁,剪枝


昨天終于追完了SKAM,睡得也比較早嚎货,今天睡了一個懶覺橘霎,現(xiàn)在來剪枝

威神女神

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? S



? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? K




? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A




? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? M

以下為我摘取的別人的,貼上原文鏈接https://blog.csdn.net/hellozhxy/article/details/80600845

著名的啤酒與尿布, 這是典型的購物籃問題, 在數(shù)據(jù)挖掘界叫做頻繁項集(Frequent Itemsets).

note: 數(shù)據(jù)類型寫法按照Python的格式.

一. 目標與定義

1. 問題背景

超市中購物清單中總是有一些項目是被消費者一同購買的. 如果我們能夠發(fā)現(xiàn)這些關聯(lián)規(guī)則(association rules), 并合理地加以利用, 我們就能取得一定成果. 比如我們發(fā)現(xiàn)熱狗和芥末存在這種關系, 我們對熱狗降價促銷, 而對芥末適當提價, 結果能顯著提高超市的銷售額.

2. 目標

找到頻繁地共同出現(xiàn)在消費者結賬小票中項目(比如啤酒和尿布), 來一同促銷, 相互拉動, 提高銷售額.

3. 定義

支持度support: 其實就是概率論中的頻次frequency

支持度閾值support threshhold: 記為s, 指分辨頻繁項集的臨界值.

頻繁項集: 如果I是一個項集(Itemset), 且I的出現(xiàn)頻次(i.e.支持度)大于等于s, 那么我們說I是頻繁項集.

一元項, 二元項, 三元項: 包含有一種商品, 兩種, 三種商品的項集.

4. 關聯(lián)規(guī)則

關聯(lián)規(guī)則: 形式為I->j, 含義是如果I種所有項都出現(xiàn)在某個購物籃的話, 那么j很有可能也出現(xiàn)在這個購物籃中. 我們可以給出相應的confidence值(可信度, 即概率論中的置信度).

其中, 這個關聯(lián)規(guī)則的可信度計算為Confidence = I∪{j} / I, 本身是非常符合直覺和常識的. 比如我們說關聯(lián)規(guī)則{dog, cat} -> and 的可信度為0.6, 因為{dog, cat}出現(xiàn)在了1, 2, 3, 6, 7五個購物籃中, 而and出現(xiàn)在了1,2,7中, 因此我們可以算出Confidence = freq[{dog, cat, and}] / freq[{dog, cat}] = 3/5 = 0.6

注意到, 分子部分的頻次總是比分母低, 這是因為{dog, cat} 出現(xiàn)的次數(shù)總是大于等于{dog, cat, and}的出現(xiàn)次數(shù).

二. 購物籃與A-Priori算法

1. 購物籃數(shù)據(jù)表示

我們將有一個文本文件輸入, 比如allBills.txt, 或者allBills.csv. 里面每行是一個購物籃.

文件的頭兩行可能是這樣(df.show(2)):

{23, 456, 1001}

{3, 18, 92, 145}

我們假定這是一家大型連鎖超市, 比如沃爾瑪, 因此這個文本文件是非常大的, 比如20GB. 因此我們無法一次將該文件讀入內存. 因此, 算法的主要時間開銷都是磁盤IO.

我們同時還假定, 所有購物籃的平均規(guī)模是較小的, 因此在內存中產(chǎn)生所有大小項集的時間開銷會比讀入購物籃的時間少很多.

我們可以計算, 對于有n個項目組成的購物籃而言, 大小為k的所有子集的生成時間約為(n, k) = n! / ((n-k)!k!) = O(n^k/ k!), 其中我們只關注較小的頻繁項集, 因此我們約定k=2或者k=3. 因此所有子集生成時間T = O(n^3).

Again, 我們認為在內存中產(chǎn)生所有大小項集的時間開銷會比讀入購物籃的時間少很多.

2. Itemset計數(shù)過程中的內存使用

我們必須要把整個k,v字典放在內存中, 否則來一個Itemset就去硬盤讀取一次字典將十分十分地慢.

此處, 字典是k=(18, 145), v=15這種形式. 此處, 應當注意到, 如果有{bread, milk, orange}這樣的String類型輸入, 應當預先用一個字典映射成對應的整數(shù)值編碼, 比如1920, 4453, 9101這樣.

那么, 我們最多能用字典存儲多少種商品?

先看下我們存儲多少個count值.

我們假定項的總數(shù)目是n, 即超市有n種商品, 每個商品都有一個數(shù)字編號, 那么我們需要(n, 2) = n^2/2 的大小來存儲所有的二元組合的count, 假設int是占4個byte, 那么需要(2·n^2)Byte內存. 已知2GB內存 = 2^31 Byte, 即2^31/2 = 2^30 >= n^2 --> n <= 2^15. 也就是說n<33 000, 因此我們說商品種類的最多是33k種.

但是, 這種計算方法存在一個問題, 并不是有10種商品, 那么這10種商品的任意二元組合都會出現(xiàn)的. 對于那些沒出現(xiàn)的組合, 我們在字典中完全可以不存儲, 從而節(jié)省空間.

同時, 別忘了我們同樣也得存儲key = (i, j), 這是至少額外的兩個整數(shù).

那么我們到底具體怎么存儲這些計數(shù)值?

可以采用三元組的方式來構造字典. 我們采用[i, j, count]形式來存儲, 其中i代表商品種類1, j代表商品種類2, 前兩個值代表key, 后面的value就是count, 是這個二元組合下的計數(shù).

現(xiàn)在, 讓我們注意到我們(1)假定購物籃平均大小較小, 并(2)利用三元組(2個key的)字典和(3)不存儲沒出現(xiàn)組合優(yōu)勢. 假設有100k = 10^5種商品, 有10million=10^7個購物籃, 每個購物籃有10個項, 那么這種字典空間開銷是(10, 2) · 10^7 = 45 x 10^7 x 3= 4.5x10^8x3 = 1.35x10^9 個整數(shù).? 這算出來約為4x10^8 Byte = 400MB, 處于正常計算機內存范圍內.

3. 項集的單調性

如果項集I是頻繁的, 那么它的所有子集也都是頻繁的. 這個道理很符合常識, 因為{dog, cat} 出現(xiàn)的次數(shù)總是大于等于{dog, cat, and}的出現(xiàn)次數(shù).

這個規(guī)律的推論, 就是嚴格地, 我們頻繁一元組的個數(shù)> 頻繁二元組的個數(shù) > 頻繁三元組的個數(shù).

4. A-Priori算法

我們通過Itemset計數(shù)中內存使用的部門, 已經(jīng)明確了我們總是有足夠的內存用于所有存在的二元項集(比如{cat, dog})的計數(shù). 這里, 我們的字典不存放不存在于購物籃中的任何二元項集合, 而且頻繁二元組的數(shù)目將會大于三元頻繁三元組> ...

我們可以通過單邊掃描購物籃文件, 對于每個購物籃, 我們使用一個雙重循環(huán)就可以生成所有的項對(即二元組). 每當我們生成一個項對, 就給其對應的字典中的value +1(也稱為計數(shù)器). 最后, 我們會檢查所有項對的計數(shù)結果,并且找出那些>=閾值s的項對, 他們就是頻繁項對.

1) A-Priori算法的第一遍掃描

在第一遍掃描中, 我們將建立兩個表. 第一張表將項的名稱轉換為1到n之間的整數(shù), 從而把String類型這樣的key轉為空間大小更小的int類型.? 第二張表將記錄從1~n每個項在所有購物籃中出現(xiàn)的次數(shù). 形式上類似

table 0(name table): {'dolphin': 7019, 'cat': 7020}? //dict形式, 其實也可以做成list形式 [['dolphin', 7019], ['cat', 7020]]

table 1(single-item counter table): {7019: 15, 7020: 18}? //dict形式, 其實也可以做成數(shù)組形式A[7019] = 2, A[7020] = 18

2) 第一遍掃描完的處理

第一遍掃描完后, 我們會按照自己設定的閾值s, 對整個table 1再進行一次mapping, 因為我們只關注最后counter值大于等于閾值的項目, 而且不關心其counter值具體多少. 因此, mapping策略是:

對凡是counter<s的, 一律把counter設成0; 對于counter>=s的, 按照次序, 把其設置成1~m的值(總共有m個滿足要求的項)

3) 第二遍掃描

第二遍掃描所做的事有三:

(1) 對每個購物籃, 在table 1中檢查其所有的商品項目, 把所有為頻繁項的留下來建立一個list.

(2) 通過一個雙重循環(huán)生成該list中的所有項對.

(3) 再走一次循環(huán), 在新的數(shù)據(jù)結構table 2(dict或者list)中相應的位置+1. 此時的效果是dicta = {48: {13: 5}, 49: {71, 16}} 或者 lista [ [48, 13, 5],[49, 71, 16], ... ]

注意此時內存塊上存儲的結構: table1(name table), table2(single-item counter table), table3(double-item counter table)

5. 推廣: 任意大小頻繁項集上的A-Priori算法

我們對上面這個算法進行推廣.

從任意集合大小k到下一個大小k+1的轉移模式可以這么說:

(1) 對每個購物籃, 在table 1中檢查其所有的商品項目, 把所有為頻繁項的留下來建立一個list.

(2) 我們通過一個k+1重循環(huán)來生成該list中的所有(k+1)元組

(3) 對每個k+1元組, 我們生成其的(k+1 choose k)個k元組, 并檢查這些k元組是否都在之前的table k中. (注意到k=1的時候, 這步與(1)是重復的, 可以省略)

(4)再走一次循環(huán), 在新的數(shù)據(jù)結構table k+1(dict或者list)中相應的位置+1. 此時的效果是k=2, k+1=3, 生成dicta = {48: {13: {19: 4}}, 49: {71: {51: 10}},? ... } 或者 生成lista [ [48, 13, 19, 4],[49, 71, 51, 10], ... ]

注意, 在進入下一次掃描前, 我們還需要額外把counter中值小于s的元組的計數(shù)值都記為0.

模式總體是: C1 過濾后 L1 計數(shù)后 C2 置零后 C2' 過濾后 L2 計數(shù)后 C3 置零后 C3' ......

END.


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? S

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? K

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? A

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? M


生成的商品種類為set形式:轉成list形式


第一張表:把項名稱轉換為1~n的整數(shù):


宋神的方法殖属,6啊

至于數(shù)數(shù)姐叁,大神說,你就用collections.Counter就好:哈?

還沒開始研究呢外潜,就數(shù)出來了


我決定吃個飯原环,洗個澡,再研究处窥,好像別人的方法也不是特別好嘱吗,要自己思考


我來了,昨天彈尤克里里滔驾,怎么學也記不住谒麦,怎么回事呀,我決定哆致,在琴弦上弄匕,貼上紙再試試

哈哈,可愛的wyy沽瞭,開始分析吧~嚕嚕嚕啦啦啦~嚕啦嚕啦嚕~


新的一天迁匠!

生成全零矩陣:

換成zeros:


統(tǒng)計每一列的和,即每種商品的購買總數(shù):

每一行列:



但是這個顯示結果很丑驹溃,被科學技術法了城丧。


sum后,就出現(xiàn)了.豌鹤,很丑亡哄,我要去掉它,所以就強行轉換一波


第一行:


建立一個新的只含有頻繁一項集的購物籃矩陣:

頻繁二項集:




這就是組合



這是排列(與順序有關)


哇咔咔愛你啊
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末布疙,一起剝皮案震驚了整個濱河市蚊惯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灵临,老刑警劉巖截型,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異儒溉,居然都是意外死亡宦焦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門顿涣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來波闹,“玉大人,你說我怎么就攤上這事涛碑【椋” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵蒲障,是天一觀的道長歹篓。 經(jīng)常有香客問我瘫证,道長,這世上最難降的妖魔是什么滋捶? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮余黎,結果婚禮上重窟,老公的妹妹穿的比我還像新娘。我一直安慰自己蛙讥,他們只是感情好狼忱,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布坪圾。 她就那樣靜靜地躺著,像睡著了一般厅翔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搀突,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天刀闷,我揣著相機與錄音,去河邊找鬼仰迁。 笑死甸昏,一個胖子當著我的面吹牛,可吹牛的內容都是我干的徐许。 我是一名探鬼主播施蜜,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雌隅!你這毒婦竟也來了翻默?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恰起,失蹤者是張志新(化名)和其女友劉穎修械,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體检盼,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡祠肥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了梯皿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仇箱。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖东羹,靈堂內的尸體忽然破棺而出剂桥,到底是詐尸還是另有隱情,我是刑警寧澤属提,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布权逗,位于F島的核電站美尸,受9級特大地震影響,放射性物質發(fā)生泄漏斟薇。R本人自食惡果不足惜师坎,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堪滨。 院中可真熱鬧胯陋,春花似錦、人聲如沸袱箱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽发笔。三九已至盟萨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間了讨,已是汗流浹背捻激。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留前计,地道東北人铺罢。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像残炮,于是被迫代替她去往敵國和親韭赘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容

  • 不敢發(fā)朋友圈势就,不敢寫日志泉瞻,因為微信微博qq里有父母,家人苞冯,摯友袖牙,不想他們再為我操心。終于找到一個地方可以偷偷寫下自...
    小花向陽閱讀 211評論 0 0
  • 今天我在輸出力后臺發(fā)起了這樣一個活動~于是~ 開心的事情是!昨天聯(lián)系了一位好久沒聯(lián)系的朋友皇忿,雖然沒約出來畴蹭,但是聊了...
    3dac00f56ba8閱讀 406評論 1 1
  • 《二郎神——犬》 嘯天犬。古神獸鳍烁、矯行星漢叨襟。迅且勇、斬妖魔鬼怪幔荒,忠且直糊闽、輪番鏖戰(zhàn)梳玫。更有固堅鋒利齒,順風耳右犹、兼千里眼...
    唐偉濱閱讀 633評論 0 0
  • 這世界上最可怕的不是比你優(yōu)秀的人還比你努力念链,而是你明知道自己不優(yōu)秀卻不努力盼忌,還一味地自欺欺人,說別人的成功不過是好...
    仲念念閱讀 930評論 13 34