亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文將教大家用Python中基于模型的協(xié)同過濾構(gòu)建推薦系統(tǒng),這種推薦系統(tǒng)經(jīng)常被用于音樂、視頻網(wǎng)站等。

推薦系統(tǒng)廣泛應(yīng)用于音樂、電影、書籍、新聞、研究文章、餐館等產(chǎn)品的推薦。

如何用Python構(gòu)建機(jī)器學(xué)習(xí)推薦系統(tǒng)?網(wǎng)易云、愛奇藝也用這種方法

 

構(gòu)建推薦系統(tǒng)有兩種常用方法:

  • 協(xié)同過濾:https://en.wikipedia.org/wiki/Collaborative_filtering
  • 基于內(nèi)容的篩選:https://developers.google.com/machine-learning/recommendation/content-based/basics

協(xié)同過濾方法通過從許多其他用戶(協(xié)作)收集偏好信息來預(yù)測(過濾)用戶對產(chǎn)品的興趣。協(xié)同過濾方法背后的假設(shè)是,如果一個人 P1 和另一個人 P2 對某個問題有相同的意見,P1比隨機(jī)選擇的人更有可能分享P2對不同問題的意見。

基于內(nèi)容的過濾方法利用產(chǎn)品特性/屬性,根據(jù)其他用戶之前的行為或?qū)Ξa(chǎn)品的評價(jià)等明確反饋,推薦與用戶喜歡的產(chǎn)品相似的其他產(chǎn)品。

推薦系統(tǒng)可以使用這兩種方法中的一種或兩種。

在本文中,將使用 Kaggle Netflix prize 數(shù)據(jù)集來演示如何使用基于模型的協(xié)同過濾方法在 Python 中構(gòu)建推薦系統(tǒng)。

本文其余部分安排如下:

  • 協(xié)同過濾概述
  • 用 Python 構(gòu)建推薦系統(tǒng)
  • 總結(jié)

1、協(xié)同過濾概述

協(xié)同過濾背后的主要思想是,一個人經(jīng)常從另一個興趣相似的人那里得到最佳推薦。協(xié)同過濾使用各種技術(shù)來匹配興趣相似的人,并基于共同的興趣給出推薦。

協(xié)同過濾系統(tǒng)的高級工作流程如下:

  • 用戶對項(xiàng)目(如電影、書籍)進(jìn)行評分,以表達(dá)他或她對項(xiàng)目的偏好;
  • 系統(tǒng)將評分視為用戶對項(xiàng)目興趣的程度;
  • 系統(tǒng)會將此用戶的評分與其他用戶的評分進(jìn)行匹配,并找到具有最相似評分的人;
  • 系統(tǒng)推薦相似用戶評分較高但尚未被該用戶評分的項(xiàng)目。

通常,協(xié)同過濾系統(tǒng)通過兩個步驟向給定用戶推薦產(chǎn)品:

  • 第1步:尋找與給定用戶共享相同評級模式的人;
  • 第2步:使用步驟1中找到的用戶的評分來計(jì)算給定用戶對產(chǎn)品的評分預(yù)測。

這稱為基于用戶的協(xié)作過濾。這種方法的一個具體實(shí)現(xiàn)是基于用戶的最近鄰算法。

另一種選擇是,基于項(xiàng)目的協(xié)同過濾(例如,對x感興趣的用戶也對y感興趣)以項(xiàng)目為中心的方式工作:

  • 第1步:建立一個項(xiàng)目--項(xiàng)目矩陣的評分關(guān)系對項(xiàng)目;
  • 第2步:通過檢查矩陣并匹配用戶的評分?jǐn)?shù)據(jù),預(yù)測當(dāng)前用戶對產(chǎn)品的評分。

有兩種類型的協(xié)同過濾系統(tǒng):

  • 基于模型
  • 基于內(nèi)存

在一個基于模型的系統(tǒng)中,我們使用不同的機(jī)器學(xué)習(xí)算法開發(fā)模型來預(yù)測用戶對未評分項(xiàng)目的評分。基于模型的協(xié)同過濾算法有很多,如奇異值分解(SVD)、貝葉斯網(wǎng)絡(luò)、聚類模型等。

基于內(nèi)存的系統(tǒng)使用用戶的評分?jǐn)?shù)據(jù)來計(jì)算用戶或項(xiàng)目之間的相似度。這類系統(tǒng)的典型例子是基于鄰域的方法和基于項(xiàng)/基于用戶的 top-N 建議。

本文介紹了如何利用 SVD 模型構(gòu)建一個基于模型的協(xié)同過濾系統(tǒng)。

