機(jī)器學(xué)習(xí):推薦系統(tǒng)(四. 創(chuàng)建推薦系統(tǒng)框架)

Building the Framework for Our Recommendation System

目錄

  1. 瀏覽推薦系統(tǒng)數(shù)據(jù)集
  2. 以矩陣顯示產(chǎn)品評(píng)價(jià)
    3.通過(guò)預(yù)測(cè)缺少的用戶評(píng)級(jí)推薦
    4.預(yù)測(cè)缺失用戶評(píng)分的簡(jiǎn)單方法

1. 瀏覽推薦系統(tǒng)數(shù)據(jù)集

我們項(xiàng)目的用戶評(píng)論數(shù)據(jù)在一個(gè)名為movie_ratings_data_set.csv的文件中盖矫。我們也有movies.csv中的電影標(biāo)題列表匿情。這兩個(gè)文件都是簡(jiǎn)單的逗號(hào)分隔數(shù)據(jù)诅需,您可以在任何電子表格程序(如Microsoft Excel)中打開這些數(shù)據(jù)。但是數(shù)據(jù)集通常太大而無(wú)法直接打開挽绩,所以我們將使用Python來(lái)預(yù)覽數(shù)據(jù)吆录。我們來(lái)看看view_data.py.

import pandas
import webbrowser
import os

# Read the dataset into a data table using Pandas
data_table = pandas.read_csv("movie_ratings_data_set.csv")

# Create a web page view of the data for easy viewing
html = data_table[0:100].to_html()

# Save the html to a temporary file
with open("data.html", "w") as f:
    f.write(html)

# Open the web page in our web browser
full_filename = os.path.abspath("data.html")
webbrowser.open("file://{}".format(full_filename))

首先,我們使用pandas.read_csv命令將數(shù)據(jù)集加載到數(shù)據(jù)表中琼牧。數(shù)據(jù)表類似于電子表格恢筝。它與電子表格一樣具有列和行,您可以使用電子表格對(duì)數(shù)據(jù)執(zhí)行許多相同的操作巨坊。

接下來(lái)撬槽,我們將抓取前100行的數(shù)據(jù),然后我們將使用pandas的html功能將數(shù)據(jù)轉(zhuǎn)換為網(wǎng)頁(yè)趾撵。pandas提供了很多這樣的輔助功能侄柔,以方便查看您的數(shù)據(jù)共啃。接下來(lái),我們將html數(shù)據(jù)寫出到一個(gè)文件中暂题,然后我們將使用Python的內(nèi)置Web瀏覽器模塊在我們的Web瀏覽器中打開它移剪。這使我們很方便的查看數(shù)據(jù)。讓我們來(lái)看看前100行薪者。右鍵單擊纵苛,選擇運(yùn)行。此數(shù)據(jù)集中的每一行都是由一個(gè)用戶輸入的一個(gè)電影評(píng)級(jí)言津。

第一列是進(jìn)行評(píng)分的用戶的ID攻人。第二列是用戶評(píng)分的電影ID。第三列是用戶給電影的評(píng)價(jià)悬槽。每個(gè)評(píng)分是從一到五怀吻,一是最差的,五是最好的初婆。我們還有第二個(gè)數(shù)據(jù)文件蓬坡,在movies.csv中列出了每個(gè)電影的名稱。讓我們來(lái)看看view_movie_list.py中的代碼磅叛。

import pandas
import webbrowser
import os

# Read the dataset into a data table using Pandas
data_table = pandas.read_csv("movies.csv", index_col="movie_id")

# Create a web page view of the data for easy viewing
html = data_table.to_html()

# Save the html to a temporary file
with open("movie_list.html", "w") as f:
    f.write(html)

# Open the web page in our web browser
full_filename = os.path.abspath("movie_list.html")
webbrowser.open("file://{}".format(full_filename))

這個(gè)代碼幾乎和我們剛剛看到的代碼一樣渣窜。唯一的區(qū)別是我們將索引調(diào)用參數(shù)傳遞給pandas 的read csv函數(shù)。這告訴pandas使用已經(jīng)在數(shù)據(jù)中的字段movie_id作為索引宪躯,而不是添加它自己的索引列。
讓我們運(yùn)行腳本位迂,看看電影列表访雪。


