1. 程式人生 > >資料探勘:概念與技術(第三版)之第六章的學習記錄

資料探勘:概念與技術(第三版)之第六章的學習記錄

本章主要對挖掘頻繁模式進行講解。
頻繁模式是指頻繁地出現在資料集中的模式,具體包括頻繁項集、頻繁序列模式、頻繁結構模式。具體的解釋書上寫得很詳細,我們也在第一章的時候進行了講解,這裡就不多提了。
前面的誘發例子也不多說了,都很好理解。
這裡,假設我們分析的是超市的資料倉庫。
OK,那我們可以把全域想象成商品的集合,而每種商品購買與否就可以用布林型變數來表示了。比如全域商品是這樣的一個集合

{西瓜,桃子,魚,雞,牛肉,麵包,襯衣,鞋子}

那麼,一個顧客的菜籃子就可以用布林型變數來表示,如下

{1,0,1,0,0,0,1,1}

那分析這個布林型變數,我們就可以知道,這位顧客買了西瓜,魚,襯衣,鞋子;沒有買桃子,雞,牛肉,麵包。
我們把銷售資料轉換成這種之後,便於我們對資料進行處理。我們可以分析布林型變數,得到反映商品頻繁關聯或同時購買的購買模式。
而購買模式就可以用關聯規則

來表示,如下所示。

computer=>antivirus_software[support = 2%;confidence = 60%]

這個式子表示,我們所分析的所有記錄的2%顯示計算機和防毒軟體被同時購買及在購買計算機的顧客中有60%的人同時也購買了防毒軟體。
其中的support即表示規則的支援度,confidence則表示規則的置信度。
而最小支援度閥值和最小置信度閥值是由人設定的。
通常的,我們把同時滿足最小支援度閥值和最小置信度閥值的規則認作是強規則。

其他的一些諸如項集,k項集,項集的出現頻度書上P159都有,不多說了。

由於關聯規則很容易通過支援度和置信度推匯出來。因此挖掘關聯規則實質上可以歸結為挖掘頻繁項集


一般而言,關聯規則的挖掘是一個 兩步的過程:

(1)找出所有的頻繁項集:根據定義,這些項集的每一個“東西”的出現次數至少與預定義的最小次數一樣;
(2)由頻繁項集產生強關聯規則:這些規則必須滿足最小支援度和最小置信度。

其中,挖掘的整體效能由第一步決定。

頻繁項集的挖掘方法
關聯分析是一種在大規模資料集中尋找有趣關係的任務。Apriori是解決這一問題的基本演算法。這個演算法也是資料探勘的入門演算法。
這是一種最有影響的挖掘布林關聯規則頻繁項集的演算法。
該演算法的主要方法就是使用一種被稱為逐層搜尋的迭代方法,並且為了提高效率,一種被稱為先驗性質(Apriori property)

的重要性質被用於壓縮搜尋空間。

其中,先驗性質其實我們在第5章已經瞭解了。這裡再介紹一下先驗性質。

先驗性質:頻繁項集的所有非空子集也一定是頻繁的。
那麼,我們在Apriori演算法中用到的實際上是該性質的反單調性:如果一個集合不能通過測試,則它的所有超集也都不能通過相同的測試。

其實,意思都是一個意思,也很好理解。
那麼,我們如何在實現這個演算法呢?
書上P161的例6.3寫的非常詳細,仔細看下,應該能理解的。
從例6.3我們可以看到,實際上整個Apriori演算法就是在迭代的使用連線剪枝。在看例子的時候,我們要注意如何剪枝,以及演算法的終止條件。

有頻繁項集產生關聯規則
我們上面說了,聯規則很容易通過支援度和置信度推匯出來。因此挖掘關聯規則實質上可以歸結為挖掘頻繁項集。我們已經使用Apirori演算法,挖掘出了頻繁項集。那麼如何通過頻繁項集產生關聯規則呢?
6.2.2節說明了這一問題,且例6.4給出了例項。

OK,在上面我們提到了Apriori演算法。但實際上,這個演算法是非常古老的演算法了。因為Apriori演算法是寬度優先的演算法,它有兩個非常顯著的缺點

它可能仍然需要產生大量候選項集。例如如果有10^4個頻繁1項集,則Apriori演算法需要產生多大10^7個候選2項集
它可能需要重複地掃描整個資料庫,通過模式匹配檢查一個很大的候選集合。

在6.2.3節,我們看到了提升Apriori演算法效率的幾種方法,前面的幾種都很好理解,只有最後一個”動態項集計數”我不是很理解。這裡暫且放下。
縱觀這裡提到的幾種方法,我們可以看到。這幾種方法都只是在沒有改變其核心思想上做的一個效率提升的工作,即旨在提升原生Apriori演算法的效率。但事實上,KDD發展至今,對於頻繁項集的挖掘已經有了很多種方法,其中廣泛使用的是類Apriori演算法

