咱們的機器學習工程師一直忙於構建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
2
3
4
|
# 當數據中僅包含'user_id'和'item_id'兩個屬性的時候
# recommender.create 方法會自動選擇
# `method=‘item_similarity’` and `similarity_type=’jaccard’`
>>> itemsim_jaccard_model = graphlab.recommender.create(data)
|
當數據爲隱反饋時,你能夠經過增長一個均爲1的目標列把數據假裝成顯性數據。若要構建追求排序性能的模型,請見下文。
若是數據是顯性的,也就是觀測數據中包含用戶的真實評分,那麼你能夠從多個模型中選擇。使用cosine或Pearson類似度的ItemSimilarityModel能夠包含評分信息。此外,MatrixFactorizationModel(矩陣分解模型)、FactorizationModel(分解模型) 以及 LinearRegressionModel(線性迴歸模型) 都支持評分預測。
1
2
3
4
5
6
7
8
|
# 此時數據中包含 3 列,‘user_id’,‘item_id’ 以及 ‘rating’
>>> itemsim_cosine_model = graphlab.recommender.create(data,
target=’rating’,
method=’item_similarity’,
similarity_type=’cosine’)
>>> factorization_machine_model = graphlab.recommender.create(data,
target=’rating’,
method=’factorization_model’)
|
若是你的目標是提升排序性能,你能夠在設置 ranking_regularization 的狀況下使用 ItemSimilarityModel(物品類似度模型)、MatrixFactorizationModel(矩陣分解模型) 、 FactorizationModel(分解模型)。排序正則化選項設置後會隨機地選取一些未觀測數據並把它們的目標評分設成一個偏負面的值。ranking_regularization 值在0到1之間。該值越大,負樣本的權重也就越大。若是你想使用 分解模型來處理隱反饋數據,你應該首先給 SFrame 增長一列全爲1的值把它變成顯性數據,再將 unobserved_rating_value 設爲 0 來運行排序正則化。這裏明確地設定 unobserved_raint_value 是有必要的,由於模型默認把未知評分設爲已知評分的 5% 分位數;當全部已知評分均爲 1 時,它們的 5% 分位數也是 1,不能把它做爲未知評分的目標值。
1
2
3
4
5
6
7
8
9
10
11
12
|
# 數據中包含一列真實的評分
>>> ranking_regularization_model = graphlab.recommender.create(data,
target=’rating’,
method=’matrix_factorization’,
ranking_regularization=1.0)
# 數據中包含一列「僞造」的評分,所有爲 1
>>> rr_model_for_implicit_data = graphlab.recommender.create(data,
target=’rating’,
method=’matrix_factorization,
ranking_regularization=1,
unobserved_rating_value=0)
|
若是你想對評分數據進行評分預測,那麼選擇MatrixFactorizationModel, FactorizationModel, or LinearRegressionModel的任意一個。從統計學的角度看,這三個模型都是明確地對評分建模的迴歸模型。換句話說,觀測評分被建模爲一些項的加權組合,其中權重(包括一些項,也被成爲因子)經過訓練數據獲得。這幾個模型均可以很方便地引入用戶或物品特徵。
1
2
3
4
5
6
7
8
9
|
# 當數據包含一列目標值時,默認的方法是 matrix_factorization
>>> matrix_factorization_model = graphlab.recommender.create(data,
target=’rating’)
>>> linear_model = graphlab.recommender.create(data,
target=’rating’,
method=’linear_model’)
>>> factorization_machine_model = graphlab.recommender.create(data,
target=’rating’,
method=’factorization_model’)
|
LinearRegressionModel 假設評分是用戶特徵、物品特徵、用戶偏置、物品流行度偏置的線性組合。MatrixFactorizationModel 和 FactorizationModel 還能夠引入兩個向量的內積項,其中一個向量表示用戶對一組隱性特徵的喜愛程度,另外一個向量表示物品對這組隱性特徵的包含程度。這些一般被稱爲隱性因子而且能夠從觀測數據中自動學習獲得。FactorizationModel (分解模型)較 MatrixFactorizationModel(矩陣分解模型) 更進一步, 考慮到了這些隱性因子與邊際特徵的交互影響。通常來講,FactorizationModel(分解模型) 最有效,但也最難訓練(因爲它的威力和靈活性)。LinearRegressionModel(線性迴歸模型) 最簡單,訓練速度也最快,但沒有考慮用戶物品間的交互做用。
咱們建議你從 MatrixFactorizationModel(矩陣分解模型) 開始,若是這個模型運行時間過長,能夠降級使用 LinearRegressionModel(線性迴歸模型)。或者,若是你認爲須要使用二階交互項來增強模型,能夠升級使用 FactorizationModel(分解模型)。注意,這些模型都帶有幾個正則化參數如:n_factors 和 regularization,這些參數會影響測試時的預測精度。這對於 FactorizationModel(分解模型) 尤其有用。建議你使用超參數搜索函數 graphlab.toolkits.model_params_search() 來調整這些參數。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 這裏強調了迴歸模型中一些有用的參數選項
>>> custom_mf_model = graphlab.recommender.create(data,
target=’rating’,
n_factors=20,
regularization=0.2,
linear_regularization=0.1)
>>> custom_fm_model = graphlab.recommender.create(data,
target=’rating’,
method=’factorization_model’,
n_factors=50,
regularization=0.5,
max_iterations=100)
>>> custom_linear_model = graphlab.recommender.create(data,
target=’rating’,
method=’linear_model’,
regularization=0.01)
|
若是目標評分是二值的,也就是它們的值是贊或踩標籤,在使用迴歸模型(LinearRegressionModel, MatrixFactorizationModel, FactorizationModel)時,設置輸入參數‘binary_targets = True’。
1
2
3
4
|
>>> logistic_regression_model = graphlab.recommender.create(data,
target=’rating’,
method=’linear_model’,
binary_targets=True)
|
使用MatrixFactorizationModel(矩陣分解模型) 和 FactorizationModel (分解模型)訓練獲得的隱性因子能夠做爲特徵用於其餘的任務。在這種情形下,使用非負因子有利於提升可解釋性。簡單地使用‘nmf=True’做爲輸入參數,分解類型的模型就會學習非負因子。
1
2
3
4
|
>>> nmf_model = graphlab.recommender.create(data,
target=’rating’,
method=’matrix_factorization’,
nmf=True)
|
已有數據?數據問題?
最後,有幾個影響推薦系統性能的常見數據問題。第一,若是觀測數據很是稀疏,也就是僅包含大量用戶的一個或兩個觀測數據,那麼任何一個模型都不會比 popularity 或 item_means 這些基準模型效果好。這種狀況下,將稀疏用戶和物品剔除後重試也許有用。另外,從新檢查數據收集和清理過程,看錯誤是否源於此處。儘量對每一個用戶每一個物品獲取更多的觀測數據。
另外一個常常會遇到的問題是把使用數據當作評分。與顯性評分位於一個很好的線性區間(例如,[0, 5])不一樣,使用數據可能被嚴重扭曲。例如,在 Million Song 數據集中,一個用戶播放一首歌超過 16000 次。全部的模型都很難應對這種嚴重扭曲的目標。解決的方法是對使用數據進行歸類。例如,把播放次數超過 50 次映射成最高評分 5 。你也能夠把播放次數轉成二進制,例如播放超高兩次的爲 1,反之爲 0。
好吧,都記住了嗎?是的,咱們一半都記不住。下面這幅粗略的信息圖一目瞭然地顯示了全部的提示。愉快地探索吧,勇敢地推薦系統研究者!