這是所有電影及其數(shù)據(jù)集的列表。每部電影都有一個(gè)ID和一個(gè)標(biāo)題掂林。另外臣缀,我們還為每部電影列出了流派。我們實(shí)際上不會(huì)在建議中使用流派信息泻帮,但是看到這些信息可以更好地了解推薦系統(tǒng)推薦的電影種類精置。當(dāng)你開始一個(gè)新的推薦項(xiàng)目時(shí),最好是直觀地看一下數(shù)據(jù)锣杂,確保你明白你需要使用哪些數(shù)據(jù)脂倦。

2. 以矩陣顯示產(chǎn)品評(píng)價(jià)

我們的電影評(píng)論數(shù)據(jù)集包含每個(gè)評(píng)級(jí)的一行。這是通常收集審查數(shù)據(jù)的格式元莫,但是為了通過(guò)這些數(shù)據(jù)構(gòu)建推薦系統(tǒng)赖阻,我們希望創(chuàng)建一個(gè)矩陣或二維數(shù)組,以顯示哪些用戶已經(jīng)對(duì)哪些電影進(jìn)行了評(píng)級(jí)踱蠢。該矩陣將以每個(gè)用戶為一行火欧,每個(gè)電影為一列。我們來(lái)看看create_review_matrix.py中的代碼。

import pandas as pd
import numpy as np
import os
import webbrowser

# Read the dataset into a data table using Pandas
df = pd.read_csv("movie_ratings_data_set.csv")

# Convert the running list of user ratings into a matrix using the 'pivot table' function
ratings_df = pd.pivot_table(df, index='user_id', columns='movie_id', aggfunc=np.max)

# Create a web page view of the data for easy viewing
html = ratings_df.to_html(na_rep="")

# Save the html to a temporary file
with open("review_matrix.html", "w") as f:
    f.write(html)

# Open the web page in our web browser
full_filename = os.path.abspath("review_matrix.html")
webbrowser.open("file://{}".format(full_filename))

首先苇侵,我們將使用Pandas的read_csv函數(shù)來(lái)加載movie_ratings_data_set.csv文件赶盔。該評(píng)級(jí)對(duì)于每個(gè)單獨(dú)的電影評(píng)論都有一行。為了將其轉(zhuǎn)化為匯總所有電影中的所有評(píng)論的矩陣榆浓,我們需要使用Pandas數(shù)據(jù)透視表功能(pivot_table)于未。
數(shù)據(jù)透視表采用數(shù)據(jù)列表,并對(duì)每個(gè)唯一用戶和我們數(shù)據(jù)集中唯一的影片用一行一列進(jìn)行匯總哀军。如果您在電子表格軟件(如Microsoft Excel)中使用了數(shù)據(jù)透視表沉眶,則其工作原理與此處完全相同。首先我們傳入包含我們想要總結(jié)的數(shù)據(jù)的數(shù)據(jù)框(data frame)杉适。然后谎倔,我們需要告訴Pandas在數(shù)據(jù)透視表中為行或索引使用用戶ID字段,而電影ID是表中的列猿推。
使用數(shù)據(jù)透視表匯總數(shù)據(jù)時(shí)片习,可能會(huì)出現(xiàn)重復(fù)的情況。
如果同一個(gè)用戶看過(guò)同一部電影兩次蹬叭,就會(huì)發(fā)生這種情況藕咏,但給了它兩個(gè)不同的評(píng)級(jí)。所以我們必須通過(guò)告訴Pandas使用哪個(gè)函數(shù)來(lái)聚合重復(fù)的數(shù)據(jù)來(lái)決定如何解決重復(fù)的問(wèn)題秽五。我們將傳入名為aggfunc = np.max的參數(shù)孽查。這告訴Pandas使用NumPy的取最大功能來(lái)處理重復(fù)。取最大的功能將返回最高的數(shù)字坦喘,所以如果一個(gè)用戶對(duì)同一部電影進(jìn)行兩次評(píng)級(jí)盲再,我們將采取較高的評(píng)級(jí)。如果您想要用戶的平均評(píng)分瓣铣,則可以傳入np.mean答朋。最后,我們將把這個(gè)表格轉(zhuǎn)換成HTML并在我們的瀏覽器中打開它棠笑。

讓我們運(yùn)行代碼梦碗。