類Apriori演算法之FP-growth
上面我們說了,原Apriori演算法的效能在某些情況下,仍然會受到很大的影響。這裡我們引入一種類Apriori演算法——頻繁模式增長(FP-growth)
首先,我要批評的是,書上關於這個演算法的講解真是太爛了!!!好像這個演算法還是2000年,韓家煒(本書的作者之一)自己搞出來的吧?那為啥不好好講講=。=
言歸正傳,我們繼續來講FP-growth演算法。
首先,我們要知道的是下面這幾點。
FP-growth演算法是基於Apriori構建的,但採用了高階的資料結構減少了掃描次數,因此大大加快了演算法速度。

FP-growth演算法發現頻繁項集的基本過程如下:

構建FP樹;
從FP樹中挖掘頻繁項集。

OK,下面我們就來詳細講解一下。大家就不要在去看書上的那個圖了,免得把自己搞混。

構建FP樹
上面我們談到,FP-growth演算法的優點是採用了高階的資料結構。那麼這種高階的資料結構是什麼呢?實際上就是FP樹。
FP樹是一種輸入資料的壓縮表示。他通過把事務對映到FP樹上來構造一條路徑。這樣如果不同事務之間的重疊路徑越多,那麼就有理由認為他們是頻繁項集。由於不同的事務可能會有若干個相同的項,因此它們的路徑相互重疊越多,則使用FP樹結構獲得的壓縮效果越好。
那麼,接下來,我們來一步一步地構造FP樹 。
假設我們有這樣一組資料
這裡寫圖片描述
首先,同Apriori演算法一樣。資料庫第一次掃描,得到頻繁項集的集合(1項集,濾掉了不滿足閥值的。),並按逆序排序。於是我們就有

a:8
b:6
c:6
d:5
e:3

然後,我們就可以構造FP樹了:首先,建立樹的根節點,用null表示
這裡寫圖片描述
接著,我們進行第二次掃描資料庫,對資料庫中的每個事務按照先前的逆序進行處理,並對每個事務建立一個分枝。
例如,對資料庫中的第一條記錄{a,b}按逆序進行處理,還是{a,b}
這裡寫圖片描述
第二條記錄{b,c,d}按逆序處理,還是{b,c,d}
這裡寫圖片描述
第三條記錄{a,c,d,e}按逆序處理,還是{a,c,d,e}
這裡寫圖片描述
接下來依次進行這種操作,直至最後
這裡寫圖片描述

由於這個例項選取的資料直接就是OK的,沒有體現出過濾和逆序的操作。不清楚的同學,建議再看下這兩張圖,想一下,應該能理清整個流程。
這裡寫圖片描述
(PS:閥值為3)
這裡寫圖片描述

OK,到這裡應該流程理清了。在圖中,我們可以看到一些虛線的箭頭,可能有些同學還不清楚它是什麼。
實際上FP-growth演算法還有一個被稱為頭指標表的資料結構,用來記錄各個元素項的總出現次數的陣列。然後再附帶一個指標指向FP樹中該元素項的第一個節點。這樣每個元素項都構成一條單鏈表,有助於快速訪問樹中的項。
下面,我們進行第二步。

從FP樹中挖掘頻繁項集
從FP樹中挖掘頻繁項集的步驟如下

從FP樹中獲得條件模式基;
利用條件模式基,構建一個條件FP樹;
迭代重複步驟1步驟2,直到樹包含一個元素項為止

這裡出現了一個新的名次——條件模式基(condition pattern base)。它的定義是這樣的:條件模式基是以所查詢元素項為結尾的路徑集合。
概念挺繞的,其實很簡單 ,就是字首路徑。直接看示例
這裡寫圖片描述
則每一個頻繁元素項的所有條件模式基(字首路徑)為
這裡寫圖片描述
發現規律了嗎,z存在於路徑{z}中,因此字首路徑為空,另新增一項該路徑中z節點的計數值5構成其條件模式基;r存在於路徑{r, z}、{r, y, x, z}、{r, s, x}中,分別獲得字首路徑{z}、{y, x, z}、{s, x},另新增對應路徑中r節點的計數值(均為1)構成r的條件模式基;

OK,我們按照上面的思路,從FP樹中獲得了每一個頻繁項的條件模式基。接下來,我們就要利用條件模式基來構造FP條件樹了。

首先要明白的是,對於每一個頻繁項,都要建立一棵條件FP樹。
那麼怎樣通過條件模式基建立條件FP樹呢?
直接看示例。

頻繁項:t
條件模式基:{z,x,y,s}:2,{z,x,y,r}:1

同樣的,統計一下,過濾並按逆序排序

z:3                        
x:3
y:3           
s:2
r:1

