目錄
- 瀏覽推薦系統(tǒng)數(shù)據(jù)集
- 以矩陣顯示產(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í)行許多相同的操作巨坊。
第一列是進(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并在我們的瀏覽器中打開它棠笑。
此表是所有電影中所有評(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
讓我們看看哪個(gè)電影是這個(gè)用戶的最佳匹配同规。
劇情指數(shù):-2
浪漫指數(shù):1
文藝指數(shù):5
大眾指數(shù):5
對(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">