基於漫威系列電影好看程度排序

引伸問題

在選擇電影時,若是熱門電影A有 10000 人觀衆打分,冷門電影B有 100 我的打分,他們的豆瓣評分都是 8.0 分,怎麼比較兩部電影的好壞?平時咱們都有一種感受,不少人去評價,這個東西就更可信,只有一兩我的說好,多是託,那麼感受上是電影A更好。app

再例如《漫威》系列電影中,距離《復仇者聯盟4》上映一週,豆瓣分都是 8.1 分的《鋼鐵俠》和《復仇者聯盟3》,《鋼鐵俠》有 353695 人評價打分,《復仇者聯盟3》有 557491 人評價打分,這兩部電影是否同樣好看?機器學習

貝葉斯平均

截止至 2019/4/27 ,漫威系列 21 部電影按照豆瓣評分以下排序:函數

排名第一的是預售票房破7億《復仇者聯盟4》,準確來講這還不是 很嚴謹 的對比。一個合理的思路是,若是要比較兩部電影的好壞,至少應該請一樣多的觀衆觀看和評分。既然《鋼鐵俠》的觀衆人數偏少,那麼應該設法爲它 「增長」 一些觀衆。學習

貝葉斯平均(Bayesian Model Averaging) 是動態建模中融合集合預報信息的統計後處理方法。通俗來說就是:大數據

可以在不知道結果的狀況下,會本身先估計一個值,而後不斷用新的信息修正,使得它愈來愈接近自身正確的值。spa

貝葉斯平均值公式以下:3d

\[ WR = \frac{v}{v+m}R+\frac{m}{v+m}C=\frac{vR+mC}{v+m} \]code

- WR, 加權得分(weighted rating)
- R, 對象現有平均得分。
- v, 參與爲這個對象打分的人數。
- m, 全局平均每一個對象的評分人數。
- C, 全局平均每一個對象的平均得分。

排序邏輯

合理驗證《漫威》系列電影的好評排序,按照《漫威》電影時間線獲取每一步電影的:電影名、打分的人數、每一個星級的佔比:htm

根據公式獲取每一個電影的平均得分 RmC,計算公式爲:對象

\[ R = average\_stars = \frac{rating\_people*start5*5+rating\_people*start4*4+rating\_people*start3*3+rating\_people*start2*2+rating\_people*start1*1}{rating\_people} \]

\[ m = average(rating\_people) , C = average(average\_stars) \]

獲得最新的 貝葉斯平均排序(rank_bayes) 結果以下所示,和原有的 豆瓣評分排序(rank_stars) 對好比下:

豆瓣分都是 8.1 分的《鋼鐵俠》和《復仇者聯盟3》,《復仇者聯盟3》的 貝葉斯平均得分 比 《鋼鐵俠》好,《復仇者聯盟3》比《鋼鐵俠》好看!

最終的排序是:

《復仇者聯盟4》>《復仇者聯盟3》>《復仇者聯盟》>《鋼鐵俠》>《銀河護衛隊》>《銀河護衛隊2》>《美國隊長2》>《美國隊長3》>《鋼鐵俠3》>《蟻人》>《鋼鐵俠2》>《雷神2》>《雷神3》>《蜘蛛俠:英雄歸來》>《復仇者聯盟2》>《蟻人2》>《無敵浩克》>《雷神》>《驚奇隊長》>《美國隊長》>《奇異博士》>《黑豹》

彩蛋:豆瓣分除以2就是每一個電影的平均得分 R

貝葉斯平均代碼

# 計算對象現有平均分
def average_stars_apply(rating_people,start5,start4,start3,start2,start1):
    average_stars = (rating_people*start5*5+rating_people*start4*4+rating_people*start3*3+rating_people*start2*2+rating_people*start1*1)/rating_people
    return round(average_stars,2)

# 計算貝葉斯平均
def bayes_score_apply(R,v,m,C):
    return (v*R+m*C)/(v+m)

# 主函數
def bayes_score(dataFrame):
    df = dataFrame.copy()
    df["average_stars"] = dataFrame.apply(lambda row: average_stars_apply(row['rating_people'], row['start5'],row['start4'], row['start3'],row['start2'],row['start1']), axis=1)
    m = df.mean().rating_people
    C = df.mean().average_stars
    df["bayes_score"] = df.apply(lambda row: bayes_score_apply(row['average_stars'], row['rating_people'], m, C), axis=1)
    return df

計算結果:

拓展場景

淘寶天貓 的商品評價下,有對某家店鋪的評價等級,在用戶購買量不對等,可是評分卻同樣的狀況下,計算競品 商品店鋪 在用戶眼裏的排序:

隨意找到兩家賣男裝的店鋪A店鋪B,他們的評分以下所示:

他們的店鋪評分同樣都是 4.8 分,店鋪A的評價人數是 450787,店鋪B的評價人數是 198491感受店鋪A評價人多一點感受可信一些 ,那麼有以下條件:

\[ R_A=\frac{450787*0.8984*5+450787*0.0536*4+450787*0.0248*3+450787*0.0058*2+450787*0.0174*1}{450787}=4.8098 , v_A=450787 \]

\[ R_B=\frac{198491*0.9240*5+198491*0.0366*4+198491*0.0172*3+198491*0.0051*2+198491*0.0171*1}{198491}=4.8453 , v_B=198491 \]

\[ m=\frac{450787 +198491}{2}=324639 , C=\frac{4.8098+4.8453}{2}=4.82755 \]

將上述數值帶入公式計算獲得:

\[ WR =\frac{vR+mC}{v+m} \]

\[ WR_A = \frac{v_A*R_A+m*C}{v_A+m} = \frac{450787 *4.8098 +324639 *4.82755}{450787 +324639 }=4.81723119556218 \]

\[ WR_B = \frac{v_B*R_B+m*C}{v_B+m} = \frac{198491 *4.8453 +324639 *4.82755}{198491 +324639 }=4.83428487517443 \]

實時證實:店鋪B優於店鋪A ,店鋪B雖然評價的人數少,可是好評上仍是比店鋪A多,總體比店鋪A好

缺陷

假設:電影A有10個觀衆評分,5個爲五星,5個爲一星;電影B也有10個觀衆評分,都給了三星,這兩部電影在貝葉斯分數是同樣的,即:

\[ R_A=\frac{5*5+5*1}{10}=3 , R_B=\frac{10*3}{10}=3 , m=\frac{10+10}{2}=10, C=\frac{3+3}{2}=3 \]

\[ WR_A = \frac{v_A*R_A+m*C}{v_A+m} = \frac{10*3+10*3}{10+10}=3 \]

\[ WR_B = \frac{v_B*R_B+m*C}{v_B+m} = \frac{10*3+10*3}{10+10}=3 \]

計算結果徹底同樣!

結論

豆瓣評分主要是依據平均分所得,當在評價人數不一樣可是豆瓣分同樣的狀況下,就可使用貝葉斯評分繼續判別電影的好壞

下載

關注公衆號【機器學習和大數據挖掘】,回覆【漫威】便可下載原始數據和代碼

相關文章
相關標籤/搜索