怎么用Python來搭建一個(gè)簡單的推薦系統(tǒng)-創(chuàng)新互聯(lián)

這篇文章主要介紹了怎么用Python來搭建一個(gè)簡單的推薦系統(tǒng),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)公司長期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為儀隴企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),儀隴網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

我們會(huì)使用Movielens構(gòu)建一個(gè)基于item的簡易的推薦系統(tǒng)。在開始前,第一件事就是導(dǎo)入pandas和numPy。

import pandas as pd import numpy as np import warnings warnings.filterwarnings('ignore')

接下來,我們使用pandas read_csv()加載數(shù)據(jù)集。數(shù)據(jù)集由制表符分隔,所以我們將\ t傳遞給sep參數(shù)。然后,使用names參數(shù)傳入列名。

df = pd.read_csv('u.data', sep='\t', names=['user_id','item_id','rating','titmestamp'])

接下來查看表頭,檢查一下正在處理的數(shù)據(jù)。

df.head()

如果我們能夠看到電影的標(biāo)題而不僅僅是ID,那再好不過了。之后加載電影標(biāo)題并把它與此數(shù)據(jù)集合并。

movie_titles = pd.read_csv('Movie_Titles') movie_titles.head()

由于item_id列相同,我們可以在此列上合并這些數(shù)據(jù)集。

df = pd.merge(df, movie_titles, on='item_id') df.head()

數(shù)據(jù)集中的每一列分部代表:

  • user_id - 評(píng)級(jí)電影的用戶的ID。

  • item_id- 電影的ID。

  • rating - 用戶為電影提供的評(píng)級(jí),介于1和5之間。

  • timestamp - 電影評(píng)級(jí)的時(shí)間。

  • title - 電影標(biāo)題。

使用describe或info命令,就可以獲得數(shù)據(jù)集的簡要描述。如果想要真正了解正在使用的數(shù)據(jù)集的話,這一點(diǎn)非常重要。

df.describe()

可以看出,數(shù)據(jù)集共有100003條記錄,電影的平均評(píng)分介于3.52-5之間。

現(xiàn)在我們?cè)賱?chuàng)建一個(gè)dataframe,其中包含每部電影的平均評(píng)分和評(píng)分?jǐn)?shù)量。之后,這些評(píng)分將用來計(jì)算電影之間的相關(guān)性。相關(guān)性是一種統(tǒng)計(jì)指標(biāo),表示兩個(gè)或多個(gè)變量一起波動(dòng)的程度。相關(guān)系數(shù)越高,電影越為相似。

以下例子將使用Pearson相關(guān)系數(shù) (Pearson correlation coefficient),該數(shù)字介于-1和1之間,1表示正線性相關(guān),-1表示負(fù)相關(guān), 0表示沒有線性相關(guān)。也就是說,具有零相關(guān)性的電影完全不相似。

我們會(huì)使用pandas groupby 功能來創(chuàng)建dataframe。按照標(biāo)題對(duì)數(shù)據(jù)集進(jìn)行分組,并計(jì)算其平均值獲得每部電影的平均評(píng)分。

ratings = pd.DataFrame(df.groupby('title')['rating'].mean()) ratings.head()

接下來我們創(chuàng)建number_of_ratings列,這樣就能看到每部電影的評(píng)分?jǐn)?shù)量。完成這步操作后,就可以看到電影的平均評(píng)分與電影獲得的評(píng)分?jǐn)?shù)量之間的關(guān)系。五星級(jí)電影很有可能只被一個(gè)人評(píng)價(jià),而這種五星電影在統(tǒng)計(jì)上是不正確的。

因此,在構(gòu)建推薦系統(tǒng)時(shí),我們需要設(shè)置閾值。我們可以使用pandas groupby功能來創(chuàng)建新列,然后按標(biāo)題欄分組,使用計(jì)數(shù)函數(shù)計(jì)算每部電影的評(píng)分。之后,便可以使用head()函數(shù)查看新的dataframe。

rating ['number_of_ratings'] = df.groupby('title')['rating'].count() ratings.head()

