教程總體簡介:1.1 推薦系統簡介 學習目標 1 推薦系統概念及產生背景 2 推薦系統的工作原理及作用 3 推薦系統和Web項目的區別 1.3 推薦算法 1 推薦模型構建流程 2 最經典的推薦算法:協同過濾推薦算法(Collaborative Filtering) 3 相似度計算(Similarity Calculation) 4 協同過濾推薦算法代碼實現: 二 根據用戶行為數據創建ALS模型并召回商品 2.0 用戶行為數據拆分 2.1 預處理behavior_log數據集 2.2 根據用戶對類目偏好打分訓練ALS模型 三 CTR預估數據準備 3.1 分析并預處理raw_sample數據集 1.3 Hadoop優勢 4.4 大數據產品與互聯網產品結合 4.5 大數據應用--數據分析 4.6 數據分析案例 5.3 HBase 的安裝與Shell操作 1 HBase的安裝 2.3 HDFS設計思路 4.3 Hive 函數 1 內置運算符 2 內置函數 3 Hive 自定義函數和 Transform MapReduce實戰 3.3.1 利用MRJob編寫和運行MapReduce代碼 3.3.2 運行MRJOB的不同方式 3.3.3 mrjob 實現 topN統計(實驗) spark-core RDD常用算子練習 3.1 RDD 常用操作 3.2 RDD Transformation算子 3.4 Spark RDD兩類算子執行示意 3、JSON數據的處理 3.1 介紹 3.2 實踐 3.1 靜態json數據的讀取和操作 5.4 HappyBase操作Hbase 4.4 hive綜合案例 四 LR實現CTR預估 4.1 Spark邏輯回歸(LR)訓練點擊率預測模型 4、數據清洗 5.6 HBase組件 1、sparkStreaming概述 spark-core實戰 5.1通過spark實現ip地址查詢 五 離線推薦數據緩存 5.1離線數據緩存之離線召回集 1.4 案例--基于協同過濾的電影推薦 1 User-Based CF 預測電影評分 3 spark 安裝部署及standalone模式介紹 1 spark 安裝部署 3 spark 集群相關概念 六 實時產生推薦結果 6.1 推薦任務處理 推薦系統基礎 Hadoop Hive HBase Spark SQL 1.6 推薦系統的冷啟動問題 2 處理推薦系統冷啟動問題的常用方法 一 個性化電商廣告推薦系統介紹 1.2 項目效果展示 1.3 項目實現分析 1.4 點擊率預測(CTR--Click-Through-Rate)概念 資源調度框架 YARN 3.1.1 什么是YARN 3.1.2 YARN產生背景 3.1.3 YARN的架構和執行流程 基于回歸模型的協同過濾推薦 基于矩陣分解的CF算法 基于矩陣分解的CF算法實現(二):BiasSvd 基于內容的推薦算法(Content-Based) 基于內容的電影推薦:物品畫像 基于TF-IDF的特征提取技術 基于內容的電影推薦:為用戶產生TOP-N推薦結果 2、DataFrame 分布式處理框架 MapReduce 3.2.1 什么是MapReduce
完整筆記資料代碼:https://gitee.com/yinuo112/Backend/tree/master/Python/嘿馬推薦系統全知識和項目開發教程/note.md
感興趣的小伙伴可以自取哦~
全套教程部分目錄:
部分文件圖片:
1.4 案例--基于協同過濾的電影推薦
學習目標
應用基于用戶的協同過濾實現電影評分預測 應用基于物品的協同過濾實現電影評分預測
1 User-Based CF 預測電影評分
數據集下載
下載地址:[MovieLens Latest Datasets Small](
建議下載[ml-latest-small.zip](
加載ratings.csv,轉換為用戶-電影評分矩陣并計算用戶之間相似度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
import os import pandas as pd
import numpy as np DATA_PATH = "./datasets/ml-latest-small/ratings.csv" dtype = { "userId" : np . int32 , "movieId" : np . int32 , "rating" : np . float32 } # 加載數據,我們只用前三列數據,分別是用戶ID,電影ID,已經用戶對電影的對應評分 ratings = pd . read_csv ( data_path , dtype = dtype , usecols = range ( 3 )) # 透視表,將電影ID轉換為列名稱,轉換成為一個User-Movie的評分矩陣 ratings_matrix = ratings . pivot_table ( index = [ "userId" ], columns = [ "movieId" ], values = "rating" ) #計算用戶之間相似度 user_similar = ratings_matrix . T . corr ()
預測用戶對物品的評分 (以用戶1對電影1評分為例)
評分公式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
# 1. 找出uid用戶的相似用戶 similar_users = user_similar [ 1 ] . drop ([ 1 ]) . dropna () # 相似用戶篩選規則:正相關的用戶 similar_users = similar_users . where ( similar_users > 0 ) . dropna () # 2. 從用戶1的近鄰相似用戶中篩選出對物品1有評分記錄的近鄰用戶 ids = set ( ratings_matrix [ 1 ] . dropna () . index ) & set ( similar_users . index )
finally_similar_users = similar_users . ix [ list ( 1 )] # 3. 結合uid用戶與其近鄰用戶的相似度預測uid用戶對iid物品的評分 numerator = 0 # 評分預測公式的分子部分的值
denominator = 0 # 評分預測公式的分母部分的值
for sim_uid , similarity in finally_similar_users . iteritems (): # 近鄰用戶的評分數據 sim_user_rated_movies = ratings_matrix . ix [ sim_uid ] . dropna () # 近鄰用戶對iid物品的評分 sim_user_rating_for_item = sim_user_rated_movies [ 1 ] # 計算分子的值 numerator += similarity * sim_user_rating_for_item # 計算分母的值 denominator += similarity # 4 計算預測的評分值 predict_rating = numerator / denominator
print ( "預測出用戶< %d >對電影< %d >的評分: %0.2f " % ( 1 , 1 , predict_rating ))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
def predict ( uid , iid , ratings_matrix , user_similar ):
'''
預測給定用戶對給定物品的評分值
:param uid: 用戶ID
:param iid: 物品ID
:param ratings_matrix: 用戶-物品評分矩陣
:param user_similar: 用戶兩兩相似度矩陣
:return: 預測的評分值
''' print ( "開始預測用戶< %d >對電影< %d >的評分..." % ( uid , iid )) # 1. 找出uid用戶的相似用戶 similar_users = user_similar [ uid ] . drop ([ uid ]) . dropna () # 相似用戶篩選規則:正相關的用戶 similar_users = similar_users . where ( similar_users > 0 ) . dropna () if similar_users . empty is True : raise Exception ( "用戶< %d >沒有相似的用戶" % uid ) # 2. 從uid用戶的近鄰相似用戶中篩選出對iid物品有評分記錄的近鄰用戶 ids = set ( ratings_matrix [ iid ] . dropna () . index ) & set ( similar_users . index ) finally_similar_users = similar_users . ix [ list ( ids )] # 3. 結合uid用戶與其近鄰用戶的相似度預測uid用戶對iid物品的評分 numerator = 0 # 評分預測公式的分子部分的值 denominator = 0 # 評分預測公式的分母部分的值 for sim_uid , similarity in finally_similar_users . iteritems (): # 近鄰用戶的評分數據 sim_user_rated_movies = ratings_matrix . ix [ sim_uid ] . dropna () # 近鄰用戶對iid物品的評分 sim_user_rating_for_item = sim_user_rated_movies [ iid ] # 計算分子的值 numerator += similarity * sim_user_rating_for_item # 計算分母的值 denominator += similarity # 計算預測的評分值并返回 predict_rating = numerator / denominator print ( "預測出用戶< %d >對電影< %d >的評分: %0.2f " % ( uid , iid , predict_rating )) return round ( predict_rating , 2 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
def predict_all ( uid , ratings_matrix , user_similar ):
'''
預測全部評分
:param uid: 用戶id
:param ratings_matrix: 用戶-物品打分矩陣
:param user_similar: 用戶兩兩間的相似度
:return: 生成器,逐個返回預測評分
''' # 準備要預測的物品的id列表 item_ids = ratings_matrix . columns # 逐個預測 for iid in item_ids : try : rating = predict ( uid , iid , ratings_matrix , user_similar ) except Exception as e : print ( e ) else : yield uid , iid , rating
if __name__ == '__main__' : for i in predict_all ( 1 , ratings_matrix , user_similar ): pass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
def top_k_rs_result ( k ): results = predict_all ( 1 , ratings_matrix , user_similar ) return sorted ( results , key = lambda x : x [ 2 ], reverse = True )[: k ]
if __name__ == '__main__' : from pprint import pprint result = top_k_rs_result ( 20 ) pprint ( result )
2 Item-Based CF 預測電影評分
加載ratings.csv,轉換為用戶-電影評分矩陣并計算用戶之間相似度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
import os import pandas as pd
import numpy as np DATA_PATH = "./datasets/ml-latest-small/ratings.csv" dtype = { "userId" : np . int32 , "movieId" : np . int32 , "rating" : np . float32 } # 加載數據,我們只用前三列數據,分別是用戶ID,電影ID,已經用戶對電影的對應評分 ratings = pd . read_csv ( data_path , dtype = dtype , usecols = range ( 3 )) # 透視表,將電影ID轉換為列名稱,轉換成為一個User-Movie的評分矩陣 ratings_matrix = ratings . pivot_table ( index = [ "userId" ], columns = [ "movieId" ], values = "rating" ) #計算用戶之間相似度 item_similar = ratings_matrix . corr ()
預測用戶對物品的評分 (以用戶1對電影1評分為例)
評分公式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
# 1. 找出iid物品的相似物品 similar_items = item_similar [ 1 ] . drop ([ 1 ]) . dropna () # 相似物品篩選規則:正相關的物品 similar_items = similar_items . where ( similar_items > 0 ) . dropna () # 2. 從iid物品的近鄰相似物品中篩選出uid用戶評分過的物品 ids = set ( ratings_matrix . ix [ 1 ] . dropna () . index ) & set ( similar_items . index )
finally_similar_items = similar_items . ix [ list ( ids )] # 3. 結合iid物品與其相似物品的相似度和uid用戶對其相似物品的評分,預測uid對iid的評分 numerator = 0 # 評分預測公式的分子部分的值
denominator = 0 # 評分預測公式的分母部分的值
for sim_iid , similarity in finally_similar_items . iteritems (): # 近鄰物品的評分數據 sim_item_rated_movies = ratings_matrix [ sim_iid ] . dropna () # 1用戶對相似物品物品的評分 sim_item_rating_from_user = sim_item_rated_movies [ 1 ] # 計算分子的值 numerator += similarity * sim_item_rating_from_user # 計算分母的值 denominator += similarity # 計算預測的評分值并返回 predict_rating = sum_up / sum_down
print ( "預測出用戶< %d >對電影< %d >的評分: %0.2f " % ( uid , iid , predict_rating ))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
def predict ( uid , iid , ratings_matrix , user_similar ):
'''
預測給定用戶對給定物品的評分值
:param uid: 用戶ID
:param iid: 物品ID
:param ratings_matrix: 用戶-物品評分矩陣
:param user_similar: 用戶兩兩相似度矩陣
:return: 預測的評分值
''' print ( "開始預測用戶< %d >對電影< %d >的評分..." % ( uid , iid )) # 1. 找出uid用戶的相似用戶 similar_users = user_similar [ uid ] . drop ([ uid ]) . dropna () # 相似用戶篩選規則:正相關的用戶 similar_users = similar_users . where ( similar_users > 0 ) . dropna () if similar_users . empty is True : raise Exception ( "用戶< %d >沒有相似的用戶" % uid ) # 2. 從uid用戶的近鄰相似用戶中篩選出對iid物品有評分記錄的近鄰用戶 ids = set ( ratings_matrix [ iid ] . dropna () . index ) & set ( similar_users . index ) finally_similar_users = similar_users . ix [ list ( ids )] # 3. 結合uid用戶與其近鄰用戶的相似度預測uid用戶對iid物品的評分 numerator = 0 # 評分預測公式的分子部分的值 denominator = 0 # 評分預測公式的分母部分的值 for sim_uid , similarity in finally_similar_users . iteritems (): # 近鄰用戶的評分數據 sim_user_rated_movies = ratings_matrix . ix [ sim_uid ] . dropna () # 近鄰用戶對iid物品的評分 sim_user_rating_for_item = sim_user_rated_movies [ iid ] # 計算分子的值 numerator += similarity * sim_user_rating_for_item # 計算分母的值 denominator += similarity # 計算預測的評分值并返回 predict_rating = numerator / denominator print ( "預測出用戶< %d >對電影< %d >的評分: %0.2f " % ( uid , iid , predict_rating )) return round ( predict_rating , 2 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
def predict_all ( uid , ratings_matrix , item_similar ):
'''
預測全部評分
:param uid: 用戶id
:param ratings_matrix: 用戶-物品打分矩陣
:param item_similar: 物品兩兩間的相似度
:return: 生成器,逐個返回預測評分
''' # 準備要預測的物品的id列表 item_ids = ratings_matrix . columns # 逐個預測 for iid in item_ids : try : rating = predict ( uid , iid , ratings_matrix , item_similar ) except Exception as e : print ( e ) else : yield uid , iid , rating if __name__ == '__main__' : for i in predict_all ( 1 , ratings_matrix , item_similar ): pass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
def top_k_rs_result ( k ): results = predict_all ( 1 , ratings_matrix , item_similar ) return sorted ( results , key = lambda x : x [ 2 ], reverse = True )[: k ]
if __name__ == '__main__' : from pprint import pprint result = top_k_rs_result ( 20 ) pprint ( result )
3
1.5 推薦系統評估
學習目標
1 推薦系統的評估指標
好的推薦系統可以實現用戶, 服務提供方, 內容提供方的共贏
? 準確性 ? 信任度 ? 滿意度 ? 實時性 ? 覆蓋率 ? 魯棒性 ? 多樣性 ? 可擴展性 ? 新穎性 ? 商業?標 ? 驚喜度 ? ?戶留存
2 推薦系統評估方法