AC - Data & AI - 推薦系統 RecSys

前言


很榮幸自己能在八百多個報名者中被 AlphaCamp (以下簡稱AC) 錄取 Data & AI - 推薦系統 RecSys 這個課程。

參加 AC 前,其實我參加了不少在職訓練網上所開設的 Python 課程,基本上每堂課都是從最初階的開始教,學員能力也並非像 AC 有考核門檻事先挑選過,那為何我還是會選擇上那些課,其實就是讓自己接觸 Python 的時間多一點點,讓自己更熟悉這個語言。

這次吸引我報名 AC 的理由如下:

培養能落地業界,用數據解決問題的人才,能根據產業問題用適當的方法解決。

  1. 拆解接近產業的問題資料。
  2. 了解從資料到結果的開發過程。
  3. 鍛鍊思考問題,評估產出,並溝通觀點。
  4. 吸取產業前輩的經驗與觀點。
  5. 密集與導師、助教、同學溝通討論,激盪想法,不再只是孤單的線上自學。
 

工作六年多來,有五年待在科技(工業)產業,

近年則是在「化工」材料貿易業,

然而推薦系統絕大部分是用在〝電商〞居多,

對我來說真的是一門很新很新的領域😅,

而且同學們真的是臥虎藏龍阿......

真心很怕跟不上。
 

筆記一下電商知識(常識?)

  1. CPC:以點擊作為廣告計價的方式。
  2. CPM:以曝光作為廣告計價的方式。
  3. CPA:以成交作為廣告計價的方式。
  4. PV:Pageview 不重複瀏覽量。
  5. CTR:Click through rate 點擊率
  6. UGC:使用者創造平台
  7. 一千次觀看定律:看點擊數、停留時間、按讚比例
 

電商賺錢取決的點:

  1. 流量。
  2. 商品多樣性。
  3. 品牌多樣性。
  4. 客單價。
  5. 訂單量。

電商營收:流量 * 轉換率 * 客單價
 

以下為電商常用的推銷手法

非 AI 提高營收或客單價方法:

  1. 手動投放廣告,提高其他替代品的曝光度,打進品牌忠誠度較低的客戶。
  2. 供應鏈管理,解決熱賣貨品缺貨問題或是談降價 (成本下降)。
 

AI 的話則為推薦系統,

我自己所認知的推薦與預測的差異在於:

預測:是有正確答案的,我就是要精準預測到消費者喜歡什麼然後推播出去。

推薦:推播消費者〝可能〞喜歡的東西,藉此擴張消費者喜好領域。
 

推薦系統成功指標:

  1. 首頁的推薦系統 → 提高讓客人找到想要商品的機率,提高轉換率。

  2. 結帳前的推薦系統 → 提高讓客人順手帶走其他產品的機率,提高客單價。

 

什麼是推薦系統?


透過預測使用者對物件的評分或偏好的訊息過濾系統
 

推薦系統靠什麼推薦?

Output → 商品、物件、內容

Input → 物品的屬性、使用者資料與偏好

    物品屬性:商品分類、品牌/系列、顏色、場景

    使用者資料與偏好:

        背景資料:性別、年齡、興趣、位置

        偏好:

            顯性評分 (Explicit rating):對一個物品的評分:精準、具體、稀有、主觀

            隱性評分 (Implicit rating):透過使用者的行為推敲

                點擊:大量資料不精準

                觀看、收聽、閱讀:相對準確 & 容易取得可被操作

                購買:非常精準資料量相對少,不一定能取得 (可透過會員制解決)

                搜索:直接反應使用者興趣需要額外處理大量資料


Top-N推薦

N:推薦系統的推薦數

你可能會喜歡 + 你可能也需要 + 別人也購買 ... 等等

再推薦前先淘汰掉已經購買(或放在購物車)、評分過低、缺貨等等
 

推薦系統存在目的

✅呈現給使用者他們會喜歡的東西

❌準確預測使用者對每一個物品的偏好
 

評估推薦系統成效

線下評估:在正式上線前,使用手上的資料去評估 (Train, Test split)

線上評估:部署後,觀察實際使用狀況

    技術評估:系統反應時間與穩定度

    成效評估:A/B Test、點擊率、轉換率、質化反饋(問卷調查、訪談)
 

推薦系統解決的問題

降低選擇障礙

提升個人化體驗,提升互動或轉換