此表是所有電影中所有評(píng)論的摘要。用戶列在左邊蓖救,電影在上面洪规。例如,我們可以看到循捺,空白區(qū)域是尚未被用戶評(píng)級(jí)的電影淹冰。如果我們滾動(dòng)整個(gè)數(shù)據(jù)集,我們可以看到?jīng)]有一個(gè)用戶對(duì)每一部電影進(jìn)行評(píng)級(jí)巨柒,實(shí)際上大部分?jǐn)?shù)組都是空白的樱拴。我們只有相對(duì)少量的良好數(shù)據(jù)可供使用柠衍。這被稱為稀疏數(shù)據(jù)集。
推薦系統(tǒng)的稀疏數(shù)據(jù)集是正常的晶乔。大多數(shù)用戶只會(huì)查看少量的產(chǎn)品珍坊,所以總是會(huì)有大量的空白數(shù)據(jù),但這些信息足以讓我們開工正罢。

3.通過(guò)預(yù)測(cè)缺少的用戶評(píng)級(jí)來(lái)推薦

讓我們來(lái)看看create_review_matrix_as_csv.py阵漏。

import pandas as pd
import numpy as np

# Read the dataset into a data table using Pandas
df = pd.read_csv("movie_ratings_data_set.csv")

# Convert the running list of user ratings into a matrix using the 'pivot table' function
ratings_df = pd.pivot_table(df, index='user_id', columns='movie_id', aggfunc=np.max)

# Create a csv file of the data for easy viewing
ratings_df.to_csv("review_matrix.csv", na_rep="")

此代碼將生成csv文件。首先我們使用pandas的read_csv函數(shù)加載數(shù)據(jù)翻具。然后我們使用熊貓的pivot_table函數(shù)來(lái)創(chuàng)建審閱矩陣履怯。最后,我們將使用pandas的to_csv函數(shù)將結(jié)果保存為csv文件裆泳。

每個(gè)用戶為一行叹洲,每個(gè)電影為一列。每個(gè)數(shù)字代表用戶輸入的評(píng)論工禾≡颂幔空白表示還沒(méi)有被用戶看過(guò)的電影。試想一下闻葵,如果我們能夠根據(jù)我們所知道的數(shù)字找出填補(bǔ)所有空白空間的方法民泵。例如,讓我們看看用戶3槽畔。我們可以看到栈妆,用戶3對(duì)電影1和電影2給了四顆星,對(duì)電影3給了5顆星厢钧。如果我們可以利用我們所知道的評(píng)分和其他用戶的評(píng)分來(lái)填寫這個(gè)用戶最可能評(píng)價(jià)電影4的數(shù)據(jù)呢鳞尔?一旦我們知道用戶將給予電影的評(píng)級(jí),就知道我們是否應(yīng)該推薦該電影坏快。
如果我們認(rèn)為這個(gè)用戶會(huì)給電影4號(hào)來(lái)個(gè)五星評(píng)級(jí),這是一個(gè)我們一定要推薦給這個(gè)用戶的電影憎夷。所以為了建立一個(gè)推薦系統(tǒng)莽鸿,我們真正需要的是一個(gè)算法,幫助我們根據(jù)我們已經(jīng)知道的數(shù)字來(lái)完成矩陣中所有缺失的空白拾给。如果我們可以填充矩陣中的每一個(gè)空白祥得,用戶就會(huì)給出這部電影的評(píng)分,那么我們就會(huì)知道每一個(gè)用戶需要知道的一切蒋得。

4.預(yù)測(cè)缺失用戶評(píng)分的簡(jiǎn)單方法

如果我們可以填寫用戶評(píng)論矩陣中的所有空白级及,我們將知道每個(gè)用戶如何評(píng)價(jià)每部電影。那么额衙,我們可以使用這些信息來(lái)推薦高度評(píng)價(jià)的電影虹菲。

下面讓我們學(xué)習(xí)如何手動(dòng)完成這個(gè)矩陣,假設(shè)我們有每個(gè)用戶和每部電影的額外信息庄萎。這將教會(huì)我們用來(lái)計(jì)算每個(gè)用戶對(duì)每部電影的興趣的基本思想袱吆。要了解如何預(yù)測(cè)用戶的評(píng)分,讓我們先來(lái)思考一下某人如何決定給予電影什么評(píng)級(jí)撞蚕。每個(gè)人都是獨(dú)一無(wú)二的可能沒(méi)有辦法完全理解某個(gè)評(píng)級(jí)的思維過(guò)程。因此,讓我們假設(shè)一個(gè)用戶的評(píng)級(jí)是一個(gè)特定電影對(duì)該用戶獨(dú)特興趣集的吸引力的反映议经。