接下來我們使用pandas繪制功能來繪制直方圖,顯示評(píng)級(jí)的分布:

import matplotlib.pyplot as plt %matplotlib inline ratings['rating'].hist(bins=50)

可以看到,大多數(shù)電影的評(píng)分都在2.5-4之間。通過類似的方法還可以將number_of_ratings列可視化。

ratings['number_of_ratings'].hist(bins=60)

從上面的直方圖中可以清楚地看出,多數(shù)電影的評(píng)分都很低,評(píng)分最高的電影是一些非常有名的電影。

現(xiàn)在讓我們?cè)賮砜匆幌码娪霸u(píng)級(jí)與評(píng)分?jǐn)?shù)量之間的關(guān)系。我們可以使用seaborn繪制散點(diǎn)圖,然后使用jointplot()函數(shù)執(zhí)行此操作。

import seaborn as sns sns.jointplot(x='rating', y='number_of_ratings', data=ratings)

從圖中我們可以看出,電影平均評(píng)分與評(píng)分?jǐn)?shù)量之間呈正相關(guān)關(guān)系,電影獲得的評(píng)分?jǐn)?shù)量越多,其平均評(píng)分越高。

創(chuàng)建基于item的簡易推薦系統(tǒng)

接下來我們會(huì)快速創(chuàng)建一個(gè)基于item的簡單的推薦系統(tǒng)。

首先,我們需要將數(shù)據(jù)集轉(zhuǎn)換為矩陣,電影標(biāo)題為列,user_id為索引,評(píng)級(jí)為值。完成這一步,我們將得到一個(gè)dataframe,其中列是電影標(biāo)題,行是用戶ID。每列代表所有用戶對(duì)電影的所有評(píng)級(jí)。評(píng)級(jí)為NAN表示用戶未對(duì)這部電影評(píng)分。

我們可以用該矩陣來計(jì)算單個(gè)電影的評(píng)級(jí)與矩陣中其余電影的相關(guān)性,該矩陣可以通過pandas pivot_table實(shí)現(xiàn)。

movie_matrix = df.pivot_table(index ='user_id',columns ='title',values ='rating') movie_matrix.head()

接下來讓我們找到評(píng)分?jǐn)?shù)量最多的電影,并選擇其中的兩部電影。然后使用pandas sort_values并將升序設(shè)置為false,以便顯示評(píng)分最多的電影。然后使用head()函數(shù)來查看評(píng)分?jǐn)?shù)目最多的前十部電影。

ratings.sort_values('number_of_ratings', ascending=False).head(10)

假設(shè)一個(gè)用戶曾看過Air Force One(1997)和Contact(1997),我們想根據(jù)這兩條觀看記錄向該用戶推薦其他類似的電影,那么這一點(diǎn)可以通過計(jì)算這兩部電影的評(píng)級(jí)與數(shù)據(jù)集中其他電影的評(píng)級(jí)之間的相關(guān)性來實(shí)現(xiàn)。第一步是創(chuàng)建一個(gè)dataframe,其中包含來自movie_matrix的這些電影的評(píng)級(jí)。

AFO_user_rating = movie_matrix['Air Force One (1997)'] contact_user_rating = movie_matrix['Contact (1997)']

Dataframe可以顯示user_id和這兩部電影的評(píng)分。

AFO_user_rating.head() contact_user_rating.head()

使用pandas corwith功能計(jì)算兩個(gè)dataframe之間的相關(guān)性。有了這一步,就能夠獲得每部電影的評(píng)級(jí)與Air Force One電影的評(píng)級(jí)之間的相關(guān)性。

similar_to_air_force_one = movie_matrix.corrwith(AFO_user_rating)

可以看到,Air Force One電影和Till There Was You(1997)之間的相關(guān)性是0.867。這表明這兩部電影之間有很強(qiáng)的相似性。

similar_to_air_force_one.head()

還可以計(jì)算Contact(1997)的評(píng)級(jí)與其他電影評(píng)級(jí)之間的相關(guān)性,步驟同上:

