常用推薦算法分類
實時和離線; 是否個性化推薦;基於統計的推薦;
個性化推薦的原則:如可以基於相似度去划分、基於已有的知識去推薦、基於模型的推薦(去學習這個推薦的模型);
按數據源划分:用戶、物品、用戶行為數據即它們倆之間的關系;
- 基於人口統計學的推薦(基於用戶)與用戶畫像
- 基於內容的推薦(基於物品)與特征工程
- 基於協同過濾的推薦(用戶行為數據)
1. 基於人口統計學的推薦
根據用戶特質找到他的鄰居;用戶基本的信息;
- 基於人口統計學的推薦機制(Demographic-based Recommendation)是一種最易於實現的推薦方法,它只是簡單的根據系統用戶的基本信息發現用戶的相關程度,然后將相似用戶喜愛的其他物品推薦給當前用戶
- 對於沒有明確含義的用戶信息(比如登錄時間、地域等上下文信息),可以通過聚類等手段,給用戶打上分類標簽
- 對於特定標簽的用戶,又可以根據預設的規則(知識)或者模型,推薦出對應的物品
- 用戶信息標簽化的過程一般又稱為用戶畫像(User Profiling)
用戶畫像
- 用戶畫像(User Profile)就是企業通過收集與分析消費者社會屬性、生活習慣、消費行為等主要信息的數據之后,完美地抽象出一個用戶的商業全貌作是企業應用大數據技術的基本方式; 用戶信息不好收集,所以有時候可能不准確;可收集他的行為數據;
- 用戶畫像為企業提供了足夠的信息基礎,能夠幫助企業快速找到精准用戶群體以及用戶需求等更為廣泛的反饋信息
- 作為大數據的根基,它完美地抽象出一個用戶的信息全貌,為進一步精准、快速地分析用戶行為習慣、消費習慣等重要信息,提供了足夠的數據基礎
2. 基於內容的推薦
直接匹配、訓練模型--特征值
- Content-based Recommendations (CB) 根據推薦物品或內容的元數據,發現物品的相關性,再基於用戶過去的喜好記錄,為用戶推薦相似的物品。
- 通過抽取物品內在或者外在的特征值,實現相似度計算。 ===>> 比如一個電影,有導演、演員、用戶標簽UGC、用戶評論、時長、風格等等,都可以算是特征。
- 將用戶(user)個人信息的特征(基於喜好記錄或是預設興趣標簽),和物品(item)的特征相匹配,就能得到用戶對物品感興趣的程度;
在一些電影、音樂、圖書的社交網站有很成功的應用,有些網站還請專業的人員對物品進行基因編碼/打標簽(PGC)
相似度計算 -- 推薦系統中用的距離 --
相似度的評判,可以用距離表示,而一般更常用的是“余弦相似度”
歐式距離:差向量的模長;
余弦相似度
對於物品的特征提取 —— 打標簽(tag)
- 專家標簽(PGC)
- 用戶自定義標簽(UGC)
- 降維分析數據,提取隱語義標簽(LFM)
對於文本信息的特征提取 —— 關鍵詞
- 分詞、語義處理和情感分析(NLP)
- 潛在語義分析(LSA)
基於內容推薦系統的高層次結構
特征工程 -- 模型之前所要做的 -- 最后得到的特征輸出給模型(機器學習算法)
一開始拿到的數據 ===> 目標--想要得到的;
特征:作為判斷條件的一組輸入變量,是做出判斷的依據
目標:判斷和預測的目標,模型的輸出變量,是特征所產生的結果
- 特征 (feature):數據中抽取出來的對結果預測有用的信息。
- 特征的個數就是數據的觀測維度
- 特征工程是使用專業背景知識和技巧處理數據,使得特征能在機器學習算法上發揮更好的作用的過程
- 特征工程一般包括特征清洗(采樣、清洗異常樣本),特征處理(標准化、歸一化等)和特征選擇(先提前考量下把不必要的砍掉,兩個方面的考量:①數據是否發散---方差、相關系數)
- 特征按照不同的數據類型分類,有不同的特征處理方法
數值型--連續的
類別型 -- 離散的
時間型 -- 如用戶登陸時間等
統計型
數值型特征處理:
用連續數值表示當前維度特征,通常會對數值型特征進行數學上的處理,主要的做法是 歸一化 和 離散化
① 幅度調整/ 歸一化 -- 讓取值不會受到幅度的影響
特征與特征之間應該是平等的,區別應該體現在特征內部;
例如房屋價格和住房面積的幅度是不同的,房屋價格可能在3000000 ~ 15000000(萬)之間,而住房面積在40~300(平方米)之間,那么明明是平等的兩個特征,輸入到相同的模型中后由於本身的幅值不同導致產生的效果不同,這是不合理的
歸一化
② 離散化 : 連續值 ----> 變成分類問題
將原始連續值切斷,轉化為離散值:
- 讓座問題:假設我們要訓練一個模型判斷在公交車上應不應該給一個人讓座,按照常理,應該是給年齡很大和年齡很小的人讓座
- 對於以上讓座問題中的年齡特征,對於一些模型,假設模型為 y = θx,輸入的 x(年齡)對於最后的貢獻是正/負相關的,即 x 越大越應該讓座,但很明顯讓座問題中,年齡和是否讓座不是嚴格的正相關或者負相關,這樣只能兼顧年齡大的人,無法兼顧年齡大的人和年齡小的人
對於讓座問題,我們可以使用閾值將年齡進行分段,將一個 age 特征分為多個特征,將連續值離散化:
在電商中,每個人對於價格的喜好程度不同,但它不一定是嚴格的正相關或負相關,某些人可能就喜歡某一價格段內的商品。
離散化的兩種方式:
- 等步長 —— 簡單但不一定有效
- 等頻(更精准,但易變動) —— min ---> 25% --> 75% ---> max
兩種方法對比
- 等頻的離散化方法很精准,但需要每次都對數據分布進行一遍從新計算,因為昨天用戶在淘寶上買東西的價格分布和今天不一定相同,因此昨天做等頻的切分點可能並不適用,而線上最需要避免的就是不固定,需要現場計算,所以昨天訓練出的模型今天不一定能使用
- 等頻不固定,但很精准,等步長是固定的,非常簡單,因此兩者在工業上都有應用
類別型特征處理 -- 特征展開處理
類別型數據本身沒有大小關系,需要將它們編碼為數字,但它們之間不能有預先設定的大小關系,因此既要做到公平,又要區分開它們,那么直接開辟多個空間
One-Hot 編碼/啞變量
One-Hot 編碼/啞變量所做的就是將類別型數據 平行地展開,也就是說,經過 One-Hot 編碼/啞變量后,這個特征的空間會膨脹
特征空間就會膨脹;
時間型特征處理
時間型特征既可以做連續值,又可以看做離散值。
- 連續值
持續時間(網頁瀏覽時長)
間隔時間(上一次購買/點擊離現在的時間間隔)
- 離散值
一天中哪個時間段
一周中的星期幾
一年中哪個月/星期
工作日/周末
統計型特征處理
- 加減平均:商品價格高於平均價格多少,用戶在某個品類下消費超過多少。
- 分位線:商品屬於售出商品價格的分位線處。
- 次序性:商品處於熱門商品第幾位。
- 比例類:電商中商品的好/中/差評比例。
推薦系統常見反饋數據 -- 收集模型的反饋數據做優化
2. 基於 UGC 的推薦 -- 行為數據,物品的內容信息即基於內容推薦
- 用戶用標簽來描述對物品的看法,所以用戶生成標簽(UGC)是聯系用戶和物品的紐帶,也是反應用戶興趣的重要數據源
- 一個用戶標簽行為的數據集一般由一個三元組(用戶,物品,標簽)的集合表示,其中一條記錄(u,i,b)表示用戶 u 給物品 i 打上了標簽 b
- 一個最簡單的算法:
- 統計每個用戶最常用的標簽
- 對於每個標簽,統計被打過這個標簽次數最多的物品
- 對於一個用戶,首先找到他常用的標簽,然后找到具有這些標簽的最熱門的物品,推薦給他
- 所以用戶 u 對物品 i 的興趣公式為:
其中,nu,b 是用戶 u 打過標簽 b 的次數,nb,i 是物品 i 被打過標簽 b 的次數 --物品跟標簽的關聯度;
基於 UGC 簡單推薦的問題
- 簡單算法中直接將用戶打出標簽的次數和物品得到的標簽次數相乘,可以簡單地表現出用戶對物品某個特征的興趣
- 這種方法傾向於給熱門標簽(誰都會給的標簽,如“大片”、“搞笑”等)、熱門物品(打標簽人數最多)比較大的權重,如果一個熱門物品同時對應着熱門標簽,那它就會“霸榜”,推薦的個性化、新穎度就會降低
- 類似的問題,出現在新聞內容的關鍵字提取中。比如以下新聞中,哪個關鍵字應該獲得更高的權重?
TF-IDF算法
- 詞頻-逆文檔頻率(Term Frequency–Inverse Document Frequency, TF-IDF)是一種用於資訊檢索與文本挖掘的常用加權技術
- TF-IDF 是一種統計方法,用以評估一個字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨着它在文件中出現的次數成正比增加,但同時會隨着它在語料庫中出現的頻率成反比下降 :
𝑇𝐹𝐼𝐷𝐹=𝑇𝐹×𝐼𝐷𝐹 詞頻 * 逆文檔頻率
- TF-IDF 的主要思想是:如果某個詞或短語在一篇文章中出現的頻率 TF 高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類
- TF-IDF 加權的各種形式常被搜索引擎應用,作為文件與用戶查詢之間相關程度的度量或評級
詞頻(Term Frequency,TF)
指的是某一個給定的詞語在該文件中出現的頻率。這個數字是對詞數的歸一化,以防止偏向更長的文件。(同一個詞語在長文件里可能會比短文件有更高的詞數,而不管該詞語重要與否。)
其中 TFi,j 表示詞語 i 在文檔 j 中出現的頻率,ni,j 表示 i 在 j 中出現的次數,n*,j 表示文檔 j 的總詞數
逆向文件頻率(Inverse Document Frequency,IDF)
是一個詞語普遍重要性的度量,某一特定詞語的 IDF,可以由總文檔數目除以包含該詞語之文檔的數目,再將得到的商取對數得到:
其中 IDFi 表示詞語 i 在文檔集中的逆文檔頻率,N 表示文檔集中的文檔總數,Ni 表示文檔集中包含了詞語 i 的文檔數
TF-IDF 對基於 UGC 推薦的改進 -- 引入對熱門的懲罰
為了避免熱門標簽和熱門物品獲得更多的權重,我們需要對“熱門”進行懲罰
借鑒 TF-IDF 的思想,以一個物品的所有標簽作為“文檔”,標簽作為“詞語”,從而計算標簽的“詞頻”(在物品所有標簽中的頻率)和“逆文檔頻率”(在其它物品標簽中普遍出現的頻率)
由於“物品 i 的所有標簽”n*,i 應該對標簽權重沒有影響,而“所有標簽總數”N 對於所有標簽是一定的,所以這兩項可以略去。在簡單算法的基礎上,直接加入對熱門標簽和熱門物品的懲罰項:
其中,𝑛_𝑏^((𝑢))記錄了標簽 b 被多少個不同的用戶使用過,𝑛_𝑖^((𝑢))記錄了物品 i 被多少個不同的用戶打過標簽
TF-IDF算法示例
import numpy as np import pandas as pd 1. 定義數據和預處理 docA = "The cat sat on my bed" docB = "The dog sat on my knees" bowA = docA.split(" ") #先做分詞 bowB = docB.split(" ") bowA # 構建詞庫 list轉換為set集合並去重 wordSet = set(bowA).union(set(bowB)) wordSet =========>> {'The', 'bed', 'cat', 'dog', 'knees', 'my', 'on', 'sat'} 2. 進行詞數統計 # 用統計字典來保存詞出現的次數 wordDictA = dict.fromkeys( wordSet, 0 ) wordDictB = dict.fromkeys( wordSet, 0 ) # 遍歷文檔,統計詞數 for word in bowA: wordDictA[word] += 1 for word in bowB: wordDictB[word] += 1 pd.DataFrame([wordDictA, wordDictB])
3. 基於協同過濾的推薦