碩論:應用協同過濾技術於表演藝術售票系統(三)
此系列是寫給藝術行政同行的,所以不會有太理論或太技術的內容。想看程式碼的請直接到我的 GitHub repo,想直接讀論文的,可以從這邊下載。
感謝國家兩廳院支持,提供兩廳院售票系統 2011–2019年間,系統會員購買國家兩廳院演奏廳演出票券的交易紀錄,讓我實作推薦系統。
實驗第一步是建立一個基準點。因此先用協同過濾模型的定義,建立一個以物品為基礎的模型,並以該模型的表現為基準,進一步尋找表現能超過基準的深度學習模型。
如同前一篇所述,以物品為基礎的協同過濾模型是以過去的交易紀錄來提出推薦。因此第一步為建立「使用者與物品對應矩陣」(user-item matrix)。使用者與物品對應矩陣的每一列代表一個使用者,欄則是各個產品。如下圖所示,左側的交易紀錄,可記為右側的矩陣:使用者購買該產品,對應的格子就記為 1。
空格的部分,有很多不同處理方式。因為音樂會有「演出結束後,票券就下架」的特色,也就是說過去沒有購買、未來也不可能買得到,所以空格可以全部填上 0。另外,這邊沒有考量使用者購買多張票券的狀況,單純只看有沒有買。因此,資料集的使用者與物品對應矩陣,長的類似這樣:
有了使用者與物品對應矩陣後,我們就可以計算購買某音樂會的會員組成,與其他音樂會的相似度(回想一下前篇蘋果和草莓的例子)。矩陣的每一欄為該場音樂的購票會員組合,因此我們可以把欄作為該場音樂會的向量,這樣就能計算向量之間的相似度。兩場音樂會,購票的會員組合越相似,兩場音樂會相似度就越高。(數學苦手的朋友,可以跳過這段沒關係。)
計算向量的相似度有很多方式,我採用的是餘弦相似度 (cosine similarity)。上圖的公式中,Ui 表示曾經購買過音樂會 i 的所有使用者;Uj 則為買過音樂會 j的所有使用者。使用者 u 如果購買了音樂會 i,r = 1;沒有購買的話, r = 0。因此,只要使用者同時購買音樂會 i 和 j,分子就會 + 1;分母則是分別計算購買音樂會 i 以及音樂會 j 的使用者總數開根號後相乘。最後得到的結果 Sim,就是音樂會 i 和音樂會 j 的相似度。
有了所有音樂會之間的相似度後,我們就可以計算某個使用者 u 購買架上販售中音樂會 t 的可能性分數。可能性分數計算方式如下圖。分母為目標音樂會 t 與其他音樂會相似度的總和;分子則是使用者 u 實際購買過的音樂會,與音樂會 t 的相似度總和。
計算使用者 u 對所有架上販售中音樂會的可能性分數後,挑出分數最高的前 k 項,就是模型提出的推薦清單。在我的實驗中,k 設定為 10。
這邊就不詳述整個實驗流程怎麼做的,有興趣的人請自己看論文。總之,以物品為基礎的協同過濾模型,最後得到的召回率 (recall) 是:0.49。
這是什麼意思呢?推薦系統為使用者提出推薦清單,使用者看了之後,真的購買了推薦清單中的品項,代表推薦清單真的有擊中使用者的心。因此我們可以透過計算使用者實際購買的節目,有多少項被選入推薦清單中,來衡量推薦系統的功力。如果使用者實際購買的三場節目,有兩場選入推薦清單內,我們就說召回率是 2/3。因此,以物品為基礎的協同過濾模型,可以將使用者實際購買的節目約半數納入推薦清單中。
考量到我們只用交易紀錄來建立這個推薦系統,這個召回率算滿高的。接下來,就是要建立召回率超過 0.49 的深度學習推薦系統。