增加長尾商品的曝光

※ 長尾商品:非主流、需求量小的商品
 

推薦內容呈現方式

  • Browsing:根據查詢返回高質量推薦
  • Similar Item:根據相似物品推薦
  • Email:郵件推播感興趣商品
  • Top-N:推送最可能吸引用戶的商品
  • Order-Search Result:搜尋結果按興趣排列
 

演算法的考量與選擇

(動動腦)

情境一:電商剛建立

情境二:商品數量少

情境三:商品購買週期明確

→ 只要能讓使用者買單的推薦商品就是好的演算法
 

常見的推薦演算法

簡單規則(Simple Rule Based)

    個人化規則,不容易定義

    常見方法:

    人口統計推薦

    知識導向推薦:專家推薦 (藥局之類的)

    關聯規則推薦:那些商品共同購買機率高 → 貨品擺位 (結帳台前後商品)

    假設規則推薦:排行榜、時事

    ...
 

內容推薦(Content Based) → 根據商品屬性,推薦類似商品

    產生品項過於相近
 

協同過濾(Collaborative) → 根據類似顧客的偏好 (其他人也看了、其他人也購買了 ...)

    資料量小:冷啟動

    資料量大:運算過久

    常見方法:

         矩陣分解算法 Matrix Factorization

         特徵值分解

         奇異值分解

         Funk - SVD

         ...
 

混合型(Hybrid)

深度學習(Deep Learning)
 

簡單規則 simple-ruled


個人化規則,不容易定義

常見方法:

人口統計推薦

知識導向推薦:專家推薦 (藥局之類的)

關聯規則推薦:那些商品共同購買機率高 → 貨品擺位 (結帳台前後商品)

假設規則推薦:排行榜、時事

實作
https://github.com/JianChengChang/RecSys-sample/blob/main/rule_base.ipynb
 

內容過濾 Content-based filter


流程三步驟

  1. Item Representation:為每個 item 抽取初一些特徵來表示此 item
  2. Profiling Learning:利用客戶過去喜歡或不喜歡的 item 特徵,來學習用戶的喜好特徵
  3. Recommendation Generation:比較上一步用戶 Profile 與 候選 item 特徵,為此用戶推薦一組相關性最大的 item

 

要思考的是

  1. 一開始蒐集的資料是否有偏差
  2. 彙整後的資料該如何整理和設計特徵
  3. 使用者的行為該蒐集哪些?如何蒐集?哪些才能代表使用者的偏好?
  4. 推薦內容的應用情境是什麼?使用者想獲得什麼樣的推薦內容?
  5. 現階段有哪一些時間資源等限制?

實作

https://github.com/JianChengChang/RecSys-sample/blob/main/content-based.ipynb
 

協同過濾 Collaborative-based filter


是一種基於「關係」的推薦,從相似的使用者當中,找到尚未購買的東西並推薦。

在過去有相似有相似偏好的使用者,這群使用者在未來也會有相似偏好。

協同過濾推薦又分成

  • Memory Based:用餘弦相似度找出相似和有關聯的使用者,並提出平均排名。
  • Model Based:利用機器學習/降維方法降低計算時的負擔。
 

執行細節:

  • 如何蒐集使用者偏好。
  • 怎麼找到偏好相似的使用者。
  • 所謂相似要如何衡量。
  • 偏好不明的使用者該怎麼處理。
 

Memory Based

基於關係的推薦:

以物品為基礎的協同過濾 (Item-based)

    喜歡/討厭相同商品的使用者可能偏好差不多/差很多,
    以已知使用者評分,計算其他物品對於目標物品的相似度,
    利用計算完的相似度及已知使用者評分,
    反推使用者對於目標物品的評分。

    使用者 A 喜歡 Item A, C,
    使用者 B 喜歡 Item A, B, C,
    使用者 C 喜歡 Item A,
    看起來 Item A 和 Item C 較為相似,
    因此我們會推薦 Item C 給尚未買過的 User C。 Item-based 對於長尾商品有較好的推薦效果
 

以使用者為基礎的協同過濾 (User-based)
    喜歡/討厭相同商品的使用者可能偏好差不多/差很多,
    以已知使用者評分,
    計算其他使用者對於目標的相似度,
    利用計算完的相似度及已知使用者評分,
    反推未知的目標使用者評分。

    使用者 A 喜歡 Item A, C,
    使用者 B 喜歡 Item B,
    使用者 C 喜歡 Item A, C, D,
    這樣看來 使用者 A 和使用者 C 的偏好較為類似,
    因此會推薦 Item D 給使用者 A。
 

