談歷程資料分析:從摘要統計到個別序列 / Analyzing Activity Logs: From Summary Statistics to Individual Sequence
最近我試著應用機器學習到歷程序列資料的分析上,想說在這裡記錄一下進度與想法。不過在講歷程序列資料的分析之前,我想有必要先跟大家回顧一下所謂的歷程資料(activity logs)中的摘要統計與個別序列的差別,以及分析歷程統計資料和歷程序列資料的可能做法,這樣才能說明為什麼我要將機器學習應用在歷程序列資料分析上。這些方法跨了相當多領域,有些技術解釋與名詞選擇不甚嚴謹,望各位先進不吝指教。
歷程統計資料 / Activity Logs Summary
關於歷程資料的研究已經是一個有相當歷史的領域,不過大部分對於歷程資料的研究都著重在歷程資料的統計層次。許多人談到的歷程資料,指得都是將歷程資料的摘要後的敘述統計。為了跟本篇我主要想要談的歷程序列資料有所區別,我給這種統計形態的歷程資料一個名詞:歷程統計資料。
圖 / 來自iCAN5中我課堂上的資料
舉例來說,上圖就這是一種常見的數位學習平臺上的學習歷程記錄功能。在這邊會列出每一位使用者的上線時間、討論次數、教材瀏覽與下載次數、作業繳交次數、每次考試的成績等統計資料。許多研究就是使用這種歷程統計資料來進行統計分析或是機器學習的分類器,目的是找尋會影響最後學習成績的關鍵變項。
統計取向:多元迴歸 / Statistics: Multiple Regression
圖 / 布丁布丁吃什麼?
統計中的多元迴歸是分析多變量的一種常見方法,我們可以建構一個迴歸計算式,試圖以多個自變項預測依變項,並分析哪一個自變項對依變項影響最大。詳細請看我之前寫過的「以SPSS實作解釋型多元迴歸」。此外,基礎的做法是用相關分析來檢定變項與變項之間的關係,或是用因素分析以因素負荷量來為變項分組,而更進階的做法是路徑分析,像是SEM或PLS-SEM。
資料探勘取向:決策樹 / Data Mining: Decision Tree
圖 / 布丁布丁吃什麼?
機器學習的決策樹使用entropy (熵,亂度)指標或Gini係數指標來找尋哪一個自變項的劃分最能辨識不同的依變項,最後產生如上圖這種淺顯易懂的if-else決策樹規則。詳細請參考我以前寫過的「Weka決策樹分類法使用教學」這篇。如果依變項是連續變項,那麼也可以用Weka的M5P來建立多個線性迴歸計算式,預測誤差相當小。詳細可以看這篇:「Machine Learning: What is the difference between M5P/ Model trees and M5P/ Regression trees?」。
除此之外,我們也可以用分群方法來發掘使用者與變項之間的關係,推薦使用自動決定分群數量的自我組織映射法(Self-Organizing Maps, SOM)來分群,Weka也可以安裝SOM的套件喔。
然而,歷程統計資料的問題在於過度簡化了使用者個體的細節資料。歷程統計資料的分析方式僅以結束活動結束的單一時間點來分析使用者,而每位使用者在活動過程的細節一概被化簡為最後的統計資料。這是歷程統計資料的侷限。
歷程序列資料的記錄 / Activity Sequence: How to Collect?
圖 / 布丁布丁吃什麼?
歷程序列資料是歷程統計資料的原始資料形態。舉例來說,在歷程統計資料中的「布丁, 閱讀教材次數, 3」,在歷程序列資料中則是以個別條列的方式呈現,輔以時間資料將序列以先後順序排序:
- 布丁, 6/16, 閱讀教材
- 布丁, 6/17, 閱讀教材
- 布丁, 6/18, 閱讀教材
這種歷程序列資料是許多研究蒐集資料時所面對的原始資料。每一筆包含使用者、時間與動作的資料,在此我將之稱為「事件」。同一位使用者在同一個時間內可能會做不同的動作,但資料處理上還是以個別事件記錄。
行為編碼 / Behavior Coding
有些研究者會以錄影、錄音記錄研究對象的行為或所說過的話(這種就是訪談),然後再以編碼的方式轉化為可分析的資料單位。若這資料單位有附上時間先後順序,就會成為上述的歷程序列資料。
記錄網頁的操作歷程 / Logging Activities on Webpage
圖 / Google分析中的自訂報表
若是要記錄在網頁上的操作歷程,我們也可以用螢幕錄影或Google分析來記錄每一位使用者的操作細節。螢幕錄影可用實驗室同儕推薦的「Apowersoft免費線上螢幕錄影」(推薦用它的Chrome擴充功能,桌上版本限制較多),而Google分析記錄事件的方式,請參考我之前寫過到「Google分析的行為事件追蹤:使用jQuery加入事件」。至於最近比較熱門的是xAPI,它本質上是傾向於歷程資料格式的標準化,以利於不同平臺之間的交換與整合,詳細可以看「Experience API (xAPI) 追蹤所有學習經驗」這篇。
若是系統管理者,通常會採用系統內的資料庫記錄,或是使用更單純的:網頁存取記錄來進行分析。但這種做法有些問題,我想獨立一小節來跟大家談談網頁存取記錄。
歷程序列資料的記錄:網頁存取記錄 / Activity Sequence: Access Log
圖 / O'REILLY Safari
說到這種網頁操作記錄,更多系統管理者立刻想到的應該會是記錄在Apache或路由器上的網頁存取記錄檔access.log。許多研究會以此進行循序樣式探勘分析,但因為這種存取記錄有兩大問題:一、不能明確辨識使用者身份,對於著重於使用者的研究來說,限制頗多;二、網頁存取記錄無法記錄使用者在單一網頁上的操作細節,不夠詳細。
關於第一個問題,最簡單的做法是用IP作為辨識使用者的依據。然而,在多螢幕時代之中,電腦不僅不是唯一的上網設備、上網地點也不會一直使用家裡的網路,這樣可能會造成多個IP其實是在指同一位使用者,或是不同使用者共用同一個IP的情況,最後導致IP與使用者的關聯越來越弱。
這種不能明確辨識使用者的歷程序列資料乍看之下較難應用於研究上,但若考量到個人隱私與研究倫理,它反而可以視為是對使用者的一種保護。舉例來說像是像Apple的Siri只使用保留六個月內的資料,或是負面案例的Uber被人指控蒐集使用者個資、違反個人隱私的爭議,都是值得我們深思的問題。
總而言之,若要建立更強烈的使用者研究,勢必要加入更多辨識使用者的相關資訊。例如從IP辨識連線位置,從時間來辨識使用者形態。不然還是用系統資料庫內的歷程記錄吧。
歷程序列資料的分析 / Activity Sequence: How to Analyze?
前面提到的都是歷程序列資料的來源,這邊我要來講一下歷程序列資料的分析方法。
資料探勘取向:循序樣式探勘 / Data Mining: Sequential Pattern Mining
圖 / 布丁布丁吃什麼?
歷程序列資料分析方法中最具代表性的應該是機器學習中的「循序樣式探勘」。循序樣式探勘的目的像是敘述統計:目標是將較為複雜的資料化簡為容易說明的資料。它可以從許多人大量的歷程序列資料中整理出大部分共有的大型序列模式,不只是考慮相鄰接續的序列而已。
大部分作循序樣式探勘的研究結果都會搭配預測或推理來使用。如果使用者進入大型序列的開頭,那麼我們可以預測他接下來可能會走的序列模式。反之,若我們想要分析某些類型的使用者行為序列,那麼也可以用循序樣式探勘找出他們整體的模式。
然而循序樣式探勘從整體角度來探勘的優點卻也是它的缺點。循序樣式探勘找出來的大型序列僅說明有一定比例的人都曾經進行過這些歷程序列,但這個大型序列中的每一個事件卻都不一定是彼此相鄰。舉例來說,假如找出來的大型序列為<{P},{F},{A}>,這只能表示許多人依序都做過三個事件{P}、{F}跟{A},但卻並不代表他們會連續作{P}、{F}跟{A}這三個事件。
統計取向:滯後序列分析 / Statistics: Lag-Sequential Analysis
圖 / 我教課的內容
滯後序列分析則是基於推論統計來分析行為序列的做法,這方法通常稱為序列分析。序列分析在整理資料時必須先決定要分析的序列長度,也就是lag,通常是用於分析2個事件序列長度。序列分析以列聯表的方式來檢定每個事件到下一個事件的次數(稱之為事件轉移)是否顯著地多於整體常態分佈,以此可以看出使用者個人或群體是否具有顯著的事件轉移模式。
相較於循序樣式探勘,滯後序列分析所得到的顯著結果具有統計上的意義,說服力較高。但跟大部分推論統計分析一樣,序列分析通常較難出現顯著,除非使用者行為序列的確有明顯的模式。
滯後序列分析的另一個問題在於受限於事件序列長度。通常滯後序列分析是針對相鄰的兩個事件進行分析,即使出現顯著的事件轉移,也只能說使用者常常在作{U}事件之後就會換{S}事件,這個結果不能推估到三個事件長度上。
最佳化取向:螞蟻演算法 / Optimization: Any Colony Algorithm
不論是循序樣式探勘或是滯後序列分析,它們得到的結果都只能呈現使用者們一部分的行為模式。若要綜合使用者整體的歷程序列資料來摘要出更長、更完整的行為序列,那麼可以採用的是知名的最佳化演算法之一:螞蟻演算法。
螞蟻演算法會呈現出較多人、較近走過的序列,淡化較少人、較久之前走過的序列,以此不僅能夠呈現出整體最佳化的行為序列,也能將許多人都會作的行為序列推薦給新來的使用者。若考慮到每一位使用者的個體差異,有一種特化的菁英螞蟻演算法會儘量保留評價較好的使用者所走過的序列,而評價較差的使用者就儘快地淡化、忽略。在資料時常變動的動態環境,或是分析資料的時間有所受限的情況下,螞蟻演算法的效果都很不錯。詳細請看以前我寫過的這篇:「閱讀最佳化路徑知識萃取:使用螞蟻演算法」。
然而,螞蟻演算法儘管能夠整理出使用者整體的行為序列,但這卻不一定適合不同特質的使用者。舉例來說,我們可以將多位程度不一的學生們的歷程序列資料以菁英螞蟻演算法歸納出一條行為序列,而這條序列理論上會偏向於程度較好的學生所做過的行為序列,卻不是程度較差的學生會作的事情。以最近發生的例子來看,這篇「Re: [問卦] 建中天才,台大醫科,然後呢?」談到資質較好的學生一週只需要唸一天的書就能考高分,而偏鄉程度較差的學生每天熬夜唸書卻還是考很差。這之中帶給我們的啟示是,比起找出「整體最佳」的行為序列,我們是不是更應該注重的是每位學生的個人特質,再來推薦他較好的行為序列呢?
其他最佳化的做法 / Other Optimization Approaches
這種以適性化為主的應用並不是螞蟻演算法的強項,同樣地類似的最佳化演算法粒子群優化也會遭遇相同的問題。
若要考量到固定條件下的最佳化做法,基因演算法(或遺傳演算法)可能會是許多研究者的首選。然而,設計影響基因演算法成敗的適應度函數是一件不容易的事情,雖然一般來說是以專家經驗和理論來訂定,但這不就可惜了手邊蒐集的歷程序列資料了嗎?
時間序列取向:差分自迴歸滑動平均模型 / Time Series Analysis: ARIMA
由於歷程序列資料常常伴隨著時間資料,因此很多人第一個想到的就是時間序列分析,或稱為時間數列分析(注意,這裡是Series並非Sequence)。但個人覺得這種分析方法其實並不適用於歷程序列資料上。
時間序列分析的常見做法是連續型單變量的預測,而自變項就是時間本身。要預測的對象是會隨著時間變動的資料,像是股票成交量、購物交易量、或是某一行為的發生次數。常見的分析技術是ARIMA模型,它能夠處理非平穩(有趨勢性)、排除季節循環性等因素,並檢定預測結果是否有統計上的意義。
不過主要擅長預測連續型單變量的時間序列分析,用在歷程序列資料上面卻很奇怪。我上面所提的歷程序列資料是以一筆一筆事件所組成,而這個事件通常是類別型的資料,而且是多個不同的類別,事件彼此之間並沒有次序高低之分,並非連續資料。
有一種做法是將類別資料轉換成連續型的虛擬變項。再為不同的類別變項各別建立時間序列分析模型來進行預測。但這種做法將不同的事件拆開獨立看待,拋棄了歷程序列資料中不同事件的關聯。二來是大部分事件發生的次數過於分散,可能無法建立有預測性的模型。
時間序列分析另外一個問題在於大多考慮的都是單變項。雖然也有用「介入模式」來建構受特定筆數影響的時間序列模型做法,但這只有在因果關係較為明確的情況下才能選擇要作為介入模式的虛擬變數,在因果關係不明的歷程序列資料之中就比較難派上用場。
資料探勘:動態迴歸 / Data Mining: Time Series Forecasting
圖 / Weka timeseriesForecasting
資料探勘工具Weka中也有時間序列預測的工具,但它的做法並不是使用傳統的ARIMA來建立模型,而是用機器學習中的迴歸分類器(如支持向量機迴歸模型SMOreg)來建構非線性的預測模型,預測的成效也很不錯。「王者歸來: WEKA機器學習與大數據聖經」這本書或「Time Series Analysis and Forecasting with Weka」對此功能有較為詳細的介紹。
這種做法一樣是以時間作為自變數,以此來預測目標單變量的高低,看起來跟ARIMA好像差不多。但受惠於機器學習的多變量分析能力,我們還可以額外將其他的特徵加入到訓練集中,讓分類器能考量更全面的變項後再來進行預測。
資料探勘取向:動態貝氏網路與遞迴神經網路 / Data Mining: Dynamic Bayesian network and Recurrent Neural Network
圖 / 維基百科
相較於上面時間序列預測主要考慮到的是時間本身,對只有先後順序的歷程序列資料來說,動態貝氏網路 (Dynamic Bayesian network)則是合適的一種分析方式。
動態貝氏網路是一種以固定序列長度中的事件來預測下一個事件的做法。常見的時間長度為2,也就是用一個事件來預測下一個事件,稱為雙時間片段貝氏網路(Two-Tiomeslice Bayesian network, 2TBN)。動態貝氏網路的特色在於高泛用性,可用於各種的歷程序列資料,但在資料探勘領域中動態貝氏網路卻已經不再受人關注。看到現在我只有在「人工智慧:現代方法」這本書中看到比較詳細的介紹。
圖:類神經網路 -- Recurrent Neural Network
儘管很少人提及,但動態貝氏網路的精神卻仍保留在近代熱門的深度學習技術中。用於序列資料的深度學習技術遞迴神經網路就是用歷程序列資料中的鄰接事件來作為訓練資料,最後可以得到一個能夠預測下一個事件的模型。這是一種相當有意思的做法,跟動態貝氏網路一樣,可以應用於各種歷程序列資料的分析上。
結語 / Conclusion
歷程資料的分析從宏觀的統計敘述到微觀的序列事件,分析方法五花八門,從統計到機器學習都可以派上用場。這篇雖然花較多篇幅在講微觀的歷程序列資料,但並不是說歷程統計資料就比較不好。
重點是,在進行歷程資料的分析之前,我們必須要先問自己一個非常重要的問題:我到底想要分析什麼?如果是想要探討整體變項之間的關聯,用統計來分析歷程統計資料是一個不錯的選擇;若是想要快速看到使用者整體概況,分群也是一個很有用的方法。
相較之下,歷程序列資料分析的結果通常會令研究者更難以處理。循序樣式探勘會探勘出大量大型序列,滯後序列分析會在意外的事件組合中出現顯著,讓研究者需要費盡心思來解釋為何序列會是如此,不過有時候卻只是使用者無心差柳的巧合。最佳化的作法會在整體與適性上有所取捨,而資料探勘的方法可能可以產生出更考量更周全的事件序列,但它們都不具備統計上的意義。
最後讓我比較感興趣的仍是用資料探勘的方式來分析歷程序列資料,而且這個分析並非用於描述、摘要使用者的歷程序列,而是在考量使用者個人背景特徵的適性化策略下,產生評價較好的推薦序列。下一篇我再來介紹這個做法。
這篇寫著寫著忽然想到,其實我是圖書資訊學的學科,研究主題比較接近教育的數位學習,但其實並不具備資工、應數、統計等科系的背景,總覺得好像哪裡怪怪的。
噢對了,這篇並不是在寫論文喔,只是記錄一下手邊在作的事情而已。
喔對了,這篇有地方寫錯了
回覆刪除SOM不是自動決定分群數量的方法,他是用設定網格決定分群數量的喔