similar_to_contact = movie_matrix.corrwith(contact_user_rating)

可以從中發(fā)現(xiàn),Contact(1997)和Till There Was You(1997)之間存在非常強(qiáng)的相關(guān)性(0.904)。

similar_to_contact.head()

前邊已經(jīng)提到,并非所有用戶都對(duì)所有電影進(jìn)行了評(píng)分,因此,該矩陣中有很多缺失值。為了讓結(jié)果看起來更有吸引力,刪除這些空值并將相關(guān)結(jié)果轉(zhuǎn)換為dataframe。

corr_contact = pd.DataFrame(similar_to_contact, columns=['Correlation']) corr_contact.dropna(inplace=True) corr_contact.head()corr_AFO = pd.DataFrame(similar_to_air_force_one, columns=['correlation']) corr_AFO.dropna(inplace=True) corr_AFO.head()

上面這兩個(gè)dataframe分別展示了與Contact(1997)和Air Force One(1997)電影最相似的電影。然而,問題出現(xiàn)了,有些電影的實(shí)際質(zhì)量非常低,但可能因?yàn)橐粌晌挥脩艚o他們5星評(píng)級(jí)而被推薦。

這個(gè)問題可以通過設(shè)置評(píng)級(jí)數(shù)量的閾值來解決。從早期的直方圖中看到,評(píng)級(jí)數(shù)量從100開始急劇下降。因此可以將此設(shè)置為閾值,但是也可以考慮其他合適的值。為此,我們需要將兩個(gè)dataframe與rating datframe中的number_of_ratings列一起加入。

corr_AFO = corr_AFO.join(ratings['number_of_ratings']) corr_contact = corr_contact.join(ratings['number_of_ratings'])corr_AFO.head()corr_contact.head()

現(xiàn)在,我們就能得到與Air Force One(1997)最相似的電影,并把這些電影限制在至少有100條評(píng)論的電影中,然后可以按相關(guān)列對(duì)它們進(jìn)行排序并查看前10個(gè)。

corr_AFO [corr_AFO ['number_of_ratings']> 100] .sort_values(by ='correlation',ascending = False).head(10)

我們注意到Air Force One(1997)與自身相關(guān)性最高,這并不奇怪。下一部與Air Force One(1997)最相似的電影是Hunt for Red October,相關(guān)系數(shù)為0.554。

顯然,通過更改評(píng)論數(shù)量的閾值,我們可以按之前的方式得到不同的結(jié)果。限制評(píng)級(jí)數(shù)量可以讓我們獲得更好的結(jié)果。

現(xiàn)在重復(fù)上邊的步驟,可以看到與Contact(1997)電影最相關(guān)的電影:

corr_contact [corr_contact ['number_of_ratings']> 100] .sort_values(by ='Correlation',ascending = False).head(10)

與Contact(1997)最相似的電影是Philadelphia(1993),相關(guān)系數(shù)為0.446,有137個(gè)評(píng)級(jí)。所以,如果有人喜歡Contact(1997),我們可以向他們推薦上述電影。

以上是構(gòu)建推薦系統(tǒng)的一種非常簡單的方法,但并不符合行業(yè)標(biāo)準(zhǔn)。后續(xù)的話我們可以通過構(gòu)建基于存儲(chǔ)器的協(xié)同過濾系統(tǒng)來改進(jìn)該系統(tǒng)。在這種情況下,將數(shù)據(jù)劃分為訓(xùn)練集和測試集,使用諸如余弦相似性來計(jì)算電影之間的相似性;或者構(gòu)建基于模型的協(xié)作過濾系統(tǒng),然后使用Root Mean Squared Error(RMSE)等技術(shù)評(píng)估模型。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“怎么用Python來搭建一個(gè)簡單的推薦系統(tǒng)”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

標(biāo)題名稱:怎么用Python來搭建一個(gè)簡單的推薦系統(tǒng)-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://bm7419.com/article0/ceoiio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、靜態(tài)網(wǎng)站電子商務(wù)、ChatGPT、網(wǎng)站設(shè)計(jì)公司、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司