【Python使用】嘿馬推薦系統(tǒng)全知識(shí)和項(xiàng)目開發(fā)教程第2篇:1.4 案例--基于協(xié)同過濾的電影推薦,1.5 推薦系統(tǒng)評(píng)估【附代碼文檔】

教程總體簡(jiǎn)介:1.1 推薦系統(tǒng)簡(jiǎn)介 學(xué)習(xí)目標(biāo) 1 推薦系統(tǒng)概念及產(chǎn)生背景 2 推薦系統(tǒng)的工作原理及作用 3 推薦系統(tǒng)和Web項(xiàng)目的區(qū)別 1.3 推薦算法 1 推薦模型構(gòu)建流程 2 最經(jīng)典的推薦算法:協(xié)同過濾推薦算法(Collaborative Filtering) 3 相似度計(jì)算(Similarity Calculation) 4 協(xié)同過濾推薦算法代碼實(shí)現(xiàn): 二 根據(jù)用戶行為數(shù)據(jù)創(chuàng)建ALS模型并召回商品 2.0 用戶行為數(shù)據(jù)拆分 2.1 預(yù)處理behavior_log數(shù)據(jù)集 2.2 根據(jù)用戶對(duì)類目偏好打分訓(xùn)練ALS模型 三 CTR預(yù)估數(shù)據(jù)準(zhǔn)備 3.1 分析并預(yù)處理raw_sample數(shù)據(jù)集 1.3 Hadoop優(yōu)勢(shì) 4.4 大數(shù)據(jù)產(chǎn)品與互聯(lián)網(wǎng)產(chǎn)品結(jié)合 4.5 大數(shù)據(jù)應(yīng)用--數(shù)據(jù)分析 4.6 數(shù)據(jù)分析案例 5.3 HBase 的安裝與Shell操作 1 HBase的安裝 2.3 HDFS設(shè)計(jì)思路 4.3 Hive 函數(shù) 1 內(nèi)置運(yùn)算符 2 內(nèi)置函數(shù) 3 Hive 自定義函數(shù)和 Transform MapReduce實(shí)戰(zhàn) 3.3.1 利用MRJob編寫和運(yùn)行MapReduce代碼 3.3.2 運(yùn)行MRJOB的不同方式 3.3.3 mrjob 實(shí)現(xiàn) topN統(tǒng)計(jì)(實(shí)驗(yàn)) spark-core RDD常用算子練習(xí) 3.1 RDD 常用操作 3.2 RDD Transformation算子 3.4 Spark RDD兩類算子執(zhí)行示意 3、JSON數(shù)據(jù)的處理 3.1 介紹 3.2 實(shí)踐 3.1 靜態(tài)json數(shù)據(jù)的讀取和操作 5.4 HappyBase操作Hbase 4.4 hive綜合案例 四 LR實(shí)現(xiàn)CTR預(yù)估 4.1 Spark邏輯回歸(LR)訓(xùn)練點(diǎn)擊率預(yù)測(cè)模型 4、數(shù)據(jù)清洗 5.6 HBase組件 1、sparkStreaming概述 spark-core實(shí)戰(zhàn) 5.1通過spark實(shí)現(xiàn)ip地址查詢 五 離線推薦數(shù)據(jù)緩存 5.1離線數(shù)據(jù)緩存之離線召回集 1.4 案例--基于協(xié)同過濾的電影推薦 1 User-Based CF 預(yù)測(cè)電影評(píng)分 3 spark 安裝部署及standalone模式介紹 1 spark 安裝部署 3 spark 集群相關(guān)概念 六 實(shí)時(shí)產(chǎn)生推薦結(jié)果 6.1 推薦任務(wù)處理 推薦系統(tǒng)基礎(chǔ) Hadoop Hive HBase Spark SQL 1.6 推薦系統(tǒng)的冷啟動(dòng)問題 2 處理推薦系統(tǒng)冷啟動(dòng)問題的常用方法 一 個(gè)性化電商廣告推薦系統(tǒng)介紹 1.2 項(xiàng)目效果展示 1.3 項(xiàng)目實(shí)現(xiàn)分析 1.4 點(diǎn)擊率預(yù)測(cè)(CTR--Click-Through-Rate)概念 資源調(diào)度框架 YARN 3.1.1 什么是YARN 3.1.2 YARN產(chǎn)生背景 3.1.3 YARN的架構(gòu)和執(zhí)行流程 基于回歸模型的協(xié)同過濾推薦 基于矩陣分解的CF算法 基于矩陣分解的CF算法實(shí)現(xiàn)(二):BiasSvd 基于內(nèi)容的推薦算法(Content-Based) 基于內(nèi)容的電影推薦:物品畫像 基于TF-IDF的特征提取技術(shù) 基于內(nèi)容的電影推薦:為用戶產(chǎn)生TOP-N推薦結(jié)果 2、DataFrame 分布式處理框架 MapReduce 3.2.1 什么是MapReduce

