循序樣式探勘: 以R的arulesSequences實作 / Sequential Pattern Mining in R
循序樣式探勘是一種用來找出「大部分的人都有的行為模式」的有效方法。我以前用過JavaScript寫過循序樣式探勘工具,也用Weka的GSP來實作過,最近我又發現可以用R的arulesSequences來輕鬆完成循序樣式探勘的工作。以下我會介紹循序樣式探勘的概念,並分享用R來實作的腳本。
循序樣式探勘介紹 / Introduction to Sequential Pattern Mining
- Google Presentation原始檔案 (PPTX, PDF版本)
- PPTX備份檔案:SlideShare、OneDrive、Box、Mega、MediaFire
這邊循序樣式探勘的概念介紹主要是來自於曾憲雄老師等人所著作的「資料探勘」一書,這本書寫得真的很不錯,值得大家收藏:
曾憲雄、蔡秀滿、蘇東興、曾秋蓉、王慶堯(2005)。資料探勘。臺北市:旗標。(ISBN: 978-957-442-236-4)
以R實作循序樣式探勘 / Sequential Pattern Mining in R
雖然書裡面講了很多演算法,但要能夠使用才是真的學到這個工具。接下來我們就用R來實作循序樣式探勘吧。
運作環境與相關檔案 / Environment and Files
因為這次實作的時候需要用到R的環境,而運作R最簡單的工具就是RStudio,所以以下我都是用RStudio介紹如何操作。
- 運作環境:RStudio下載
然後下面是運作時需要的資料集跟腳本檔案:
- 資料集:input.csv
- 執行腳本:arulesSequences.r
有了這些檔案之後,請把它們放在同一個資料夾底下,我們就可以來實作循序樣式探勘了。
1. 準備資料集 / Prepare Dataset
資料集input.csv是記錄使用者行為資料,總共有三個欄位,說明如下:
- UserID:使用者編號,同一編號會被視為是同一位使用者的動作。
- Timestamp:使用者進行動作的時間,必須以整數形式呈現。這個時間只是讓程式判斷使用者行為的先後順序,時間的間隔並沒有意義,因此也可以單純設成「10」、「15」、「20」來表示先後即可。
- Events:使用者在該時間時做的動作事件。如果使用者同時做了很多動作,那麼請以「空白」隔開不同事件。
以上的資料可以輕易地從資料庫匯出,稍微懂SQL語法的人應該是不難做到吧。
2. 從R腳本開啟RStudio / Open RStudio from R Script
接著請在R腳本「arulesSequences.r」上面按滑鼠右鍵,從「開啟檔案」中選擇「RStudio」。
開啟RStudio之後,它會載入arulesSequences.r,並且把現在的資料夾視作工作目錄。
3. 設定最小支持度 / Set Minimun Support
在arulesSequences.r當中的第四行可以調整最小支持度:
# 最小支持度:篩選出至少40%的人共有的樣式
minSupport <- 0.4
最小支持度設置範圍在0至1之間,越小會找出越多序列、但是速度越久;反之越高則會找出越少序列,但速度比較快。你可以先用預設的0.4找找看結果,不滿意的話再回來調整最小支持度。
4. 執行腳本 / Run Script
接下來請全選腳本的文字 (可以使用快捷鍵Ctrl + a),然後下上方的「Run」執行。
執行完成之後,資料夾就會多出一個「output.csv」檔案,這就是我們最後跑出來的結果了。
5. 檢視循序樣式探勘結果 / Sequential Pattern Minig Result
上圖是探勘完成之後的成果,這裡面包含了四個欄位,說明如下:
- score:用sequence_length跟support相乘之後的數值,意思是兼顧序列長度跟支持度的綜合數值。
- sequence_length:序列長度。<{P},{F},{A}>表示長度為3的序列;<{B,F},{A}>表示長度為2的序列;<{A}>表示長度為1的序列。
- support:支持度,以比例呈現,表示有多少使用者都有出現這樣的序列。如果是0.5,表示有一半的使用者都有這樣的序列。如果是1表示全部的使用者都有這樣的序列。support越高,可信度也越高。
- sequence:序列。長度為3的序列<{P},{F},{A}>表示使用者會先做{P},再做{F}、最後做{A};長度為2的序列<{B,F},{A}>表示使用者會先做{B,F}兩件事情,然後再做{A}。
理想上我們要找到兼顧最大長度跟最大支持度的序列,因此我用score由高到低排序,score最高值即為我們要找的目標了。當然,有些情況我們會比較想要找到最大長度的序列,那麼就用sequence_length來排序即可。
結語 / In closing
這篇介紹了如何以R的arulesSequence來實作循序樣式探勘。為了教學方便,輸入格式上我採用的是csv格式,讓大家既可以用純文字編輯器(像是Notepad++)或是試算表工具(例如LibreOffice Calc)來編輯。當然,在實際使用的時候,最好的方式還是從資料庫匯入資料,像是「整合PostgreSQL資料庫的R中文文本探勘」這篇的做法。但這個部分就看後續有沒有必要,再來考慮是否要改寫吧。
話說回來,以前我也用JavaScript跟Weka來實作過類似的循序樣式探勘,為什麼這次改用R了呢?以前做的「循序樣式探勘工具」雖然實作了基本的演算法,但速度實在是太慢了,而且很難跟其他工具結合應用,因此不太實用。另一方面,Weka的全域循序樣式演算法(Generalized Sequential Patterns, GSP)雖然強大也很快速,但它輸入的資料中只有「時間」、「事件」,缺少了「使用者」這個重要的資料。因此他就只是把很多人的行為序列當做同一個人的資料來計算,算出來的結果當然很奇怪。這大概就跟MEPA不能考慮break是同樣的問題。翻來覆去找尋半天之後,最後還是用R來完成這個工作了。
希望這段簡單的工具可以幫到大家的忙。
我換了一個腳本檔的位置:
回覆刪除https://pulipulichen.github.io/blog-pulipuli-info-data-2017/05/lag-sequential-analysis/arulesSequences.r
請用這個
由於R的arulesSequences在探勘大型資料集(大概20個人、共2000事件)的時候效率過低,我改用Python的PrefixSpan演算法來探勘,這個就很有效率:
回覆刪除https://github.com/pulipulichen/PrefixSpan-py
之後有機會再來介紹一下這個
----------------
此外,我也找到另一個R用來探勘頻繁樣式的方法:Opus Miner
關於OPUS Miner的介紹
https://cran.r-project.org/web/packages/opusminer/index.html
整理到一半的script:opusminer.r
https://github.com/pulipulichen/blog-pulipuli-info-data-2017/blob/master/06/r-opus-miner/opusminer.r
可惜這個不是拿來探勘循序樣式的演算法,所以我做到一半就不做了
未來有需要可以再回來開發
https://sourceforge.net/projects/opusminer/files/?source=navbar
刪除opus miner本身就可以獨立執行
有空再來整理一下他的用法好了
網友反應這篇不能執行
回覆刪除錯誤訊息是
Error in lapply(X = X, FUN = FUN, ...) : object 's3' not found
需要再調查調查
我在自己電腦上執行,看起來並沒有問題
刪除http://2.bp.blogspot.com/-wG4ptw2E2qM/XNQ2Twc04SI/AAAAAAAEPRU/UzGQfgCJCbc4hYphBUzE1uKYuQfSj0INQCK4BGAYYCw/s1600/2019-05-09_221439.png
我懷疑可能是其中有兩個套件沒有順利安裝,所以我補上了安裝套件的程式碼
https://github.com/pulipulichen/blogger/blob/gh-pages/posts/2017/01/arulesSequences/arulesSequences.r
可以從這個連結重新下載arulesSequences.r腳本:
http://pulipulichen.github.io/blogger/posts/2017/01/arulesSequences/arulesSequences.r
布丁大大您好:
回覆刪除謝謝您仔細地介紹了循序樣式探勘,我自己對於循序樣式探勘與序列分析還是有點疑惑,請問您循序樣式探勘與之前提到的序列分析於分析資料上的差異在什麼地方呢?
To elisa,
刪除我先把行為編碼簡稱為動作,一動動完換下一動。
循序樣式探勘 sequential pattern mining:分析大量動作之間同時具備的模式,動作跟動作之間不一定連貫。通常不會用統計理論來檢定,但我想應該可以做得到。
滯後序列分析 lag sequential analysis, LSA:分析上一個動作跟下一個動作之間的關係,不考慮不連貫的動作,具備推論統計理論基礎。
兩種分析的理論基礎跟用途差異很大,只是輸入資料可能很像而已。
嗨嗨布丁!
回覆刪除不好意思我想請問為什麼score會是sequence_length*support?有什麼含意嗎?
謝謝您撥空回答!
你好,
刪除這是我自己訂的,一個兼顧長度跟支持度的評估指標。
並沒有太多學理基礎。
其實有很多其他指標可以用,你可以再研究看看。
有人反映R腳本無法下載問題。
回覆刪除這是因為Chrome認為這是可疑檔案,把它擋了下來。
請用自行確認瀏覽器下載狀態跟防毒問題再來處理。