怎麼計算相似

  1. Cosine 餘弦相似度
  2. 歐式距離
  3. 皮爾森相關係數
  4. Jaccard
  5. 同現相似度 (occurrence)
 

優點

結果有多樣性、可解釋性高
 

缺點

資料越稀疏表現越差、計算量大、冷啟動 (新使用者、新產品)
 

實作
https://github.com/JianChengChang/RecSys-sample/blob/main/collaborative_filter_ver2.ipynb

 

Model Based

上面的 Memory Based 算法需要計算所有物品或消費者之間的相似度,

也就是窮舉法,

這樣的算法會耗費相當大量的計算資源。

在 Netflix Prize 大賽中,

有人提出了利用矩陣分解的方式,

因此矩陣分解的推薦系統開始被大量研究及優化,

其中又以 SVD 奇異值分解為代表,

甚至做出了方便使用的套件,

Surprise

Daniel Pyrathon - A practical guide to Singular Value Decomposition in Python - PyCon 2018

LightFM

Maciej Kula - Hybrid Recommender Systems in Python

詳細數學原理不在這撰寫,

網路上Google可以找到更多高手的詳細解說。
 

優點

結果有多樣性、可解釋性高
 

缺點

資料越稀疏表現越差、計算量大 (比Memory Based少)、冷啟動 (新使用者、新產品)
 

實作 (用lightFM)
https://github.com/JianChengChang/RecSys-sample/blob/main/mf-lightfm.ipynb
 

課堂心得


在執行 iCook 提供的真實資料做推薦系統時,

(iCook 專案有簽保密條款,資料或詳細作法這邊不多談)

第一週大概花了三四天左右,

第二週又花了五天持續探索優化可能,

從最簡單粗暴的 Rule-Based,

先處理各種中文才能做的 Content-Based,

亦或是最潮的 Collaborative filtering,

從 亞馬遜 的 Beauty 資料到 iCook 專案,

都讓我學到了扎扎實實處理資料的技巧。
 

而 iCook CTO Richard 的分享,

不用管方法,新不新穎,

就像 Rule-based,簡單可恥但極好用,

就是個好方法,

但容易落入大者恆大的局面。
 

Content-Based 雖然能造就一點多樣性,

但標籤的處理過程則是超級麻煩。
 

Collaborative filtering 更不用說了,

所有資料倒下去,需要先來台超強電腦跑個幾天,

效果還不一定比 Rule-Based 好。
 

Richard 也大方分享了一些 UGC 常用手法,

請使用者分類阿...查詢 google 搜尋關鍵字阿等等。
 

資料分析 / 資料科學這檔事,

不是一個人學了一堆很潮很棒很新穎的方法然後硬套,

而是要先有相關領域知識、基礎的統計或數學、能容納大量資料的硬體與專業管理人員,

但最要且最困難的是前期的資料蒐集與資料工程、UX/商業洞察,做好這些是可以提升成效的,

還要考慮的還有

  • 資料易用性的 Checklist
  • 是否能自助將資料倒進
  • 是否能找到想要的資料
  • 若沒有資料,是否能有負責人將這樣的數據找出來
  • 透過BI取得初步資料進行分析
  • 可以直接對營收產生影響的最容易下手
  • 額外產生營收的東西最困難,需要有好的商業洞察
  • 團隊成員具備資料素養
  • 是一個工作文化,不是一個專案
 

總而言之,

這是一個團隊,

需要由下而上 Bottom Up 的推廣,

更要由上而下 Top Down 的支持,

也是目前台灣大部份公司所欠缺的資料精神。

很感謝 AC 錄取了年紀相對偏高的我,

這堂課的精實程度,

讓我需要偷偷利用上班時間做學習與練習,

也感謝自己撐完這六週,

且都有準時繳交作業,

美中不足的是,

我太害羞了,

發言沒有其他同學來的積極,

也不太會發問問題,

也許是因為自己都待在工業界居多,

對於商業的問題有些難以啟齒。

最後,

真心推薦 AlphaCamp 的育才方式,

未來若還有資料相關的課程,

我還是會毫不猶豫地馬上報名。