這給了我們一個(gè)計(jì)算用戶評(píng)分的方法。首先谴返,我們將創(chuàng)建一個(gè)關(guān)于電影指數(shù)的模型煞肾。然后,我們將制作一個(gè)用戶特定興趣的模型嗓袱。最后籍救,我們可以根據(jù)用戶的興趣與電影的匹配程度來(lái)計(jì)算用戶的評(píng)分。讓我們從電影類型建模開始索抓。
我們可以用什么來(lái)描述不同類型的電影钧忽?讓我們從這五個(gè)開始,一個(gè)動(dòng)作指數(shù)評(píng)級(jí)逼肯,一個(gè)劇情指數(shù)評(píng)級(jí)耸黑,一個(gè)浪漫指數(shù)評(píng)級(jí),一個(gè)文藝指數(shù)評(píng)級(jí)篮幢,和一個(gè)大眾指數(shù)評(píng)級(jí)大刊。
現(xiàn)在我們有一個(gè)屬性列表,我們可以瀏覽我們的數(shù)據(jù)庫(kù)中的電影三椿,并給每個(gè)電影在這些指數(shù)上從-5到5的評(píng)級(jí)缺菌。讓我們從一個(gè)名為[地球大戰(zhàn)](Attack on Earth)片子開始吧。我們假設(shè)這是一個(gè)動(dòng)作和科幻冒險(xiǎn)片搜锰,一個(gè)典型的夏天大片伴郁,所以我們給它的評(píng)級(jí):

動(dòng)作指數(shù):5
劇情指數(shù):-2
浪漫指數(shù):-2
文藝指數(shù):-5
大眾指數(shù):4

第二部電影是關(guān)于一個(gè)慢節(jié)奏劇情的片子[my complicated family],所以我們給它評(píng)級(jí)是:

動(dòng)作指數(shù):5
劇情指數(shù):5
浪漫指數(shù):1
文藝指數(shù):4
大眾指數(shù):5

這些評(píng)級(jí)是主觀的蛋叼,但我們會(huì)盡最大努力在不同的電影中盡可能一致地分級(jí)『父担現(xiàn)在我們有電影的分?jǐn)?shù),我們需要模擬用戶的興趣狈涮。我們使用相同的類別為每個(gè)用戶建模狐胎。我們將根據(jù)每個(gè)用戶的興趣在這些類別中的強(qiáng)度分配給每個(gè)用戶一個(gè)分?jǐn)?shù)。為了得到這些分?jǐn)?shù)歌馍,我們可以給每個(gè)用戶做個(gè)個(gè)性測(cè)驗(yàn)握巢。我們將使用個(gè)性測(cè)驗(yàn)的結(jié)果來(lái)捕捉用戶喜歡在電影中出現(xiàn)的每個(gè)特征。例如松却,如果我們問(wèn)用戶暴浦,“你有多喜歡爆炸場(chǎng)面溅话?他們回答說(shuō):“非常喜歡”,我們可能會(huì)給他們5分在動(dòng)作片上肉渴。
這個(gè)測(cè)驗(yàn)將幫助我們想出一個(gè)用戶的偏好將如何映射到這些屬性的想法公荧。讓我們假設(shè)在給出個(gè)性測(cè)驗(yàn)后,我們得到了這些結(jié)果:

動(dòng)作指數(shù):5
劇情指數(shù):-2
浪漫指數(shù):1
文藝指數(shù):5
大眾指數(shù):5

讓我們看看哪個(gè)電影是這個(gè)用戶的最佳匹配同规。

對(duì)于第一部電影循狰,我們將每個(gè)用戶的評(píng)分乘以電影評(píng)分。這會(huì)給我們每個(gè)屬性的分?jǐn)?shù)券勺。然后我們將這些分?jǐn)?shù)加起來(lái)绪钥,得到總分74分。現(xiàn)在关炼,讓我們?yōu)榈诙侩娪白鐾瑯拥氖虑椤?div id="g7ykgum" class="image-package">

