百度網盤算法
提取碼:qhhv 網絡
所謂推薦系統,簡言之就是根據用戶的偏好推薦其最有可能感興趣的內容。多線程
以新聞平臺爲例,過去主要以新浪新聞這類中心化內容平臺爲表明;併發
而如今,以今日頭條爲表明的新聞APP 均在首頁根據用戶偏好推送不一樣內容的定製化新聞,推進了整個行業向個性化推薦轉型。app
在淘寶、京東、亞馬遜等電商網站的首頁都設有「猜你喜歡」專區,根據用戶最近瀏覽和購
買的行爲記錄推薦商品。ide
在新興的短視頻領域,以抖音和快手爲表明的APP 以推薦爲流量分發的主要手段。函數
在互聯網金融領域,各大平臺也開始主打針對我的定製化的千人千面投資推薦。性能
毫無疑問,個性化推薦己成爲全部新聞、視頻、音頻、電商、互聯網金融等相關平臺的標配。學習
推薦系統,測試
對用戶來講,在用戶需求並不十分明確的狀況下進行信息的過濾,與搜索系統相比,推薦系統更多的利用用戶的各種歷史
信息猜想其可能喜歡的內容;
對公司而言,解決產品可以最大限度地吸引用戶,留存用戶,增加用戶黏性,提升用戶轉化率,從而達到公司商目標連續增加
的目的;
推薦系統的基本任務是聯繫用戶和物品,解決信息過載的問題。本質上是一種實現將用戶-商品-公司之間利益最大化的手段.
用戶做爲推薦系統的重要參與者,其滿意度是評測推薦系統的最重要指標。可是,用戶滿意度沒有辦法離線計算,只能經過用戶調查或者在線實驗得到。
用戶調查得到用戶滿意度主要是經過調查問卷的形式。用戶對推薦系統的滿意度分爲不一樣的層次。
在在線系統中,用戶滿意度主要經過一些對用戶行爲的統計獲得,好比,利用購買率度量用戶的滿意度;
此外,有些網站會經過設計一些用戶反饋界面收集用戶滿意度。好比,電商、外賣的app收貨後彈出的評價提示;
預測準確度度量一個推薦系統或者推薦算法預測用戶行爲的能力。這個指標是最重要的推薦系統離線評測指標,從推薦系統誕生的那一天起,幾乎99%與推薦相關的論文都在討論這個指標。由於該指標能夠經過離線實驗計算。
下面是不一樣的研究方向的預測準確度指標:
不少網站都有一個讓用戶給物品打分的功能,那麼,若是知道了用戶對物品的歷史評分,就能夠從中習得用戶的興趣模型,並預測該用戶在未來看到一個他沒有評過度的物品時,會給這個物品評多少分。預測用戶對物品評分的行爲稱爲評分預測。
評分預測的預測準確度通常經過均方根偏差(RMSE)和平均絕對偏差(MAE)計算。
對於測試集中的一個用戶u和物品i,令是用戶u對物品i的實際評分,而是推薦算法給出的預測評分,那麼RMSE的定義爲:
MAE採用絕對值計算預測偏差,它的定義爲:
假設咱們用一個列表records存放用戶評分數據,
令records[i]= [u,i,rui,pui],其中rui是用戶u對物品i的實際評分,pui是算法預測出來的用戶u對物品i的評分,
那麼下面的代碼分別實現了RMSE和MAE的計算過程。
def RMSE(records): return math.sqrt(sum([(rui-pui)**2 for u,i,rui,pui in records]) / float(len(records))) 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推薦的預測準確率通常經過準確率(precision)/召回率(recall)度量。
令R( u)是根據用戶在訓練集上的行爲給用戶做出的推薦列表,而T( u)是用戶在測試集上的行爲列表。那麼,
分類正確的正樣本個數佔分類器斷定爲正樣本的樣本個數比例(這裏 R(u)R(u) 至關因而模型斷定的正樣本)
即:精確率 = 分類正確的正樣本個數 / 全部斷定爲正樣本的樣本個數
分類正確的正樣本個數佔真正的正樣本個數的比例(這裏的至關於真正的正樣本集合)
即:召回率 = 分類正確的正樣本個數 / 全部真正的正樣本的樣本個數
爲了全面評測TopN推薦的準確率和召回率,通常會選取不一樣的推薦列表長度N,計算出一組準確率/召回率,而後畫出準確率/召
回率曲線(precision/recall curve)。
補充知識點:
精確率( Precision) (也叫查準率)
TP / TP+ FP
精準率反應的是預測準確的數量,即預測爲正的樣本中有多少是真正的正樣本,
預測準確的次數越多,這個數值就越大。精準率是針對咱們預測結果而言的,
它表示的是預測爲正的樣本中有多少是真正的正樣本。那麼預測爲正就有兩種可能了,
一種就是把正類預測爲正類(TP),另外一種就是把負類預測爲正類(FP),
召回率( Recall)
TP / TP+ FN
召回率反應的是預測準確的機率,它表示的是樣本中的正例有多少被預測正確了,
若是預測百分之百地準確,那這個數值就會很高。
召回率是針對咱們原來的樣本而言的,它表示的是樣本中的正例有多少被預測正確了。
也有兩種可能,一種是把原來的正類預測成正類(TP),另外一種就是把原來的正類預測爲負類(FN)。
AUC(Area Under Curve)
AUC 即ROC曲線下的面積,ROC曲線下與座標軸圍成的面積,顯然這個面積的數值不會大於1。
又因爲ROC曲線通常都處於y=x這條直線的上方,因此AUC的取值範圍在0.5和1之間。
AUC越接近1.0,檢測方法真實性越高;
等於0.5時,則真實性最低,無應用價值。
精確率和召回率的代碼實現:
from sklearn import metrics from sklearn.metrics import precision_recall_curve from sklearn.metrics import average_precision_score from sklearn.metrics import accuracy_score #分類結果 y_pred = [0, 1, 0, 0] y_true = [0, 1, 1, 1] print("precision_score:", metrics.precision_score(y_true, y_pred)) print("recall_score:", metrics.recall_score(y_true, y_pred))
auc代碼實現:
# auc import numpy as np from sklearn import metrics y = np.array([1, 1, 2, 2]) pred = np.array([0.1, 0.4, 0.35, 0.8]) fpr, tpr, thresholds = metrics.roc_curve(y, pred, pos_label=2) metrics.auc(fpr, tpr) # 當類別知足{0, 1}時,可直接使用metrics.roc_auc_score(y,pred) metrics.roc_auc_score(y,pred)
0.75
ROC曲線代碼實現:
## ROC曲線 from sklearn.metrics import roc_curve y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1] y_true = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1] FPR,TPR,thresholds=roc_curve(y_true, y_pred) plt.title('ROC') plt.plot(FPR, TPR,'b') plt.plot([0,1],[0,1],'r--') plt.ylabel('TPR') plt.xlabel('FPR')
小知識點:
指出電影推薦的目的是找到用戶最有可能感興趣的電影,而不是預測用戶看了電影后會給電影什麼樣的評分。所以,TopN推薦更符合實際的應用需求。也許有一部電影用戶看了以後會給很高的分數,但用戶看的可能性很是小。所以,預測用戶是否會看一部電影,應該比預測用戶看了電影后會給它什麼評分更加劇要。
所以,後面的重點也是在TopN推薦。
覆蓋率(coverage)描述一個推薦系統對物品長尾的發掘能力。定義爲推薦系統可以推薦出來的物品佔總物品集合的比例。
假設系統的用戶集合爲U,推薦系統給每一個用戶推薦一個長度爲N的物品列表R(u)。那麼推薦系統的覆蓋率的公式:
即:覆蓋率 = 推薦出來的商品數量 / 總商品數量
爲了更細緻地描述推薦系統發掘長尾的能力,須要統計推薦列表中不一樣物品出現次數的分佈。若是全部的物品都出如今推薦列表中,且出現的次數差很少,那麼推薦系統發掘長尾的能力就很好。
所以,能夠經過研究物品在推薦列表中出現次數的分佈描述推薦系統挖掘長尾的能力。
若是這個分佈比較平,那麼說明推薦系統的覆蓋率較高,而若是這個分佈較陡峭,說明推薦系統的覆蓋率較低。
在信息論和經濟學中有兩個著名的指標能夠用來定義覆蓋率。
第一個是信息熵:
其中 p(i)p(i) 是物品 ii 的流行度除以全部物品流行度之和;
第二個指標是基尼係數(Gini Index):
其中 ijij 是按照物品流行度p從小到大排序的物品列表中第 jj 個物品;
爲了知足用戶普遍的興趣,推薦列表須要可以覆蓋用戶不一樣的興趣領域,即推薦結果須要具備多樣性。
儘管用戶的興趣在較長的時
間跨度中是同樣的,但具體到用戶訪問推薦系統的某一刻,其興趣每每是單一的,那麼若是推薦列表只能覆蓋用戶的一個興趣點,而這個興趣點不是用戶這個時刻的興趣點,推薦列表就不會讓用戶滿意。反之,若是推薦列表比較多樣,覆蓋了用戶絕大多數的興趣點,那麼就會增長用戶找到感興趣物品的機率。所以給用戶的推薦列表也須要知足用戶普遍的興趣,即具備多樣性。
多樣性描述了推薦列表中物品兩兩之間的不類似性。所以,多樣性和類似性是對應的。
假設定義了物品i和 j之間的類似度,那麼用戶u的推薦列表R(u)的多樣性定義以下:
推薦系統的總體多樣性能夠定義爲全部用戶推薦列表多樣性的平均值:
不一樣的物品類似度度量函數s(i,j)能夠定義不一樣的多樣性;
若是用內容類似度描述物品間的類似度,咱們就能夠獲得內容多樣性函數,
若是用協同過濾的類似度函數描述物品間的類似度,就能夠獲得協同過濾的多樣性函數。
新穎的推薦是指給用戶推薦那些他們之前沒有據說過的物品。在一個網站中實現新穎性的最簡單辦法是,把那些用戶以前在網站中對其有過行爲的物品從推薦列表中過濾掉。
好比在一個視頻網站中,新穎的推薦不該該給用戶推薦那些他們已經看過、打過度或者瀏覽過的視頻。
可是,有些視頻多是用戶在別的網站看過,或在電視上看過,所以僅僅過濾掉本網站中用戶有過行爲的物品還不能徹底實現新穎性。
有研究代表,評測新穎度的最簡單方法是利用推薦結果的平均流行度,由於越不熱門的物品越可能讓用戶以爲新穎。所以,若是推薦結果中物品的平均熱門程度較低,那麼推薦結果就可能有比較高的新穎性。
可是,用推薦結果的平均流行度度量新穎性比較粗略,由於不一樣用戶不知道的東西是不一樣的。要準確地統計新穎性須要作用戶調查。
簡單來講,驚喜度(serendipity)就是,若是推薦結果和用戶的歷史興趣不類似,但卻讓用戶以爲滿意,那麼就能夠說推薦結果的驚喜度很高,而推薦的新穎性僅僅取決於用戶是否據說過這個推薦結果。
即:令用戶驚喜的推薦結果是和用戶歷史上喜歡的物品不類似,但用戶卻以爲滿意的推薦
所以,提升推薦驚喜度,須要提升推薦結果的用戶滿意度,同時下降推薦結果和用戶歷史興趣的類似度。
度量推薦系統的信任度只能經過問卷調查的方式,詢問用戶是否信任推薦系統的推薦結果。
提升推薦系統的信任度主要有兩種方法。
首先須要增長推薦系統的透明度(transparency ),而增長推薦系統透明度的主要辦法是提供推薦解釋。只有讓用戶瞭解推薦系統的運行機制,讓用戶認同推薦系統的運行機制,纔會提升用戶對推薦系統的信任度。
其次是考慮用戶的社交網絡信息,利用用戶的好友信息給用戶作推薦,而且用好友進行推薦解釋。這是由於用戶對他們的好友通常都比較信任,所以若是推薦的商品是好友購買過的,那麼他們對推薦結果就會相對比較信任。
在不少網站中,由於物品(新聞、微博等)具備很強的時效性,因此須要在物品還具備時效性時就將它們推薦給用戶。
好比,給用戶推薦昨天的新聞顯然不如給用戶推薦今天的新聞。
推薦系統的實時性包括兩個方面。
首先,推薦系統須要實時地更新推薦列表來知足用戶新的行爲變化。
好比,當一個用戶購買了iPhone,若是推薦系統可以當即給他推薦相關配件,那麼確定比次日再給用戶推薦相關配件更有價值。
第二個方面是推薦系統須要可以將新加入系統的物品推薦給用戶。這主要考驗了推薦系統處理物品冷啓動的能力。關於如何將新加入系統的物品推薦給用戶。
健壯性(即robust,魯棒性)指標衡量了一個推薦系統抗擊做弊的能力。
最著名的就是行爲注入***(profile injection attack)。衆所周知,絕大部分推薦系統都是經過分析用戶的行爲實現推薦算法的。
好比,亞馬遜有一種推薦叫作「購買商品A的用戶也常常購買的其餘商品」。主要計算方法是統計購買商品A的用戶購買其餘商品的次數。
那麼,咱們能夠很簡單地***這個算法,讓本身的商品在這個推薦列表中得到比較高的排名,好比能夠註冊不少帳號,用這些帳號同時購買A和本身的商品。
還有一種***主要針對評分系統,好比豆瓣的電影評分。這種***很簡單,就是僱用一批人給本身的商品很是高的評分,而評分行爲是推薦系統依賴的重要用戶行爲。
算法健壯性的評測主要利用模擬***。
在實際系統中,提升系統的健壯性,除了選擇健壯性高的算法,還有如下方法:
網站評測推薦系統更加註重網站的商業目標是否達成,不一樣的網站具備不一樣的商業目標。
好比電子商務網站的目標多是銷售額,基於展現廣告盈利的網站其商業目標多是廣告展現總數,基於點擊廣告盈利的網站其商業目標多是廣告點擊總數。
所以,設計推薦系統時須要考慮最終的商業目標,而網站使用推薦系統的目的除了知足用戶發現內容的需求,也須要利用推薦系統加快實現商業上的指標。
一個推薦算法,雖然總體性能很差,但可能在某種狀況下性能比較好,而增長評測維度的目的就是知道一個算法在什麼狀況下性能最好。
通常來講,評測維度分爲以下3種:
推薦系統要根據已有的用戶畫像和內容畫像去推薦,涉及到兩個關鍵問題:召回和排序。
召回(match)」指從全量信息集合中觸發儘量多的正確結果,並將結果返回給「排序」。
召回的方式有多種:協同過濾、主題模型、內容召回和熱點召回等,
而「排序(rank)「則是對全部召回的內容進行打分排序,選出得分最高的幾個結果推薦給用戶。
召回策略的評估:
主要根據兩個評價指標:召回率和準確率。
下面是召回層與排序層的特色
設計召回層時,「計算速度」和「召回率」實際上是矛盾的兩個指標,爲提升「計算速度」,須要使召回策略儘可能簡單一些;而爲了提升「召回率」,要求召回策略儘可能選出排序模型所須要的候選集,這也就要求召回策略不能過於簡單。在權衡計算速度和召回率後,目前工業界主流的召回方法是採用多個簡單策略疊加的「多路召回策略」。
指採用不一樣的策略、特徵或簡單模型,分別召回一部分候選集,而後把候選集混合在一塊兒供後續排序模型使用,
其中,各類簡單策略保證候選集的快速召回,從不一樣角度設計的策略保證召回率接近理想的狀態,不至於損傷排序效果。
在多路召回中,每一個策略之間絕不相關,因此通常能夠寫併發多線程同時進行,這樣能夠更加高效。
針對不一樣的任務就會有對於該業務真實場景下須要考慮的召回規則。例如視頻推薦,召回規則能夠是「熱門視頻」、「導演召回」、「演員召回」、「最近上映「、」流行趨勢「、」類型召回「等等。
對於每一路召回都會從商品集合中拉回K個商品,這裏的K是一個超參數,對於K的選擇通常須要經過離線評估加線上的A/B測試來肯定合理的K值。
除此以外,對於不一樣的任務具體策略的選擇也是人工基於經驗的選擇,選擇的策略之間的信息是割裂的,沒法總和考慮不一樣策略對一個物品的影響。
Embedding召回是一個綜合性強且計算速度也能知足需求的召回方法。
Embedding實際上是一種思想,主要目的是將稀疏的向量(如one-hot編碼)表示轉換成稠密的向量,
下圖直觀的顯示了one-hot編碼和Embedding表示的區別於聯繫,
即Embedding至關因而對one-hot作了平滑,而onehot至關因而對Embedding作了max pooling。
目前主流的Embedding技術主要能夠分爲三大類。
在推薦系統領域,text embedding技術是目前使用最多的embedding技術,
對於文本特徵能夠直接使用該技術,
對於非文本的id類特徵,能夠先將其轉化成id序列再使用text embedding的技術獲取id的embedding再作召回。
常見的text Embedding的技術有:
對於image embedding其實主要是對於有圖或者視頻的特徵,對於圖像與視頻的識別都有效果比較好的模型,大部分都是卷積模塊經過各類鏈接技巧搭建的高效模型,可使用現有的預訓練模型提取圖像或者視頻的向量特徵,而後用於召回。
對於社交網絡相關的推薦,進行推薦的用戶與用於之間或者商品之間自然的存在某種複雜的圖結構的關係,如何利用圖中節點與節點之間的關係對其進行向量化是很是關鍵的,在這種場景下基於序列的text embedding和基於卷積模型的image embedding都顯得力不從心,在這樣的背景下Graph Embedding逐漸在推薦系統中流行起來。
經典的Graph Embedding模型有, Deep Walk, Node2Vec,LINE以及比較新的阿里巴巴2018年公佈的EGES graph Embedding模型。
矩陣分解算法後續有哪些改進呢?針對這些改進,是爲了解決什麼的問題呢?請你們自行探索
RSVD,消除用戶和物品打分誤差等。
矩陣分解的優缺點分析
優勢:
泛化能力強: 必定程度上解決了稀疏問題
空間複雜度低: 因爲用戶和物品都用隱向量的形式存放, 少了用戶和物品類似度矩陣, 空間複雜度由 n2 降到了 (n+m)∗f
更好的擴展性和靈活性:矩陣分解的最終產物是用戶和物品隱向量, 這個深度學習的embedding思想不謀而合, 所以矩陣分解的結果很是便於與其餘特徵進行組合和拼接, 並能夠與深度學習無縫結合。
可是, 矩陣分解算法依然是隻用到了評分矩陣, 沒有考慮到用戶特徵, 物品特徵和上下文特徵, 這使得矩陣分解喪失了利用不少有效信息的機會, 同時在缺少用戶歷史行爲的時候, 沒法進行有效的推薦。 因此爲了解決這個問題, 邏輯迴歸模型及後續的因子分解機模型, 憑藉其自然的融合不一樣特徵的能力, 逐漸在推薦系統領域獲得了更普遍的應用。
FM模型實際上是一種思路,具體的應用稍少。通常來講作推薦CTR預估時最簡單的思路就是將特徵作線性組合(邏輯迴歸LR),傳入sigmoid中獲得一個機率值,本質上這就是一個線性模型,由於sigmoid是單調增函數不會改變裏面的線性模型的CTR預測順序,所以邏輯迴歸模型效果會比較差。也就是LR的缺點有:
因爲LR模型的上述缺陷(主要是手動作特徵交叉比較麻煩),乾脆就考慮全部的二階交叉項,$也就是將目標函數由原來的