推薦概念
- 信息過濾系統 解決 信息過載 用戶需求不明確的問題
- 利用一定的規則將物品排序 展示給需求不明確的用戶
- 推薦 搜索區別
- 推薦個性化較強,用戶被動的接受,希望能夠提供持續的服務
- 搜索個性化弱,用戶主動搜索,快速滿足用戶的需求
- 推薦和 web項目區別
- 構建穩定的信息流通通道
- 推薦 信息過濾系統
- web 對結果有明確預期
- 推薦 結果是概率問題
Lambda 架構介紹
- 離線計算和實時計算共同提供服務的問題
- 離線計算優缺點
- 優點 能夠處理的數據量可以很大 比如pb級別
- 缺點 速度比較慢 分鍾級別的延遲
- 實時計算
- 優點 響應快 來一條數據處理一條 ms級別響應
- 缺點 處理的數據量小一些
- 離線計算的框架
- hadoop hdfs mapreduce
- spark core , spark sql
- hive
- 實時計算框架
- spark streaming
- storm
- flink
- 消息中間件
- flume 日志采集系統
- kafka 消息隊列
- 存儲相關
- hbase nosql數據庫
- hive sql操作hdfs數據
推薦算法架構
-
召回
-
協同過濾 算相似度 memory base
基於模型的 model base 矩陣分解
-
基於內容
- 分詞
- 詞權重(提取關鍵詞) tf-idf
- word2Vec 詞向量
- 物品向量
-
-
排序
- 邏輯回歸
-
策略調整
推薦模型構建流程
-
數據收集
- 顯性評分
- 隱性數據
-
特征工程
- 協同過濾:用戶-物品 評分矩陣
- 基於內容:分詞 tf-idf word2Vec
-
訓練模型
- 協同過濾
- kNN
- 矩陣分解 梯度下降 ALS
- 協同過濾
-
評估、模型上線
協同過濾思路介紹
- CF 物以類聚人以群分
- 做協同過濾的話 首先特征工程把 用戶-物品的評分矩陣創建出來
- 基於用戶的協同過濾
- 給用戶A 找到最相似的N個用戶
- N個用戶消費過哪些物品
- N個用戶消費過的物品中-A用戶消費過的就是推薦結果
- 基於物品的協同過濾
- 給物品A 找到最相似的N個物品
- A用戶消費記錄 找到這些物品的相似物品
- 從這些相似物品先去重-A用戶消費過的就是推薦結果
相似度計算
- 余弦相似度、皮爾遜相關系數
- 向量的夾角余弦值
- 皮爾遜會對向量的每一個分量做中心化
- 余弦只考慮方向 不考慮向量長度
- 如果評分數據是連續的數值比較適合中余弦、皮爾遜計算相似度
- 傑卡德相似度
- 交集/並集
- 計算評分是0 1 布爾值的相似度
使用不同相似度計算方式實現協同過濾
-
如果 買/沒買 點/沒點數據 0/1 適合使用傑卡德相似度
- from sklearn.metrics import jaccard_similarity_score
- jaccard_similarity_score(df['Item A'],df['Item B'])
- from sklearn.metrics.pairwise import pairwise_distances
- user_similar = 1-pairwise_distances(df,metric='jaccard')
-
一般用評分去做協同過濾 推薦使用皮爾遜相關系數
-
評分預測
-
$$
pred(u,i)=\hat{r}{ui}=\cfrac{\sum{v\in U}sim(u,v)*r_{vi}}{\sum_{v\in U}|sim(u,v)|}
$$
-
-
基於用戶和基於物品的協同過濾 嚴格上說,屬於兩種算法,實踐中可以都做出來,對比效果,選擇最靠譜的
協同過濾 基於模型的算法
- 用戶-物品矩陣比較稀疏的時候 直接去取物品向量 用戶向量計算相似度 不太適合
- 基於模型的方法可以解決用戶-物品矩陣比較稀疏的問題
- 矩陣分解
- 把大的矩陣拆成兩個小的 用戶矩陣 物品矩陣 MXN 大矩陣 M X K K X N K<<M k<<N
- 大矩陣 約等於 用戶矩陣 乘 物品矩陣
- 使用als 交替最小二乘法來優化損失 spark ML recommandation 包封裝了als
- 優化之后的用戶矩陣 取出用戶向量
- 優化之后的物品矩陣 取出物品向量
- 用戶向量點乘物品向量 得到最終評分的預測
推薦系統的評價
-
准確率 覆蓋率
- 准確率
- 學術 rmse mas 點擊率預估 精准率
- 工程 A/B test 對比不同的算法 在線上運行對關鍵指標的影響
- baseline 基准線 熱門排行
- 灰度發布
- 准確率
-
EE
- Exploitation & Exploration 探索與利用問題
- Exploitation 利用用戶的歷史行為 只給他曾經看過的/消費過的相似物品
- Exploration(探測 搜索) 發現用戶的新興趣
- ee問題 實際上是矛盾
-
評估手段
- 離線評估和在線評估結合, 定期做問卷調查
- 在線評估
- 灰度發布 & A/B測試
- 在線評估
- 離線評估和在線評估結合, 定期做問卷調查
推薦系統的冷啟動
- 用戶冷啟動
- 盡可能收集用戶信息 構建用戶畫像(打標簽)
- 根據用戶的標簽可以做人群聚類 用以有用戶的行為做推薦
- 更多的使用流行度推薦
- 物品冷啟動
- 物品打標簽 構建物品畫像
- 基於內容的推薦
- 系統冷啟動
- 如果應用缺少用戶行為數據->基於內容的推薦
- 隨着用戶行為積累的越來越多->協同過濾
- 基於內容和協同過濾共同工作
基於內容的推薦
- 給物品打標簽
- 系統自己提取從業務數據庫中提取
- 用戶填寫
- 中文分詞 利用算法計算詞的權重
- tf-idf tf term frequency 詞頻 5/100 *2
- idf 逆文檔頻率 log 10 文本庫篇數/出現關鍵詞的文章篇數
- 1000 10python 1000/10 100 2
- 1000/1000 log(1) = 0
- textrank
- tf-idf tf term frequency 詞頻 5/100 *2
- 利用標簽的文字 轉換成詞向量
- word2Vec 詞->向量
- 用向量來表示語義
- 如果兩個詞的詞向量相似度比較高 認為這兩個詞的語義相近
- 利用詞向量 構建物品的向量
- 一個物品有N個關鍵詞 每一個關鍵詞對應一個詞向量
- 求和(權重*詞向量)/N
- 利用N個關鍵詞的詞向量獲取物品向量
- 通過物品向量計算相似度
- 皮爾遜 相關系數 計算物品向量的相似度
基於內容的推薦 基於物品的協同過濾 區別
- content_base :詞向量->物品向量->計算相似度
- item_based cf :user-item matrix->物品向量->相似度
- content_base item_based cf 不一樣
- 物品向量構建過程有區別
- 基於內容的推薦
- 物品向量 文本(物品描述信息,系統填標簽,用戶填標簽)
- 基於物品的協同過濾
- 用戶對物品的評分矩陣 用戶的行為數據中來