這次程腹,當(dāng)我們把這些屬性分?jǐn)?shù)加在一起,總共得到-79分儒拂。這是最后的結(jié)果寸潦。用戶的興趣與74分的得分相匹配。第二部電影的得分是-79社痛,所以根據(jù)我們簡(jiǎn)單的屬性評(píng)分系統(tǒng)见转,相比第二部電影用戶更喜歡第一部電影,因?yàn)樗咏麄兊钠盟獍АH绻覀優(yōu)槊總€(gè)電影中的每個(gè)用戶重復(fù)這個(gè)過(guò)程斩箫,我們可以計(jì)算出如何估計(jì)我們?cè)u(píng)論矩陣中的每個(gè)評(píng)分.

如果你熟悉線性代數(shù),你可能會(huì)意識(shí)到我們?nèi)绾螌⑦@個(gè)問(wèn)題表示為矩陣乘法撵儿。如果你畢業(yè)的時(shí)候都把所學(xué)的線代知識(shí)還給老師了, 也沒(méi)關(guān)系,跟著我一起來(lái)乘客。在線性代數(shù)術(shù)語(yǔ)中,我們定義了一個(gè)名為U的用戶矩陣淀歇,其中包含用戶屬性易核,這里是5,-2浪默,1牡直,-5和5。

然后浴鸿,我們還定義了一個(gè)電影屬性矩陣M井氢,其中每列包含一個(gè)電影的評(píng)級(jí)弦追。如果我們對(duì)這兩個(gè)矩陣進(jìn)行矩陣乘法岳链,它會(huì)給我們每部電影的總評(píng)分。下面是結(jié)果劲件,


74掸哑,-79.
數(shù)學(xué)運(yùn)算沒(méi)啥變化约急,但現(xiàn)在我們可以使用numpy來(lái)計(jì)算這一行代碼,因?yàn)檫@是一個(gè)標(biāo)準(zhǔn)的矩陣乘法運(yùn)算苗分。Numpy是經(jīng)過(guò)優(yōu)化的, 可以并行計(jì)算這些矩陣厌蔽。

結(jié)語(yǔ)

在本章,我們學(xué)會(huì)了如何估計(jì)用戶喜歡電影的程度摔癣,如果我們知道用戶的興趣以及電影對(duì)這些興趣的吸引程度奴饮。問(wèn)題是很難以同樣的方式為更多的電影和用戶分配屬性評(píng)級(jí)。在下一章中择浊,我們將學(xué)習(xí)如何自動(dòng)提取興趣屬性戴卜,而不必手動(dòng)分配它們.

你的 關(guān)注-收藏-轉(zhuǎn)發(fā) 是我繼續(xù)分享的動(dòng)力!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市琢岩,隨后出現(xiàn)的幾起案子投剥,更是在濱河造成了極大的恐慌,老刑警劉巖担孔,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件江锨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡糕篇,警方通過(guò)查閱死者的電腦和手機(jī)啄育,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)娩缰,“玉大人灸撰,你說(shuō)我怎么就攤上這事∑纯玻” “怎么了浮毯?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)泰鸡。 經(jīng)常有香客問(wèn)我债蓝,道長(zhǎng),這世上最難降的妖魔是什么盛龄? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任饰迹,我火速辦了婚禮,結(jié)果婚禮上余舶,老公的妹妹穿的比我還像新娘啊鸭。我一直安慰自己,他們只是感情好匿值,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布赠制。 她就那樣靜靜地躺著,像睡著了一般挟憔。 火紅的嫁衣襯著肌膚如雪钟些。 梳的紋絲不亂的頭發(fā)上烟号,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音政恍,去河邊找鬼汪拥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛篙耗,可吹牛的內(nèi)容都是我干的迫筑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼宗弯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铣焊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起罕伯,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤曲伊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后追他,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坟募,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年邑狸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懈糯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡单雾,死狀恐怖赚哗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硅堆,我是刑警寧澤屿储,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站渐逃,受9級(jí)特大地震影響够掠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茄菊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一疯潭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧面殖,春花似錦竖哩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春钝荡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舶衬。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工埠通, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逛犹。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓端辱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親虽画。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舞蔽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容