完整筆記資料代碼:https://gitee.com/yinuo112/Backend/tree/master/Python/嘿馬推薦系統(tǒng)全知識(shí)和項(xiàng)目開發(fā)教程/note.md

感興趣的小伙伴可以自取哦~


全套教程部分目錄:


部分文件圖片:

1.4 案例--基于協(xié)同過濾的電影推薦

學(xué)習(xí)目標(biāo)

  • 應(yīng)用基于用戶的協(xié)同過濾實(shí)現(xiàn)電影評(píng)分預(yù)測(cè)
  • 應(yīng)用基于物品的協(xié)同過濾實(shí)現(xiàn)電影評(píng)分預(yù)測(cè)

1 User-Based CF 預(yù)測(cè)電影評(píng)分

  • 數(shù)據(jù)集下載

    • 下載地址:[MovieLens Latest Datasets Small](
    • 建議下載[ml-latest-small.zip](
  • 加載ratings.csv,轉(zhuǎn)換為用戶-電影評(píng)分矩陣并計(jì)算用戶之間相似度

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}
  
  
# 加載數(shù)據(jù),我們只用前三列數(shù)據(jù),分別是用戶ID,電影ID,已經(jīng)用戶對(duì)電影的對(duì)應(yīng)評(píng)分
  
  
ratings = pd.read_csv(data_path, dtype=dtype, usecols=range(3))
  
  
# 透視表,將電影ID轉(zhuǎn)換為列名稱,轉(zhuǎn)換成為一個(gè)User-Movie的評(píng)分矩陣
  
  
ratings_matrix = ratings.pivot_table(index=["userId"], columns=["movieId"],values="rating")
  
  
#計(jì)算用戶之間相似度
  
  
user_similar = ratings_matrix.T.corr()
  • 預(yù)測(cè)用戶對(duì)物品的評(píng)分 (以用戶1對(duì)電影1評(píng)分為例)

評(píng)分公式<script type="math/tex; ">&#13; pred(u,i)=\hat{r}{ui}=\cfrac{\sum{v\in U}sim(u,v)*r_{vi}}{\sum_{v\in U}|sim(u,v)|}&#13;</script>

  
  
# 1. 找出uid用戶的相似用戶
  
  
similar_users = user_similar[1].drop([1]).dropna()
  
  
# 相似用戶篩選規(guī)則:正相關(guān)的用戶
  
  
similar_users = similar_users.where(similar_users>0).dropna()
  
  
# 2. 從用戶1的近鄰相似用戶中篩選出對(duì)物品1有評(píng)分記錄的近鄰用戶
  
  
ids = set(ratings_matrix[1].dropna().index)&set(similar_users.index)
finally_similar_users = similar_users.ix[list(1)]
  
  
# 3. 結(jié)合uid用戶與其近鄰用戶的相似度預(yù)測(cè)uid用戶對(duì)iid物品的評(píng)分
  
  
numerator = 0    # 評(píng)分預(yù)測(cè)公式的分子部分的值
denominator = 0    # 評(píng)分預(yù)測(cè)公式的分母部分的值
for sim_uid, similarity in finally_similar_users.iteritems():
    # 近鄰用戶的評(píng)分?jǐn)?shù)據(jù)
    sim_user_rated_movies = ratings_matrix.ix[sim_uid].dropna()
    # 近鄰用戶對(duì)iid物品的評(píng)分
    sim_user_rating_for_item = sim_user_rated_movies[1]
    # 計(jì)算分子的值
    numerator += similarity * sim_user_rating_for_item
    # 計(jì)算分母的值
    denominator += similarity
  
  
# 4 計(jì)算預(yù)測(cè)的評(píng)分值
  
  
predict_rating = numerator/denominator
print("預(yù)測(cè)出用戶<%d>對(duì)電影<%d>的評(píng)分:%0.2f" % (1, 1, predict_rating))
  • 封裝成方法 預(yù)測(cè)任意用戶對(duì)任意電影的評(píng)分
def predict(uid, iid, ratings_matrix, user_similar):
    '''
    預(yù)測(cè)給定用戶對(duì)給定物品的評(píng)分值
    :param uid: 用戶ID
    :param iid: 物品ID
    :param ratings_matrix: 用戶-物品評(píng)分矩陣
    :param user_similar: 用戶兩兩相似度矩陣
    :return: 預(yù)測(cè)的評(píng)分值
    '''
    print("開始預(yù)測(cè)用戶<%d>對(duì)電影<%d>的評(píng)分..."%(uid, iid))
    # 1. 找出uid用戶的相似用戶
    similar_users = user_similar[uid].drop([uid]).dropna()
    # 相似用戶篩選規(guī)則:正相關(guān)的用戶
    similar_users = similar_users.where(similar_users>0).dropna()
    if similar_users.empty is True:
        raise Exception("用戶<%d>沒有相似的用戶" % uid)

    # 2. 從uid用戶的近鄰相似用戶中篩選出對(duì)iid物品有評(píng)分記錄的近鄰用戶
    ids = set(ratings_matrix[iid].dropna().index)&set(similar_users.index)
    finally_similar_users = similar_users.ix[list(ids)]

    # 3. 結(jié)合uid用戶與其近鄰用戶的相似度預(yù)測(cè)uid用戶對(duì)iid物品的評(píng)分
    numerator = 0    # 評(píng)分預(yù)測(cè)公式的分子部分的值
    denominator = 0    # 評(píng)分預(yù)測(cè)公式的分母部分的值
    for sim_uid, similarity in finally_similar_users.iteritems():
        # 近鄰用戶的評(píng)分?jǐn)?shù)據(jù)
        sim_user_rated_movies = ratings_matrix.ix[sim_uid].dropna()
        # 近鄰用戶對(duì)iid物品的評(píng)分
        sim_user_rating_for_item = sim_user_rated_movies[iid]
        # 計(jì)算分子的值
        numerator += similarity * sim_user_rating_for_item
        # 計(jì)算分母的值
        denominator += similarity

    # 計(jì)算預(yù)測(cè)的評(píng)分值并返回
    predict_rating = numerator/denominator
    print("預(yù)測(cè)出用戶<%d>對(duì)電影<%d>的評(píng)分:%0.2f" % (uid, iid, predict_rating))
    return round(predict_rating, 2)
  • 為某一用戶預(yù)測(cè)所有電影評(píng)分
def predict_all(uid, ratings_matrix, user_similar):
    '''
    預(yù)測(cè)全部評(píng)分
    :param uid: 用戶id
    :param ratings_matrix: 用戶-物品打分矩陣
    :param user_similar: 用戶兩兩間的相似度
    :return: 生成器,逐個(gè)返回預(yù)測(cè)評(píng)分
    '''
    # 準(zhǔn)備要預(yù)測(cè)的物品的id列表
    item_ids = ratings_matrix.columns
    # 逐個(gè)預(yù)測(cè)
    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
  • 根據(jù)評(píng)分為指定用戶推薦topN個(gè)電影
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 預(yù)測(cè)電影評(píng)分

  • 加載ratings.csv,轉(zhuǎn)換為用戶-電影評(píng)分矩陣并計(jì)算用戶之間相似度
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}
  
  
# 加載數(shù)據(jù),我們只用前三列數(shù)據(jù),分別是用戶ID,電影ID,已經(jīng)用戶對(duì)電影的對(duì)應(yīng)評(píng)分
  
  
ratings = pd.read_csv(data_path, dtype=dtype, usecols=range(3))
  
  
# 透視表,將電影ID轉(zhuǎn)換為列名稱,轉(zhuǎn)換成為一個(gè)User-Movie的評(píng)分矩陣
  
  
ratings_matrix = ratings.pivot_table(index=["userId"], columns=["movieId"],values="rating")
  
  
#計(jì)算用戶之間相似度
  
  
item_similar = ratings_matrix.corr()
  • 預(yù)測(cè)用戶對(duì)物品的評(píng)分 (以用戶1對(duì)電影1評(píng)分為例)

