1.1 推薦系統評測
1.1.1 推薦系統實驗方法
1. 離線實驗
離線實驗的方法一般由如下幾個步驟構成:
(1) 通過日誌系統獲得使用者行為資料,並按照一定格式生成乙個標準的資料集;
(2) 將資料集按照一定的規則分成訓練集和測試集;
(3) 在訓練集上訓練使用者興趣模型,在測試集上進行**;
(4) 通過事先定義的離線指標評測演算法在測試集上的**結果。
推薦系統的離線實驗都是在資料集上完成的,只要有乙個從實際系統日誌中提取的資料集即可。
優點:不需有對實際系統的控制權,不需要使用者參與實驗,速度快,可以測試大量演算法。
缺點:無法計算商業上關心的指標,離線實驗的指標和商業指標存在差異。
2.使用者調查
使用者調查需要有一些真實使用者,使用者在需要測試的推薦系統上進行一些實驗和問題回答,然後我們來觀察和記錄他們的行為,通過分析他們的行為和答案了解這個系統的相關效能。
優點:可以獲得很多體現使用者主觀感受的指標,出現錯誤後容易彌補。
缺點:招募測試使用者代價大,很難組織大規模的測試使用者,統計意義不足,收集到的測試指標可能和現實有出入。
1.1.2 評測指標
1. 使用者滿意度
2. **準確度
**準確度度量乙個推薦系統或者推薦演算法**使用者行為的能力。(離線實驗)
在訓練集上建立使用者的行為和興趣模型**使用者在測試集上的行為,並計算**行為和測試集上實際行為的重合度作為**準確度。
l 評分**
評分**的**準確度一般通過均方根誤差(rmse)和平均絕對誤差(mae)計算。對於 測試集中的乙個使用者u和物品i,令rui是使用者u對物品i的實際評分,而rui是推薦演算法給出的**評分,那麼rmse的定義為:mae採用絕對值計算**誤差,它的定義為:
我們用乙個列表records存放使用者評分資料,令records[i]=[u,i,rui,pui],其中rui是使用者對物品的實際評分,pui是演算法**出來的使用者對物品的評分,那麼下面的**分別實現了rmse和mae的計算過程。
def
rmse
(records)
:return math.sqrt(
sum(
[(rui-pui)
*(rui-pui)
for u,i,rui,pui in records])/
float
(len
(records)))
defmae
(records)
:return
sum(
[abs
(rui-pui)
for u,i,rui,pui in records])/
float
(len
(records)
)
l topn 推薦
推薦的**準確率一般通過準確率(precision)/召回率(recall)度量。
令r(u)是根據使用者在訓練集上的行為給使用者作出的推薦列表,而t(u)是使用者在測試集上的行為列表。那麼,推薦結果的召回率定義為:推薦結果的準確率定義為:
用python**同時計算出了乙個推薦演算法的準確率和召回率:
def
precisionrecall
(test, n)
: hit =
0 n_recall =
0 n_precision =
0for user, items in test.items(
):
rank = recommend(user, n)
hit +=
len(rank & items)
n_recall +=
len(items)
n_precision += n
return
[hit /
(1.0
* n_recall)
, hit /
(1.0
* n_precision)
]
l 關於評分**和topn推薦的討論
3. 覆蓋率
定義:為推薦系統能夠推薦出來的物品佔總物品集合的比例。
覆蓋率為100%的推薦系統可以將每個物品都推薦給至少乙個使用者。
推薦系統的覆蓋率公式為:
下面的python**是用來計算推薦演算法的覆蓋率的:
def
coverage
(train, test, n)
: recommend_items =
set(
) all_items =
set(
)for user in train.keys():
for item in train[user]
.keys():
all_items.add(item)
rank = getrecommendation(user, n)
for item, pui in rank:
recommend_items.add(item)
return
len(recommend_items)/(
len(all_items)
*1.0
)
在資訊理論和經濟學中有兩個著名的指標可以用來定義覆蓋率。第乙個是資訊熵:
z這裡是物品的流行度除以所有物品流行度之和。
第二個指標是基尼係數(gini index):
這裡,ij是按照物品流行度p()從小到大排序的物品列表中第j個物品。下面的**可以用來計算給定物品流行度分布後的基尼係數:
def
giniindex
(p):
j =1 n =
len(p)
g =0for item, weight in
sorted
(p.items(
), key=itemgetter(1)
):
g +=(2
* j - n -1)
* weight
return g /
float
(n -
1)
4. 多樣性
5. 新穎性
def
popularity
(train, test, n)
: item_popularity =
dict()
for user, items in train.items():
for item in items.keys(
)if item not
in item_popularity:
item_popularity[item]=0
item_popularity[item]+=1
ret =
0 n =
0for user in train.keys():
rank = getrecommendation(user, n)
for item, pui in rank:
ret += math.log(
1+item_popularity[item]
) n +=
1 ret /= n *
1.0return ret
這裡,在計算平均流行度時對每個物品的流行度取對數,這是因為物品的流行度分布滿足長尾分布(長尾分布就是指尾巴很長的分布),在取對數後,流行度的平均值更加穩定。
6. 驚喜度
如果推薦結果和使用者的歷史興趣不相似,但卻讓使用者覺得滿意,那麼就可以說推薦結果的驚喜度很高,而推薦的新穎性僅僅取決於使用者是否聽說過這個推薦結果。
7. 信任度
同樣的推薦結果,以讓使用者信任的方式推薦給使用者就更能讓使用者產生購買慾,而以類似廣告形式的方法推薦給使用者就可能很難讓使用者產生購買的意願。
8. 實時性
比如,給使用者推薦昨天的新聞顯然不如給使用者推薦今天的新聞。
包括實施更新推薦列表來滿足使用者新的行為變化和即使推薦新加入系統的物品。
9. 健壯性
衡量乙個推薦系統抗擊作弊的能力。
10. 商業目標
1.1.3 評測維度
評測維度的目的就是知道乙個演算法在什麼情況下效能最好。
一般來說,評測維度分為3種。
使用者維度:從人物的角度看,主要包括使用者的人口統計學資訊、活躍度以及是不是新使用者等。 物品維度:從物品的角度看,包括物品的屬性資訊、流行度、平均分以及是不是新加入的物品等。
時間維度:從時間角度看,包括季節,是工作日還是週末,是白天還是晚上等。
推薦系統實踐
實驗方法 測評指標 測評維度 使用者活躍度和物品流行度 長尾分布 一般來說,不活躍的使用者要麼是新使用者,要麼是只來過 一兩次的老使用者。那麼,不同活躍度的使用者喜歡的物品的流行度是否有差別?一般認為,新使用者傾向於瀏覽熱門的物品,因為他們對 還不熟悉,只能點選首頁的熱門物品,而老使用者會逐漸開始瀏...
推薦系統實踐 好的推薦系統
一 好的推薦系統 1.什麼是推薦系統 從某種意義上說,推薦系統和搜尋引擎對於用語來說是兩個互補的工具。搜尋引擎滿足了使用者有明確目的時的主動查詢需求,而推薦系統能夠在使用者沒有明確目的的時候幫助他們發現感興趣的內容。分為社會化推薦,基於內容的推薦和基於協同過濾的推薦。目前廣告投放的技術主要分三種 上...
推薦系統11 《推薦系統實踐》總結
在之前我也看了很多人寫的推薦系統的部落格,理論的 演算法的都有,多是個人的理解和感悟,雖然很深刻,但是對於自己而言還是不成系統,於是我參考大牛項亮編著的 推薦系統實踐 將該領域知識系統整理一遍,與大家一起學習。本系列對應的 請檢視 前面總結推薦系統常用的資料 演算法 架構等,具體內容清檢視本系列推薦...