2、用Python構(gòu)建推薦系統(tǒng)

下面,將給大家詳細(xì)介紹用 Python 構(gòu)建推薦系統(tǒng)的流程。

2.1 安裝庫

有多個Python庫可用于構(gòu)建推薦系統(tǒng)(例如 Python scikit Surprise、基于Spark RDD的協(xié)同過濾API)。我在本文中使用 Python scikit Surprise 庫進(jìn)行演示。

可以按如下方式安裝庫:

pip install scikit-surprise

2.2 加載數(shù)據(jù)

如前所述,我在本文中使用Kaggle Netflix prize數(shù)據(jù)集。有可用于不同目的的多個數(shù)據(jù)文件。本文中使用了以下數(shù)據(jù)文件:

訓(xùn)練數(shù)據(jù):

  • Combined_data_1.txt
  • Combined_data_2.txt
  • Combined_data_3.txt
  • Combined_data_4.txt

電影標(biāo)題數(shù)據(jù)文件:

  • movie_titles.csv

由于訓(xùn)練數(shù)據(jù)集太大,無法在筆記本電腦上處理。 因此,為了方便演示,我僅從每個訓(xùn)練數(shù)據(jù)文件中加載前 100,000 條記錄。

將訓(xùn)練數(shù)據(jù)文件下載到本地計(jì)算機(jī)上之后,可以將每個訓(xùn)練數(shù)據(jù)文件中的前 100,000 條記錄作為Pandas 數(shù)據(jù)幀加載到內(nèi)存中,如下所示:

def readFile(file_path, rows=100000):
    data_dict = {'Cust_Id' : [], 'Movie_Id' : [], 'Rating' : [], 'Date' : []}
    f = open(file_path, "r")
    count = 0
    for line in f:
        count += 1
        if count > rows:
            break
            
        if ':' in line:
            movidId = line[:-2] # remove the last character ':'
            movieId = int(movidId)
        else:
            customerID, rating, date = line.split(',')
            data_dict['Cust_Id'].Append(customerID)
            data_dict['Movie_Id'].append(movieId)
            data_dict['Rating'].append(rating)
            data_dict['Date'].append(date.rstrip("n"))
    f.close()
            
    return pd.DataFrame(data_dict)
df1 = readFile('./data/netflix/combined_data_1.txt', rows=100000)
df2 = readFile('./data/netflix/combined_data_2.txt', rows=100000)
df3 = readFile('./data/netflix/combined_data_3.txt', rows=100000)
df4 = readFile('./data/netflix/combined_data_4.txt', rows=100000)
df1['Rating'] = df1['Rating'].astype(float)
df2['Rating'] = df2['Rating'].astype(float)
df3['Rating'] = df3['Rating'].astype(float)
df4['Rating'] = df4['Rating'].astype(float)

針對訓(xùn)練數(shù)據(jù)的不同部分所產(chǎn)生的不同數(shù)據(jù)幀如下組合:

df = df1.copy()
df = df.append(df2)
df = df.append(df3)
df = df.append(df4)
df.index = np.arange(0,len(df))
df.head(10)
如何用Python構(gòu)建機(jī)器學(xué)習(xí)推薦系統(tǒng)?網(wǎng)易云、愛奇藝也用這種方法

 

接下來我們來把 movie-titles 文件可以作為 Pandas 數(shù)據(jù)幀加載到內(nèi)存中:

df_title = pd.read_csv('./data/netflix/movie_titles.csv', encoding = "ISO-8859-1", header = None, names = ['Movie_Id', 'Year', 'Name'])
df_title.head(10)
如何用Python構(gòu)建機(jī)器學(xué)習(xí)推薦系統(tǒng)?網(wǎng)易云、愛奇藝也用這種方法

 

2.3 訓(xùn)練評估模型

