選擇合適的推薦系統模型

吳文敏發表於2015-05-20

我們的機器學習工程師一直忙於構建GraphLab farm。這篇部落格針對一個特殊的應用難題:怎樣從 GraphLab Create recommender toolkit 的眾多模型和選項中選擇一個合適的推薦模型。

這完全取決於你現有的資料型別以及你評估結果的方式。

(注意:這裡使用的是GraphLab Create 0.9 的API。GraphLab Create 1.0 支援通過recommender.create() 來智慧選擇推薦模型。你可以通過 1.0 的API文件檢視recommender toolkit中模型的最新說明。此外,這個論壇列出了從版本0.9.1到版本1.0的API變動。)

如果你的資料是隱性的,也就是資料中僅有使用者和物品間的互動資訊(沒有使用者對物品的打分),那麼,你可以選擇使用Jaccard相似度的 ItemSimilarityModel

當資料為隱反饋時,你可以通過增加一個均為1的目標列把資料偽裝成顯性資料。若要構建追求排序效能的模型,請見下文。

如果資料是顯性的,也就是觀測資料中包含使用者的真實評分,那麼你可以從多個模型中選擇。使用cosine或Pearson相似度的ItemSimilarityModel可以包含評分資訊。此外,MatrixFactorizationModel(矩陣分解模型)、FactorizationModel(分解模型) 以及 LinearRegressionModel(線性迴歸模型) 都支援評分預測。

如果你的目標是提高排序效能,你可以在設定 ranking_regularization 的情況下使用 ItemSimilarityModel(物品相似度模型)、MatrixFactorizationModel(矩陣分解模型) 、 FactorizationModel(分解模型)。排序正則化選項設定後會隨機地選取一些未觀測資料並把它們的目標評分設成一個偏負面的值。ranking_regularization 值在0到1之間。該值越大,負樣本的權重也就越大。如果你想使用 分解模型來處理隱反饋資料,你應該首先給 SFrame 增加一列全為1的值把它變成顯性資料,再將 unobserved_rating_value 設為 0 來執行排序正則化。這裡明確地設定 unobserved_raint_value 是有必要的,因為模型預設把未知評分設為已知評分的 5% 分位數;當所有已知評分均為 1 時,它們的 5% 分位數也是 1,不能把它作為未知評分的目標值。

如果你想對評分資料進行評分預測,那麼選擇MatrixFactorizationModel, FactorizationModel, or LinearRegressionModel的任意一個。從統計學的角度看,這三個模型都是明確地對評分建模的迴歸模型。換句話說,觀測評分被建模為一些項的加權組合,其中權重(包括一些項,也被成為因子)通過訓練資料得到。這幾個模型都可以很方便地引入使用者或物品特徵。

LinearRegressionModel 假設評分是使用者特徵、物品特徵、使用者偏置、物品流行度偏置的線性組合。MatrixFactorizationModel 和 FactorizationModel 還可以引入兩個向量的內積項,其中一個向量表示使用者對一組隱性特徵的喜好程度,另一個向量表示物品對這組隱性特徵的包含程度。這些通常被稱為隱性因子並且可以從觀測資料中自動學習得到。FactorizationModel (分解模型)較 MatrixFactorizationModel(矩陣分解模型) 更進一步, 考慮到了這些隱性因子與邊際特徵的互動影響。一般來說,FactorizationModel(分解模型) 最有效,但也最難訓練(由於它的威力和靈活性)。LinearRegressionModel(線性迴歸模型) 最簡單,訓練速度也最快,但沒有考慮使用者物品間的互動作用。

我們建議你從 MatrixFactorizationModel(矩陣分解模型) 開始,如果這個模型執行時間過長,可以降級使用 LinearRegressionModel(線性迴歸模型)。或者,如果你認為需要使用二階互動項來加強模型,可以升級使用 FactorizationModel(分解模型)。注意,這些模型都帶有幾個正則化引數如:n_factors 和 regularization,這些引數會影響測試時的預測精度。這對於 FactorizationModel(分解模型) 尤為有用。建議你使用超引數搜尋函式 graphlab.toolkits.model_params_search() 來調整這些引數。

如果目標評分是二值的,也就是它們的值是贊或踩標籤,在使用迴歸模型(LinearRegressionModel, MatrixFactorizationModel, FactorizationModel)時,設定輸入引數‘binary_targets = True’。

使用MatrixFactorizationModel(矩陣分解模型) 和 FactorizationModel (分解模型)訓練得到的隱性因子可以作為特徵用於其他的任務。在這種情形下,使用非負因子有利於提高可解釋性。簡單地使用‘nmf=True’作為輸入引數,分解型別的模型就會學習非負因子。

已有資料?資料問題?

最後,有幾個影響推薦系統效能的常見資料問題。第一,如果觀測資料非常稀疏,也就是僅包含大量使用者的一個或兩個觀測資料,那麼任何一個模型都不會比 popularity 或 item_means 這些基準模型效果好。這種情況下,將稀疏使用者和物品剔除後重試也許有用。另外,重新檢查資料收集和清理過程,看錯誤是否源於此處。儘可能對每個使用者每個物品獲取更多的觀測資料。

另一個經常會遇到的問題是把使用資料當做評分。與顯性評分位於一個很好的線性區間(例如,[0, 5])不同,使用資料可能被嚴重扭曲。例如,在 Million Song 資料集中,一個使用者播放一首歌超過 16000 次。所有的模型都很難應對這種嚴重扭曲的目標。解決的方法是對使用資料進行歸類。例如,把播放次數超過 50 次對映成最高評分 5 。你也可以把播放次數轉成二進位制,例如播放超高兩次的為 1,反之為 0。

好吧,都記住了嗎?是的,我們一半都記不住。下面這幅粗略的資訊圖一目瞭然地顯示了所有的提示。愉快地探索吧,勇敢地推薦系統研究者!

欲瞭解更多資訊,請檢視我們最新的 copious documentation,讓我們知道你的想法。

相關文章