評(píng)分公式<script type="math/tex; ">&#13; pred(u,i)=\hat{r}{ui}=\cfrac{\sum{v\in U}sim(u,v)*r_{vi}}{\sum_{v\in U}|sim(u,v)|}&#13;</script>

  
  
# 1. 找出iid物品的相似物品
  
  
similar_items = item_similar[1].drop([1]).dropna()
  
  
# 相似物品篩選規(guī)則:正相關(guān)的物品
  
  
similar_items = similar_items.where(similar_items>0).dropna()
  
  
# 2. 從iid物品的近鄰相似物品中篩選出uid用戶評(píng)分過的物品
  
  
ids = set(ratings_matrix.ix[1].dropna().index)&set(similar_items.index)
finally_similar_items = similar_items.ix[list(ids)]

  
  
# 3. 結(jié)合iid物品與其相似物品的相似度和uid用戶對(duì)其相似物品的評(píng)分,預(yù)測(cè)uid對(duì)iid的評(píng)分
  
  
numerator = 0    # 評(píng)分預(yù)測(cè)公式的分子部分的值
denominator = 0    # 評(píng)分預(yù)測(cè)公式的分母部分的值
for sim_iid, similarity in finally_similar_items.iteritems():
    # 近鄰物品的評(píng)分?jǐn)?shù)據(jù)
    sim_item_rated_movies = ratings_matrix[sim_iid].dropna()
    # 1用戶對(duì)相似物品物品的評(píng)分
    sim_item_rating_from_user = sim_item_rated_movies[1]
    # 計(jì)算分子的值
    numerator += similarity * sim_item_rating_from_user
    # 計(jì)算分母的值
    denominator += similarity

  
  
# 計(jì)算預(yù)測(cè)的評(píng)分值并返回
  
  
predict_rating = sum_up/sum_down
print("預(yù)測(cè)出用戶<%d>對(duì)電影<%d>的評(píng)分:%0.2f" % (uid, iid, predict_rating))
  • 封裝成方法 預(yù)測(cè)任意用戶對(duì)任意電影的評(píng)分
def predict(uid, iid, ratings_matrix, user_similar):
    '''
    預(yù)測(cè)給定用戶對(duì)給定物品的評(píng)分值
    :param uid: 用戶ID
    :param iid: 物品ID
    :param ratings_matrix: 用戶-物品評(píng)分矩陣
    :param user_similar: 用戶兩兩相似度矩陣
    :return: 預(yù)測(cè)的評(píng)分值
    '''
    print("開始預(yù)測(cè)用戶<%d>對(duì)電影<%d>的評(píng)分..."%(uid, iid))
    # 1. 找出uid用戶的相似用戶
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容