Surprise中的數(shù)據(jù)集模塊提供了從文件、Pandas 數(shù)據(jù)幀或內(nèi)置數(shù)據(jù)集(如ml-100k(MovieLens 100k)加載數(shù)據(jù)的各種不同方法,例如:

  • Dataset.load_builtin()
  • Dataset.load_from_file()
  • Dataset.load_from_df()

在本文中,我使用 load_from_df()方法從 Pandas 數(shù)據(jù)幀加載數(shù)據(jù)。

Surprise中的 Reader 類用于解析包含用戶、項(xiàng)目和用戶對項(xiàng)目的評分文件。默認(rèn)格式是每個評分存儲在訂單用戶項(xiàng)目評分的單獨(dú)一行中。此順序和分隔符可使用以下參數(shù)進(jìn)行配置:

  • line_format 是類似于“ item user rating”的字符串,用于指示字段名稱用空格分隔的數(shù)據(jù)順序;
  • sep 用于指定字段之間的分隔符,例如空格,“,”等;
  • rating_scale 用于指定評分等級。默認(rèn)值為(1,5);
  • skip_lines 用于指示文件開頭要跳過的行數(shù),默認(rèn)值為 0。

本文將使用默認(rèn)設(shè)置,項(xiàng)、用戶、等級分別對應(yīng)于數(shù)據(jù)幀中的 Cust_Id,Movie_Id 和 Rating 列。

Surprise 庫包含了構(gòu)建推薦系統(tǒng)的多個模型/算法的實(shí)現(xiàn),如 SVD、概率矩陣分解(PMF)、非負(fù)矩陣分解(NMF)等,本文使用的是 SVD 模型。

下面的代碼是從 Pandas 數(shù)據(jù)幀中加載數(shù)據(jù)并創(chuàng)建一個 SVD 模型實(shí)例:

from surprise import Reader, Dataset, SVD
from surprise.model_selection.validation import cross_validate
reader = Reader()
data = Dataset.load_from_df(df[['Cust_Id', 'Movie_Id', 'Rating']], reader)
svd = SVD()

產(chǎn)品推薦的數(shù)據(jù)和模型準(zhǔn)備好后,可以使用交叉驗(yàn)證對模型進(jìn)行評估,如下所示:

# 運(yùn)行5倍交叉驗(yàn)證并打印結(jié)果
cross_validate(svd, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)

以下是 SVD 模型交叉驗(yàn)證的結(jié)果:

如何用Python構(gòu)建機(jī)器學(xué)習(xí)推薦系統(tǒng)?網(wǎng)易云、愛奇藝也用這種方法

 

一旦模型被評估到我們滿意的程度,我們就可以使用整個訓(xùn)練數(shù)據(jù)集重新訓(xùn)練模型:

trainset = data.build_full_trainset()
svd.fit(trainset)

2.4 推薦產(chǎn)品

當(dāng)推薦模型經(jīng)過適當(dāng)?shù)挠?xùn)練后,就可以用來進(jìn)行預(yù)測。

例如,給定一個用戶(例如,客戶Id 785314),我們可以使用經(jīng)過訓(xùn)練的模型來預(yù)測用戶對不同產(chǎn)品(即 Movie titles)的評級:

titles = df_title.copy()
titles['Estimate_Score'] = titles['Movie_Id'].apply(lambda x: svd.predict(785314, x).est)

為了向給定用戶推薦產(chǎn)品(即電影),我們可以按預(yù)測收視率的降序?qū)﹄娪傲斜磉M(jìn)行排序,并將前N部電影作為推薦:

titles = titles.sort_values(by=['Estimate_Score'], ascending=False)
titles.head(10)

以下是向客戶 Id 為 785314 的用戶推薦的前 10 部電影:

如何用Python構(gòu)建機(jī)器學(xué)習(xí)推薦系統(tǒng)?網(wǎng)易云、愛奇藝也用這種方法

 

3、總結(jié)

在本文中,我使用了 scikit Surprise 庫和 Kaggle Netflix prize 數(shù)據(jù)集來演示如何使用基于模型的協(xié)作過濾方法在 Python 中構(gòu)建推薦系統(tǒng)。

如本文開頭所述,數(shù)據(jù)集太大,無法在筆記本電腦或任何傳統(tǒng)的個人計(jì)算機(jī)上處理。 因此,出于演示目的,我僅從每個訓(xùn)練數(shù)據(jù)集文件中加載了前 100,000 條記錄。

在實(shí)際應(yīng)用程序的設(shè)置中,我建議將 Spark 與 Koalas 一起使用,或者在 Spark MLLib 中使用Alteraternating Least Squares(ALS)算法來實(shí)現(xiàn)協(xié)作過濾系統(tǒng)并在 Spark 集群上運(yùn)行。

Github 源代碼及項(xiàng)目地址:https://github.com/yzzhang/machine-learning/tree/master/recommender

--END--

本文作者張躍峰博士,原文鏈接:https://towardsdatascience.com/machine-learning-for-building-recommender-system-in-python-9e4922dd7e97

翻譯:未艾信息(www.weainfo.net)

喜歡本文的同學(xué)記得轉(zhuǎn)發(fā)+點(diǎn)贊~

更多內(nèi)容,歡迎大家關(guān)注我們的公眾號:為AI吶喊(weainahan)

分享到:
標(biāo)簽:機(jī)器 學(xué)習(xí) Python
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定