:::

循序樣式探勘: 以R的arulesSequences實作 / Sequential Pattern Mining in R

image

循序樣式探勘是一種用來找出「大部分的人都有的行為模式」的有效方法。我以前用過JavaScript寫過循序樣式探勘工具,也用Weka的GSP來實作過,最近我又發現可以用R的arulesSequences來輕鬆完成循序樣式探勘的工作。以下我會介紹循序樣式探勘的概念,並分享用R來實作的腳本。


循序樣式探勘介紹 / Introduction to Sequential Pattern Mining

封面

這邊循序樣式探勘的概念介紹主要是來自於曾憲雄老師等人所著作的「資料探勘」一書,這本書寫得真的很不錯,值得大家收藏:

曾憲雄、蔡秀滿、蘇東興、曾秋蓉、王慶堯(2005)。資料探勘。臺北市:旗標。(ISBN: 978-957-442-236-4)


以R實作循序樣式探勘 / Sequential Pattern Mining in R

雖然書裡面講了很多演算法,但要能夠使用才是真的學到這個工具。接下來我們就用R來實作循序樣式探勘吧。

運作環境與相關檔案 / Environment and Files

2017-01-11_005139

因為這次實作的時候需要用到R的環境,而運作R最簡單的工具就是RStudio,所以以下我都是用RStudio介紹如何操作。

然後下面是運作時需要的資料集跟腳本檔案:

2017-01-14_110433

有了這些檔案之後,請把它們放在同一個資料夾底下,我們就可以來實作循序樣式探勘了。

1. 準備資料集 / Prepare Dataset

2017-01-14_110556

資料集input.csv是記錄使用者行為資料,總共有三個欄位,說明如下:

  • UserID:使用者編號,同一編號會被視為是同一位使用者的動作。
  • Timestamp:使用者進行動作的時間,必須以整數形式呈現。這個時間只是讓程式判斷使用者行為的先後順序,時間的間隔並沒有意義,因此也可以單純設成「10」、「15」、「20」來表示先後即可。
  • Events:使用者在該時間時做的動作事件。如果使用者同時做了很多動作,那麼請以「空白」隔開不同事件。

以上的資料可以輕易地從資料庫匯出,稍微懂SQL語法的人應該是不難做到吧。

2. 從R腳本開啟RStudio / Open RStudio from R Script

image

接著請在R腳本「arulesSequences.r」上面按滑鼠右鍵,從「開啟檔案」中選擇「RStudio」。

image

開啟RStudio之後,它會載入arulesSequences.r,並且把現在的資料夾視作工作目錄。

3. 設定最小支持度 / Set Minimun Support

image

arulesSequences.r當中的第四行可以調整最小支持度:

# 最小支持度:篩選出至少40%的人共有的樣式
minSupport <- 0.4

最小支持度設置範圍在0至1之間,越小會找出越多序列、但是速度越久;反之越高則會找出越少序列,但速度比較快。你可以先用預設的0.4找找看結果,不滿意的話再回來調整最小支持度。

4. 執行腳本 / Run Script

image

接下來請全選腳本的文字 (可以使用快捷鍵Ctrl + a),然後下上方的「Run」執行。

2017-01-14_110737

執行完成之後,資料夾就會多出一個「output.csv」檔案,這就是我們最後跑出來的結果了。

5. 檢視循序樣式探勘結果 / Sequential Pattern Minig Result

2017-01-11_163155

上圖是探勘完成之後的成果,這裡面包含了四個欄位,說明如下:

  • 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中文文本探勘」這篇的做法。但這個部分就看後續有沒有必要,再來考慮是否要改寫吧。

話說回來,以前我也用JavaScriptWeka來實作過類似的循序樣式探勘,為什麼這次改用R了呢?以前做的「循序樣式探勘工具」雖然實作了基本的演算法,但速度實在是太慢了,而且很難跟其他工具結合應用,因此不太實用。另一方面,Weka的全域循序樣式演算法(Generalized Sequential Patterns, GSP)雖然強大也很快速,但它輸入的資料中只有「時間」、「事件」,缺少了「使用者」這個重要的資料。因此他就只是把很多人的行為序列當做同一個人的資料來計算,算出來的結果當然很奇怪。這大概就跟MEPA不能考慮break是同樣的問題。翻來覆去找尋半天之後,最後還是用R來完成這個工作了。

希望這段簡單的工具可以幫到大家的忙。

總共1 則留言, (我要發問)

  1. 我換了一個腳本檔的位置:
    https://pulipulichen.github.io/blog-pulipuli-info-data-2017/05/lag-sequential-analysis/arulesSequences.r

    請用這個

    回覆刪除

留言工具: