1. 程式人生 > >《推薦系統實踐》筆記 03 評測指標

《推薦系統實踐》筆記 03 評測指標

# 評測指標 評測指標可以評測推薦系統各個方面的效能,有些是可以定量計算的,而有些只能定性描述。有些可以通過離線實驗計算,有些需要通過使用者調查獲得,還有些只能在線評測。接下來我們將對各個評測指標進行介紹。 ## 使用者滿意度 使用者滿意度無法進行離線計算,只能通過使用者調查以及線上實驗獲得。如果是線上實驗當中,可以通過使用者購買推薦商品的購買率對使用者滿意度進行度量。或者使用“滿意”、“不滿意”的按鈕進行反饋。一般情況下,我們可以通過**點選率、使用者停留時間和轉化率**等指標度量使用者的滿意度。 ## 預測準確度 預測準確度度量一個推薦系統或者推薦演算法預測使用者行為的能力。這個指標是最重要的推薦系統離線評測指標。預測準確度通過在訓練集上建立使用者的行為和興趣模型預測使用者在測試集上的行為,並計算預測行為和測試集上實際行為的重合度作為預測準確度。預測準確度有各種不同的研究方向,也就有不同的預測準確度指標。 ### 評分預測 預測該使用者在將來看到一個他沒有評過分的物品時,會給這個物品評多少分。 評分預測的預測準確度一般通過均方根誤差(RMSE)和平均絕對誤差(MAE)計算。測試集中物品$u$和使用者$i$,以及使用者$i$對物品$u$的評分為$r_{ui}$,預測的評分為$\hat{r}_{ui}$。那麼均方根誤差RMSE計算為 $$ RMSE=\frac{\sqrt{\sum_{u,i\in T}(r_{ui}-\hat{r}_{ui})^2}}{|T|} $$ 平均絕對誤差(MAE)公式為 $$ MAE=\frac{\sum_{u,i\in T}|r_{ui}-\hat{r}_{ui}|}{|T|} $$ 我們用records來記錄使用者、物品、真實評分和預測評分,用比較簡單的程式碼來表示RMSE為 ```python def RMSE(records): return math.sqrt(\sum([(rui-pui)*(rui-pui) for u,i,rui,pui in records]) / float(len(records))) ``` 用程式碼表示MAE為 ```python def MAE(records): return sum([abs(rui-pui) for u,i,rui,pui in records])/ float(len(records)) ``` 值得一提的是,關於RMSE和MAE這兩個指標的優缺點, Netflix認為RMSE加大了對預測不準的使用者物品評分的懲罰(平方項的懲罰),因而對系統的評測更加苛刻。研究表明,如果評分系統是基於整數建立的(即使用者給的評分都是整數),那麼對預測結果取整會降低MAE的誤差。 ### TopN推薦 網站在提供推薦服務時,一般是給使用者一個個性化的推薦列表,這種推薦叫做TopN推薦。TopN推薦的預測準確率一般通過準確率(precision)或者召回率(recall)度量。 令R(u)是根據使用者在訓練集上的行為給使用者作出的推薦列表,而T(u)是使用者在測試集上的行為列表。 召回率和精準率的程式碼為: ```python def PrecisionRecall(test, N): hit = 0 n_recall = 0 n_precision = 0 for 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)] ``` ## 覆蓋率 覆蓋率(coverage)描述一個推薦系統對物品長尾的發掘能力。覆蓋率有不同的定義方法,最簡單的定義為推薦系統能夠推薦出來的物品佔總物品集合的比例。覆蓋率是一個內容提供商會關心的指標。一個好的推薦系統不僅需要有比較高的使用者滿意度,也要有較高的覆蓋率。需要統計推薦列表中不同物品出現次數的分佈。如果所有的物品都出現在推薦列表中,且出現的次數差不多,那麼推薦系統發掘長尾的能力就很好。 在資訊理論和經濟學中有兩個著名的指標可以用來定義覆蓋率。 這裡$p(i)$是物品$i$的流行度除以所有物品流行度之和。可以簡單認為是物品$i$出現的概率或者頻率。 > 物品的流行度指對物品產生過行為的使用者總數。這裡作者竟然放到了後面一章進行解釋。 第一個是資訊熵: $$ H=-\sum_{i=1}^{n}p(i)\log p(i) $$ 第二個就是基尼指數: $$ G=\frac{1}{n-1}\sum_{j=1}^{n}(2j-n-1)p(i_j) $$ 用程式碼來寫就是 ```python def GiniIndex(p): j=1 n = len(p) G = 0 for item, weight in sorted(p.items(), key=itemgetter(1)): G += (2 * j - n - 1) * weight return G / float(n - 1) ``` 基尼係數用來刻畫系統對物品的流行度是否平均,如果物品的流行度很平均,那麼基尼係數就會越小,如果物品流行度相差很大,那麼基尼係數就會很大。基尼係數也是用來刻畫馬太效應的指標,即所謂強者更強,弱者更弱的效應。熱門的物品會更加熱門,冷門的物品也會就會更加冷門。 如果推薦演算法的計算出來的物品流行度的基尼係數要大於原本使用者行為中物品流行度的基尼係數,那麼也就是說推薦演算法具有馬太效應。 ## 多樣性 為了滿足使用者廣泛的興趣,推薦列表需要能夠覆蓋使用者不同的興 趣領域,即推薦結果需要具有多樣性。如果我們使用$s(i,j)$來代表物品$i$和物品$j$的相似度。那麼使用者$u$的推薦列表多樣性定義為 $$ Diversity=1-\frac{\sum_{i,j\in R(u), i \ne j}{s(i,j)}}{\frac{1}{2}|R(u)||R(u)-1|} $$ 這裡稍微說一下我對這個公式的理解,分數線上方是兩兩物品的相似性的總和,分數線下方是從所有物品中任意取兩個的組合數,再用1減去這個相似性的公式就得到了多樣性的公式。 再對所有使用者的推薦列表多樣性取平均就是推薦系統的多樣性。不同的物品相似度度量函式$s(i,j)$可以定義不同的多樣性。 ## 新穎性 新穎的推薦不應該給使用者推薦那些他們已經看過、打過分或者瀏覽過的視訊。評測新穎度的最簡單方法是利用推薦結果的平均流行度,因為越不熱門的物品越可能讓使用者覺得新穎。因此,如果推薦結果中物品的平均熱門程度較低,那麼推薦結果就可能有比較高的新穎性。 用推薦結果的**平均流行度**度量新穎性比較粗略,因為不同使用者不知道的東西是不同的。因此,要準確地統計新穎性需要做使用者調查。 ## 驚喜度 驚喜度是什麼,又和新穎度有什麼區別呢。新穎度通常存在使用者已知的某些物品和結果,與歷史興趣相關聯,如果推薦結果和使用者的歷史興趣不相似,但卻讓使用者覺得滿意,那麼就可以說推薦結果的驚喜度很高,而推薦的新穎性僅僅取決於使用者是否聽說過這個推薦結果。是一種定性的度量。提高推薦驚喜度需要提高推薦結果的使用者滿意度,同時降低推薦結果和使用者歷史興趣的相似度。目前驚喜度獲得了學術界的部分討論,但是仍然不夠成熟,這裡也就不展開細說。 ## 信任度 如果使用者信任推薦系統,那就會增加使用者和推薦系統的互動。在實際的業務場景當中,同樣的推薦結果,以讓使用者信任的方式推薦給使用者就更能讓使用者產生購買慾, 而以類似廣告形式的方法推薦給使用者就可能很難讓使用者產生購買的意願。想要提高使用者對系統的信任度,首先要提高系統的透明度,也就是提供一些推薦解釋、利用好友的一些行為資訊再解釋等等。 ## 實時性 有些物品,如微博、新聞等具有很強的時效性,需要在物品還具有時效 性時就將它們推薦給使用者。實時性的表現有兩個方面: 1. 推薦系統需要實時地更新推薦列表來滿足使用者新的行為變化。如在購買新的硬體之後能夠立即推薦相應的配件資訊。 2. 能夠將新加入系統的物品推薦給使用者。體現了推薦系統處理物品的冷啟動能力。 ## 健壯性 健壯性指標衡量了一個推薦系統抗擊作弊的能力。演算法健壯性的評測主要利用模擬攻擊。首先,給定一個數據集和一個演算法,可以用這個演算法給這個資料集中的使用者生成推薦列表。然後,用常用的攻擊方法向資料集中注入噪聲資料,然後利用演算法在注入噪聲後的資料集上再次給使用者生成推薦列表。最後,通過比較攻擊前後推薦列表的相似度評測演算法的健壯性。如果攻擊後的推薦列表相對於攻擊前沒有發生大的變化,就說明演算法比較健壯。 除了選擇健壯性高的推薦演算法外,還有 - 設計推薦系統時儘量使用代價比較高的使用者行為 - 在使用資料前,進行攻擊檢測,從而對資料進行清理 ### 總結 | | 離線實驗 | 調查問卷 | 線上實驗 | | ---- | ---- | ---- | ---- | | 使用者滿意度 | x | √ | o | | 預測準確度 | √ | √ | x | | 覆蓋率 | √ | √ | √ | | 多樣性 | o | √ | o | | 新穎性 | o | √ | o | | 驚喜度 | x | √ | x | # 測評維度 - 使用者維度 主要包括使用者的人口統計學資訊、活躍度以及是不是新使用者等。 - 物品維度 包括物品的屬性資訊、流行度、平均分以及是不是新加入的物品等。 - 時間維度 包括季節,是工作日還是週末,是白天還是晚