這裡寫圖片描述
在這裡,注意到元素項s以及r是條件模式基的一部分,但是它們並不屬於條件FP樹。因為在當前的輸入中,s和r不滿足最小支援度的條件。

其他幾個也是這樣操作。

最後,結合項與其對應的條件FP樹進行分析過濾,就能夠得出了頻繁項集了。

大家直接看書上的看不懂,很可能跟我一樣。就是這本書一上來就一陣噼裡啪啦的大講特講,直接把人搞懵了。
實際上,FP-growth演算法中,最重要的就是FP樹的構造和FP條件樹的構造。只要搞清了這兩棵樹怎麼構造的,再去看書上就應該能看懂了 。
OK,現在回頭再看書167-168頁,發現就是這麼回事兒了。

FP增長是一個有趣的演算法,它是深度優先的演算法。它展示瞭如何使用事務資料集的壓縮表示來有效的產生頻繁項集,此外對於某些事務資料集,FP增長演算法比標準的Apriori演算法要快幾個數量級,FP增長演算法的執行效能取決於資料集的“壓縮因子”。如果生成的FP樹非常茂盛(在最壞的情況下,是一顆完全二叉樹)則演算法的效能顯著下降,因為演算法必須產生大量的子問題,並且需要合併每個子問題返回的結果。

接下來,書上講了使用垂直資料合適挖掘頻繁項集及挖掘閉模式和極大模式,都挺好理解的,這裡不多說了。
只特別說一下閉項集和最大頻繁項集,很多同學體會不到這兩個概念是幹什麼用的。本章主要講的是挖掘頻繁項集啊,但是資料集基本上都很大,所以我們需要尋求一種能夠減小計算負擔的方法。
為此,人們引入了頻繁項集和最大頻繁項集的概念。
借用下這篇文章闡述的觀點。點選這裡檢視

頻繁閉項集(Closed Patterns):
當項集X是頻繁項集,且資料集D中不存在X的真超集Y,使得X和Y的支援度相等,則X是閉頻繁項集。閉頻繁項集的表示是無失真壓縮,不會丟失支援度的資訊。通過閉頻繁項集可以反推出所有的頻繁項集以及相應的支援度
完全看不懂吧,還是來舉個栗子。
因為項集{Beer,Diaper}出現在TID為10,20,30的事務中,所以{Beer,Diaper}的絕對支援度為3。而{Beer,Diaper}的直接超集:{Beer,Nuts,Diaper},{Beer,Coffee,Diaper},{Beer,Diaper,Eggs}的支援度計數分別為1,1,1,都不等於{Beer,Diaper}的支援度計數3,所以{Beer,Diaper}為閉項集,如果其支援度超過閾值,則{Beer,Diaper}為閉頻繁項集。

最大頻繁項集(Max-Patterns):
當項集X是頻繁項集,且資料集D中不存在X的真超集Y,使得Y是頻繁項集,則X是最大頻繁項集。極大頻繁項集的表示是有失真壓縮,失去了頻繁項集的支援度資訊,我們可以根據極大頻繁項集判斷任意項集是否是頻繁的,但無法得到相應的支援度
理論什麼的看著就頭大,還是來舉個栗子吧。
如果,{Beer,Nuts,Diaper}大於最小閥值(別看支援度什麼的都很低,但是閥值是人定的,講不定就大於閥值呢。),那{Beer,Nuts,Diaper}就是個最大頻繁項集,因為沒有包含{Beer,Nuts,Diaper}並且比它更大的集合了。

在P160,例6.2也進行了說明。
而在實際中,挖掘閉模式和極大模式確實能有效地減少頻繁模式挖掘所產生的模式數量,這點在P170,例6.2.6做了簡要闡述。為什麼是簡要呢?原因有兩點:一是因為實際上對資料進行壓縮只是一種優化技術而已,又因為本書或者說我們目前的階段還不需要考慮這麼多。二是目前的很多頻繁項集挖掘演算法已經集成了資料壓縮的技術,最典型的莫過於剪枝了。

6.3節,講到了模式的評估方法,這個以後會比較實用。
在這裡,我想多說一句,關於關聯規則的誤導問題。我覺得,不能簡單的以沒規則,概率75%;有規則,概率66%來認定這個規則就是誤導的。
我們在最開始就說了,進行KDD的目的是為了為決策提供資料支援。如果是這是商業決策的話,那麼是否採用這麼一個策略,我想很大程度上會受收益的影響。即,我採用了這個策略,是不是我獲利能夠更多?因此,即便有9%(75-66=9)的概率下降,但假如說,66%這一規則能夠產生比75%無規則更多的收益呢?那我作為決策者肯定會採納66%的啊。因此,在實際進行分析的時候,我們的指標還需要更多才行,我們對資料的挖掘還需要更深才行。
這讓我想到了一句話:資料是不會騙人的,騙人的只有人而已。
也不知道這句話到底是對還是錯,暫且放在心上吧。