python对电影进行预测评分_TMDb电影数据分析 电影评分预测
前言
本項目展示了問題分解、數(shù)據(jù)清洗、數(shù)據(jù)分析與可視化的過程,最后給出了一個簡單的預(yù)測模型。
數(shù)據(jù)來源是Kaggle提供的Internet Movie Database(TMDb)數(shù)據(jù)集,包括了近五千部電影的信息。
數(shù)據(jù)原地址:https://www.kaggle.com/tmdb/tmdb-movie-metadata
本文的框架如下:
準(zhǔn)備工作
1.1 數(shù)據(jù)載入和預(yù)覽
1.2 數(shù)據(jù)清洗和加工
1.3 數(shù)據(jù)篩選
票房 & 評分分析
2.0 概覽(票房&評分Top 10、變化趨勢)
2.1 類型(不同類型影片的數(shù)量變化趨勢、票房&評分)
2.2 導(dǎo)演(Top 10、票房&評分分布)
2.3 主演(Top 10、票房&評分分布)
2.4 檔期(數(shù)量分布、票房分布)
2.5 小結(jié)
電影評分預(yù)測
3.1 相似度計算
3.2 評分預(yù)測
1 - 準(zhǔn)備工作
1.1 - 數(shù)據(jù)載入與預(yù)覽
# 數(shù)據(jù)分析包導(dǎo)入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')
%matplotlib inline
import warnings
warnings.filterwarnings(action = 'ignore') # 忽略警告
# 數(shù)據(jù)導(dǎo)入,這個數(shù)據(jù)集是標(biāo)準(zhǔn)的csv格式
movies = pd.read_csv('tmdb_5000_movies.csv')
credits = pd.read_csv('tmdb_5000_credits.csv')
# 數(shù)據(jù)預(yù)覽
movies.head(2)
movies.info()
credits.head(2)
credits.info()
可以看到這兩個數(shù)據(jù)集提供了4803部電影的預(yù)算、票房、評分、職員表等諸多信息,而且數(shù)據(jù)比較完整(缺失值很少)。
1.2 - 數(shù)據(jù)清洗和加工
數(shù)據(jù)清洗主要包括查漏補缺、去重、糾錯。
· 查漏補缺:數(shù)據(jù)集中homepage、runtime、tagline有缺失,但它們也不是我們關(guān)心的信息,可以忽略。
· 糾錯:目前看不出有沒有錯誤,在后續(xù)分析中再考慮。
· 去重:movies數(shù)據(jù)集中的id是每部電影的識別碼,以此來看看有沒有重復(fù)數(shù)據(jù):
len(movies.id.unique())
有4803個不重復(fù)的id,可以認為沒有重復(fù)數(shù)據(jù)。
# 數(shù)據(jù)加工主要是對一些字段進行提取和轉(zhuǎn)換。
# 兩個數(shù)據(jù)集都有電影id,用merge將兩個表合并:
movies_credits = movies.merge(credits, left_on='id', right_on='movie_id', how='left')
movies_credits.head(5)
從預(yù)覽中可以觀察到,genres(類型)、keywords(關(guān)鍵詞)、cast(職員表)這些數(shù)據(jù)都是json格式的,
我們實際需要的是name字段對應(yīng)的名字,因此將這些數(shù)據(jù)轉(zhuǎn)為名字列表方便后續(xù)分析。
movies_credits.genres[0]
# 首先使用json.loads 對數(shù)據(jù)進行讀取:
import json
json_columns = ['genres', 'keywords', 'production_companies', 'production_countries', 'cast', 'crew']
for column in json_columns:
movies_credits[column] = movies_credits[column].apply(json.loads)
#將數(shù)據(jù)中name字段對應(yīng)的名字提取出來,用列表推導(dǎo)式可以簡潔地構(gòu)造提取函數(shù):
def extractName(column):
col = [[di['name'] for di in row] for row in column]
return col
ex_name = ['genres', 'production_companies', 'production_countries']
for column in ex_name:
movies_credits[column] = extractName(movies_credits[column])
movies_credits['actors'] = [[di['name'] for di in row[0:4]] for row in movies_credits['cast']] #演員只取前4位
movies_credits['keywords'] = [[di['name'] for di in row[0:10]] for row in movies_credits['keywords']] #關(guān)鍵詞只取前10個
#現(xiàn)在genres等列變?yōu)槊至斜砹?#xff1a;
movies_credits.genres[0]
#導(dǎo)演、編劇和制片人信息儲存在crew一列中,將其提取出來。對于crew中沒有該職位的情況,用空值代替:
def extractDirector(crew, job):
name = ''
for di in crew:
if di['job'] == job:
name = di['name']
break
else:
pass
return name
movies_credits['director'] = [extractDirector(crew, 'Director') for crew in movies_credits.crew]
movies_credits['writer'] = [extractDirector(crew, 'Writer') for crew in movies_credits.crew]
movies_credits['producer'] = [extractDirector(crew, 'producer') for crew in movies_credits.crew]
#提取電影發(fā)布時間(release_date)一列中的年份,方便后續(xù)按年份來統(tǒng)計:
movies_credits['year'] = pd.to_datetime(movies_credits['release_date']).apply(lambda x: x.year)
1.3 - 數(shù)據(jù)篩選
#提取出我們后續(xù)分析需要的變量,去掉空值,看看數(shù)學(xué)統(tǒng)計:
movies = movies_credits[['title_x', 'genres', 'keywords', 'director', 'actors', 'writer', 'producer', 'budget', 'revenue', 'popularity', 'vote_average', 'vote_count', 'production_companies', 'production_countries', 'year']].dropna()
movies.rename(columns={'title_x': 'title'}, inplace = True)
movies.year = movies.year.astype(int)
movies.describe()
評分人數(shù)(vote_count)過低的電影,其評分(vote_average)也不具有統(tǒng)計意義,這里篩選評分人數(shù)大于40的數(shù)據(jù)。其他票房、預(yù)算等為0的數(shù)據(jù)也應(yīng)該篩去。此外,電影上映年份的跨度很大,如果考慮很大的時間跨度,會引入諸多影響因子(例如通貨膨脹對票房金額的影響),不利于發(fā)現(xiàn)規(guī)律,因此有必要篩選以縮小研究范圍。
#這里截取2000年之后的數(shù)據(jù):
movies[movies.year >= 2000].groupby('year').size().plot(kind = 'bar')
從圖上看,每年的電影數(shù)量都在200部左右(實際上映電影數(shù)量更多,說明該數(shù)據(jù)有一定的局限性),但是2016年的數(shù)據(jù)遠小于200部,可以認為該數(shù)據(jù)集并未收集全2016年的數(shù)據(jù)。因此,我們的研究范圍限制在2000年至2015年之間:
movies_15 = movies[(movies.year >= 2000) & (movies.year < 2016) & (movies.vote_count > 40) &(movies.budget * movies.revenue * movies.popularity * movies.vote_average !=0)].reset_index(drop = 'True')
movies_15
2 - 票房 & 評分分析
這個數(shù)據(jù)集提供了豐富的信息,可以從多種維度進行分析。下面我的分析主要是為了回答這個問題:怎樣的電影更有可能成功?成功的定義可以有兩種:高票房或者高評分,而影響成功的因素有不少,例如影片類型、導(dǎo)演、主演、檔期等,我將對它們逐個進行分析。
2.0 - 票房和評分概覽
2.0.1 - 票房Top10
movies_15.sort_values('revenue', ascending=False)[['title', 'revenue', 'budget', 'genres']][0:10]
這10部影片預(yù)算是億級(美元)的,票房是十億級的,屬于高投入高收入的影片。
有8部是動作/科幻片,2部動畫片,顯然電影類型對票房是有影響的,那么是不是動作/科幻片就一定帶來高票房呢?后面會進行相關(guān)分析。
2.0.2 - 票房、預(yù)算和投資回報率(ROI)變化趨勢
b_r = movies_15.groupby('year')['budget','revenue'].sum()
b_r['ROI'] = (b_r.revenue - b_r.budget) / b_r.budget
# 畫圖
fig, axes = plt.subplots(2,1, figsize=(6,6))
b_r.iloc[:, 0:2].plot(kind='bar', ax=axes[0], title='Budget and Revenue')
axes[0].set_ylabel('Dollar')
b_r.ROI.plot(ax=axes[1], title='Evolution of ROI')
fig.tight_layout()
2000年至2015年間,電影制作的經(jīng)費投入并沒有顯著增長,但票房收入呈上升趨勢,相應(yīng)地,ROI從2000年的1.4升到了2015年的2.5,電影行業(yè)正處于穩(wěn)步上升的階段。
2.0.3 - 評分Top 10
movies_15.sort_values('vote_average', ascending=False)[['title', 'vote_average', 'genres']][0:10]
票房Top 10中只有《指環(huán)王:王者歸來》出現(xiàn)在了評分Top 10的榜單上,票房和評分可能沒有很強的關(guān)聯(lián)性。
這10部片的類型也是五花八門,似乎沒有很明顯的特征。
這兩點有待后面進行更深入的分析。
2.0.4 - 評分總體變化趨勢
vote_by_year = movies_15.groupby('year').vote_average.mean()
vote_by_year.plot(title='Evolution of Average Vote')
電影評分隨年份變化的趨勢不明顯,總體在6.25上下小幅度波動
2.0.5 - 票房和評分的影響因素(數(shù)值型變量)
import seaborn as sns
sns.heatmap(movies_15.corr(), annot=True, vmax=1, square=True, cmap='Blues')
票房與預(yù)算、評論數(shù)的相關(guān)性較大,但評論數(shù)和票房一樣,只能等到電影上映后才知道具體數(shù)值。
評分與票房、預(yù)算、熱度、評論數(shù)的相關(guān)性都不大。
2.1 - 影片類型的影響
2.1.1 - 影片類型的變化趨勢
一部電影可歸為多種類型,先統(tǒng)計一下各種類型出現(xiàn)的次數(shù)。通過定義一個計數(shù)函數(shù)來實現(xiàn):
def countN(column):
count = dict()
for row in column:
for ele in row:
if ele in count:
count[ele] += 1
else:
count[ele] = 1
return count
每種類型出現(xiàn)的次數(shù)除以總的影片數(shù),以此作為該種類型的頻數(shù)百分比:
genres = pd.Series(countN(movies_15.genres)).sort_values()
genres_avg = genres / len(movies_15)
genres_avg.plot(kind='barh', title='Frequency of Genres')
影片有18種類型,劇情、喜劇、驚悚、動作這4種類型的影片最多,西部片和紀(jì)錄片最少。
每100部影片中就有約45部屬于劇情片,是大家拍攝電影的首選。
選取前9種類型,觀察它們在這15年間每年的數(shù)量與當(dāng)年影片總數(shù)之比的變化:
genres_by_year = movies_15.groupby('year').genres.sum()
genres_count = pd.DataFrame([], index = genres_by_year.index, columns= genres.index[0:9])
for g in genres_count.columns:
for y in genres_count.index:
genres_count.loc[y,g] = genres_by_year[y].count(g) / len(genres_by_year[y])
genres_count.plot(figsize=(10,6), title = 'Evolution of Movies in 9 Genres')
各種類型的數(shù)量占比有一定的浮動,但總體趨勢變化不大。
劇情片一直是拍攝電影的首選,近年來還有上漲的態(tài)勢。
近年來喜劇片的占比下滑,冒險類的占比升高。
2.1.2 - 不同類型影片的票房
計算方法:票房的影響因素有很多,這里單純考慮類型對票房的影響。對于某種類型,計算所有該類影片的票房,再除以該類影片的數(shù)量。對于預(yù)算也采用同樣的計算方法。
movies_by_genres = pd.DataFrame(0, index = genres.index, columns=['revenue', 'budget', 'vote'])
for i in range(len(movies_15)):
for g in movies_15.genres[i]:
movies_by_genres.loc[g, 'revenue'] += movies_15.revenue[i] # 該類影片的總票房
movies_by_genres.loc[g, 'budget'] += movies_15.budget[i] # 該類型影片的總均預(yù)算
movies_by_genres.loc[g, 'vote'] += movies_15.vote_average[i] #該類型影片的總評分
movies_by_genres = movies_by_genres.div(genres.values, axis=0)
movies_by_genres['ROI'] = (movies_by_genres.revenue - movies_by_genres.budget) / movies_by_genres.budget
#畫圖
fig, axes = plt.subplots(2,1, figsize=(8,8))
movies_by_genres.sort_values('revenue', ascending=False)[['revenue', 'budget']].plot(ax=axes[0], kind='bar', title='Average Revenue and Budget in Different Genres')
movies_by_genres.sort_values('revenue', ascending=False)['ROI'].plot(ax=axes[1], kind='bar', title='ROI in Different Genres')
fig.tight_layout()
票房最高的影片類型是:動畫、奇幻和冒險,其次是家庭、科幻和動作,它們比其余類型影片的票房高了一大截,當(dāng)然它們的預(yù)算也相對較高。
票房高的影片類型,其投資回報率也是不錯的。
劇情片和喜劇雖然熱門(影片數(shù)量多),但投資回報率表現(xiàn)平平。
投資回報率最高的是較為小眾的紀(jì)錄片,如果預(yù)算有限又想獲得高收益,紀(jì)錄片不失為一個好選擇。
西部片、歷史片和戰(zhàn)爭片的投資回報率墊底,拍攝此類影片需謹慎。
影片類型對票房的影響,還可以進行更深入的分析,比如:科幻+劇情的影片是否比單純的科幻片或單純的劇情片有更高的投資回報率?我們算一下看看:
genres_c = pd.Series()
movies_dra_sci = movies_15[movies_15.genres.str.contains('Action', regex=False) & movies_15.genres.str.contains('Science Fiction', regex=False)] #科幻+劇情
genres_c['Drama and Science Fiction'] = (movies_dra_sci.revenue.sum() - movies_dra_sci.budget.sum()) / movies_dra_sci.budget.sum()
movies_dra = movies_15[movies_15.genres.str.contains('Action', regex=False) & ~movies_15.genres.str.contains('Science Fiction', regex=False)] #只有劇情
genres_c['Drama'] = (movies_dra.revenue.sum() - movies_dra.budget.sum()) / movies_dra.budget.sum()
movies_sci = movies_15[~movies_15.genres.str.contains('Action', regex=False) & movies_15.genres.str.contains('Science Fiction', regex=False)] #只有科幻
genres_c['Science Fiction'] = (movies_sci.revenue.sum() - movies_sci.budget.sum()) / movies_sci.budget.sum()
genres_c.plot(kind = 'barh', title = 'ROI')
科幻+劇情的影片確實比單純的科幻片有著更高的投資回報率,因此,拍攝科幻片的時候不能一味地追求特效而忽略的劇本的質(zhì)量,否則會對投資回報率造成負面影響。
其他類型疊加的效果也可以進行類似的分析,這里就不再展開了。
2.1.3 - 不同類型影片的評分
movies_by_genres.sort_values('vote').vote.plot(kind='barh', title = 'Vote in Different Genres')
不同類型影片的評分差距較小,極差約為1分。
紀(jì)錄片、歷史片和戰(zhàn)爭片的評分位列前三。動作片、喜劇片和恐怖片的評分位列倒數(shù)前三。
2.2 - 影片導(dǎo)演的影響
2.2.1 - 導(dǎo)演的票房分布
revenue_of_director = movies_15.groupby('director').revenue.mean() #平均票房
revenue_of_director.hist(bins=100, figsize=(8,3))
典型的長尾分布,極少數(shù)導(dǎo)演的吸金能力特別強,下一節(jié)我們來看下他們是誰。
2.2.2 - 票房最高的導(dǎo)演Top10
revenue_of_director.sort_values().tail(10).plot(kind='barh', title='Directors with Top Revenue')
卡梅隆導(dǎo)演一枝獨秀,由他執(zhí)導(dǎo)的影片的票房遠遠超過了其他導(dǎo)演。第二至四名都是動畫片導(dǎo)演。
從前面的分析我們已得知,動畫片是平均票房最高的影片類型,因此這幾位導(dǎo)演未必真的比拍其他類型影片的導(dǎo)演更有吸金能力,而可能只是有動畫片這個類型的加成。若要排除類型的干擾,可以分類型進行排序。
例如,我們看一下科幻片中吸金能力最強的導(dǎo)演:
revenue_director_genres = movies_15[movies_15.genres.str.contains('Science Fiction', regex=False)].groupby('director').revenue.mean()
revenue_director_genres.sort_values().tail(10).plot(kind='barh', title = 'Director of SF Movies with Top Revenue')
除了卡梅隆,執(zhí)導(dǎo)《鋼鐵俠3》的沙恩布萊克等人也是較為優(yōu)秀的科幻片導(dǎo)演。
2.2.3 - 導(dǎo)演的評分分布
vote_of_director = movies_15.groupby('director').vote_average.mean() #平均評分
vote_of_director.hist()
導(dǎo)演的評分近似正態(tài)分布,在6-7分之間的人最多。
2.2.4 - 評分最高的導(dǎo)演Top10
vote_of_director.sort_values().tail(10).plot(kind='barh', title='Directors with Top Vote')
在評分方面,排名前10的導(dǎo)演差距比較小,他們執(zhí)導(dǎo)的電影的評分在8分左右。
2.3 - 影片主演的影響
2.3.1 - 主演的票房分布
#這里不考慮動畫片配音,因此把動畫片先排除
movies_noani = movies_15[~movies_15.genres.str.contains('Animation', regex=False)].reset_index(drop='True')
我們知道電影主演對票房的貢獻有輕重之分,如果忽略這一點,使用和電影類型一樣的計算方法,則計算結(jié)果可能會顯示常演配角的人比常演主角的人的票房更高。這里嘗試通過一個加權(quán)系數(shù)體現(xiàn)這個區(qū)別。
#我們只考慮前4位主演,每位主演對票房的貢獻按下面的列表來計算:
actors = pd.Series(countN(movies_noani.actors)).sort_values()
movies_by_actors = pd.DataFrame(0, index= actors.index, columns=['revenue', 'vote'])
#按不同權(quán)重統(tǒng)計演員的票房:
r4 = [0.4, 0.3, 0.2, 0.1] #如果有4位主演,按此加權(quán),以下類似
r3 = [0.4, 0.3, 0.3]
r2 = [0.6, 0.4]
r1 = [1]
r = [r1, r2, r3, r4]
for i in range(len(movies_noani)):
actorlist = movies_noani.actors[i][0:4]
for j in range(len(actorlist)):
movies_by_actors.loc[actorlist[j], 'revenue'] += movies_noani.revenue[i] * r[len(actorlist)-1][j] #一個演員的總票房
movies_by_actors.loc[actorlist[j], 'vote'] += movies_noani.vote_average[i] # 一個演員的總評分
movies_by_actors = movies_by_actors.div(actors.values, axis=0) #求出平均值
movies_by_actors.revenue.hist(bins=100)
同樣是長尾分布,演員之間的票房差距沒有導(dǎo)演之間的那么大。
2.3.2 - 票房最高的主演Top 10
movies_by_actors.revenue.sort_values().tail(10).plot(kind='barh')
參演電影票房最高的是飾演哈利波特的丹尼爾,緊隨其后的是出演了阿凡達的薩姆和出演了指環(huán)王的伊利亞伍德。
2.3.3 演員的評分分布
movies_by_actors.vote.hist()
與導(dǎo)演的情況類似,多數(shù)人的評分在6-7分之間。
2.3.4 - 評分最高的演員Top 10
movies_by_actors.vote.sort_values().tail(10).plot(kind = 'barh')
前10名的差距不大,排名榜首的是出演了《爆裂鼓手》的奧斯汀·斯托維爾。
2.4 - 檔期的影響
2.4.1 - 檔期的分布
movies_15['month'] = pd.to_datetime(movies_credits['release_date']).apply(lambda x: x.month)
movies_15['day'] = pd.to_datetime(movies_credits['release_date']).apply(lambda x: x.day)
movies_15.month.hist()
電影的出版方最喜歡在12月發(fā)布新片,其次是1月份。這兩個月份的競爭會比較激烈。
4月和5月電影的上映數(shù)量是最少的,競爭最小。
# 看看12月份每一天的上映數(shù)量
movies_15[movies_15.month == 12].day.hist()
圣誕節(jié)這一天上映的電影數(shù)量最多,在圣誕節(jié)前的兩個星期競爭就開始變得激烈了。
2.4.2 - 票房與檔期的關(guān)系
# 計算每個月單部影片的平均票房:
revenue_month = movies_15.groupby('month').revenue.sum() / movies_15.groupby('month').size()
revenue_month.plot(kind='bar', title='Average Revenue per Month')
5月份的電影的平均票房最高,1月份的平均票房最低。
4月和5月上映的電影數(shù)量少,平均票房高,是新電影安排檔期的最佳選擇。
2.4.3 - 評分與檔期的關(guān)系
movies_15.boxplot(column='vote_average', by='month', figsize=(6,6))
每個月的評分都在6.5左右,受月份的影響很小。
2.5 - 小結(jié)
電影的投資回報率在穩(wěn)步上升,至2015年約為2.5倍,電影行業(yè)前景光明。
電影票房與評分的相關(guān)性不大。
動畫片是平均票房最高的影片類型,但位于票房最頂端的往往是科幻+動作片。劇情片數(shù)量最多,但票房表現(xiàn)平平。
如果預(yù)算有限又想獲得高收益,紀(jì)錄片是非常好的選擇。
4月和5月是上映影片的最佳檔期,競爭小,容易獲得高票房。
3 - 評分預(yù)測期
在這一節(jié)我們嘗試構(gòu)造一個評分的預(yù)測器。為什么這里不做票房預(yù)測器呢?因為票房還需要考慮大環(huán)境(經(jīng)濟環(huán)境、電影行業(yè)趨勢)的影響,基于這個數(shù)據(jù)集提供的數(shù)據(jù),對評分可以進行更準(zhǔn)確的預(yù)測。
預(yù)測思路:假設(shè)評分的主要影響因素是影片類型、導(dǎo)演和主演,對于待預(yù)測的影片,篩選出這3個因素與之相似程度最高的5部影片,計算它們的平均評分,作為待預(yù)測影片的評分。
3.1 - 相似程度計算
計算方法:以類型為例,假設(shè)現(xiàn)有3種影片類型(科幻、動作、劇情),A影片為科幻+動作,B影片為動作,構(gòu)造一個二元數(shù)組來表示影片的類型,
A影片為[1, 1, 0],B影片為[0, 1, 0]。兩部影片的相似程度可以用它們的向量夾角(cos(A, B))來表示,值越大說明越不相似。
#首先對于每部影片都構(gòu)造二元數(shù)組表示類型、導(dǎo)演和主演:
def binary(wordlist0, wordlist):
binary = []
for word in wordlist0.index:
if word in wordlist:
binary.append(1)
else:
binary.append(0)
return binary
movies_15['genres_bin'] = [binary(genres, x) for x in movies_15.genres] #影片類型的二元數(shù)組
directors = movies_15.groupby('director').size().sort_values(ascending=False)
movies_15['director_bin'] = [binary(directors, x) for x in movies_15.director] #影片導(dǎo)演的二元數(shù)組
actors = pd.Series(countN(movies_15.actors)).sort_values(ascending=False)
movies_15['actors_bin'] = [binary(actors, x) for x in movies_15.actors]# 影片主演的二元數(shù)組
# 定義一個函數(shù)計算兩部影片的夾角(即不相似度):
from scipy import spatial
def angle(movie1, movie2):
dis_tot = 0
iterlist = [[movie1.genres_bin, movie2.genres_bin],
[movie1.director_bin, movie2.director_bin],
[movie1.actors_bin, movie2.actors_bin]]
for b1, b2 in iterlist:
if(1 not in b1) or (1 not in b2):
dis = 1
else:
dis = spatial.distance.cosine(b1, b2)
dis_tot += dis
return dis_tot
找3部影片試驗一下距離計算的效果。movies_15數(shù)據(jù)集中,第1部影片是《阿凡達》,第6部影片是《蜘蛛俠3》,第7部影片是《長發(fā)公主》
angle(movies_15.iloc[0], movies_15.iloc[5]) #《阿凡達》 與《蜘蛛俠3》 的夾角
angle(movies_15.iloc[0], movies_15.iloc[6]) #《阿凡達》 與《長發(fā)公主》 的夾角
計算結(jié)果表明《阿凡達》與《蜘蛛俠3》更相似,實際也正是這樣,因為他們都是動作片。
3.2 - 評分預(yù)測
定義一個函數(shù),對于給定的一部影片,計算它與movies_15中所有影片的夾角,選出相似度最高的5部計算評分平均值:
def predictor(new_movie):
movie_bin = pd.Series()
movie_bin['genres_bin'] = binary(genres, new_movie['genres'])
movie_bin['director_bin'] = binary(directors, new_movie['director'])
movie_bin['actors_bin'] = binary(actors, new_movie['actors'])
vote = movies_15.copy()
vote['angle'] = [angle(vote.iloc[i], movie_bin) for i in range(len(vote))]
vote = vote.sort_values('angle')
vote_avg = np.mean(vote.vote_average[0:5])
return vote_avg
#《正義聯(lián)盟》是2017年上映的電影,不在這個數(shù)據(jù)集中,我們來預(yù)測一下它的評分吧!將它的類型、導(dǎo)演和演員記入一個字典中:
Justice_league = {'genres': ['Action', 'Adventure', 'Fantasy', 'Science Fiction'], 'director': ['Zack Snyder'], 'actors': ['Ben Affleck', 'Henry Cavill', 'Amy Adams', 'Gal Gadot', 'Ezra Miller']}
predictor(Justice_league)
IMDb上《正義聯(lián)盟》的評分是6.6分,我們的預(yù)測值6.64可以說是非常準(zhǔn)確了!
# 《敦刻爾克》也是2017年才上映的電影,不在這個數(shù)據(jù)集中,我們來預(yù)測一下它的評分:
Dunkirk = {'genres': ['Action', 'Drama', 'History', 'Thriller', 'War'], 'director': ['Christopher Nolan'], 'actors': ['Fionn Whitehead', 'Damien Bonnard', 'Aneurin Barnard', 'Lee Armstrong', 'James Bloor']}
predictor(Dunkirk)
IMDb上《敦刻爾克》的評分是8.0分,我們的預(yù)測值是7.88,準(zhǔn)確度還是挺高的。
# 古墓麗影 2018上映, IMDb上的評分是 6.4
Tomb_Raider = {'genres': ['Action', 'Adventure', 'Drama'], 'director': ['Roar Uthaug'], 'actors':['Alicia Vikander', 'Dominic West', 'Walton Goggins', 'Daniel Wu', 'Kristin Scott Thomas']}
predictor(Tomb_Raider)
《古墓麗影》IMDb上的評分是 6.4,我們的預(yù)測值是6.54
總結(jié)
以上是生活随笔為你收集整理的python对电影进行预测评分_TMDb电影数据分析 电影评分预测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的输入输出流
- 下一篇: python游戏编程实战教程_关于游戏编