張濤,陳瀟瀟
(北方工業(yè)大學(xué), 北京,100144)
隨著社會經(jīng)濟的發(fā)展,社會生活水平提高,看電影已經(jīng)成為一項主要的娛樂活動。據(jù)國家統(tǒng)計局統(tǒng)計,2021中國票房近470億,幾乎是2019年中國票房的5倍[1]。盡管大多數(shù)公司都想從這個巨大的市場中分一杯羹,但只有幾部熱門電影實現(xiàn)了盈利,其他電影則在虧損[2]。因此,如何準(zhǔn)確地預(yù)測電影票房,降低投資風(fēng)險,避免公司因投資失敗而遭受巨大損失已成為亟需解決的問題。
隨著人工智能技術(shù)的快速發(fā)展,越來越多的學(xué)者將機器學(xué)習(xí)等數(shù)據(jù)挖掘技術(shù)應(yīng)用于電影票房預(yù)測中,郭萱[3]以2014年-2016年的173部影片為研究對象,引入了基于條件推斷樹的隨機森林模型對電影票房進行預(yù)測,研究結(jié)果表明,基于條件推斷樹的隨機森林預(yù)測模型比傳統(tǒng)的隨機森林預(yù)測模型準(zhǔn)確度更高。楊朝強[4]分別訓(xùn)練了LSTM模型和BP神經(jīng)網(wǎng)絡(luò)模型,得出了LSTM模型的平均相對誤差比BP神經(jīng)網(wǎng)絡(luò)模型的平均相對誤差要低的結(jié)論。李振興[5]的研究結(jié)果表明,演員是影響電影票房的關(guān)鍵因素。甘雨涵[6]爬取了2016年全年在國內(nèi)上映的150部電影的豆瓣評論信息,通過分析評論中的情感傾向,證明了口碑對電影票房的重要性。
在前人研究的基礎(chǔ)上,本文首先分別建立了XGBoost、LightGBM、CatBoost、隨機森林(Random Forest)和支持向量回歸(support vector Regression)票房預(yù)測模型,并通過optuna框架對五個票房預(yù)測模型的超參數(shù)進行優(yōu)化,提高單個票房預(yù)測模型的預(yù)測精確度;然后,使用測試集,通過加權(quán)stacking算法進行了電影票房預(yù)測,并與傳統(tǒng)的票房預(yù)測模型進行了對比,驗證了模型的有效性。
為了有效評估模型的預(yù)測效果,本文采用了平均絕對百分比誤差(MAPE)、均方誤差 (MSE)、均方根誤差(RMSE)以及kaggle上的評分這四項指標(biāo)作為模型評價指標(biāo)。
平均絕對百分比誤差(MAPE)表示的是真實值與預(yù)測值之差的絕對值占真實值之比。MAPE值越小,模型預(yù)測效果越好。具體公式如下:
式中:n為樣本數(shù),為預(yù)測值,yi為真實值。
均方誤差(MSE)是指預(yù)測值與真實值的距離的平方和的平均數(shù),MSE的值越小,模型預(yù)測效果越好,具體公式如下:
均方根誤差(RMSE)是均方誤差的算數(shù)平方根,RMSE的值越小,模型預(yù)測效果越好,具體公式如下:
Kaggle上的評分是指當(dāng)用戶提交對測試集的預(yù)測結(jié)果時,kaggle對測試集的預(yù)測結(jié)果的打分,kaggle上的評分越低,排名越靠前,模型預(yù)測效果越好。
Sklearn 的GridSearchCV函數(shù)可通過網(wǎng)格搜索與交叉驗證的方式來進行超參數(shù)優(yōu)化,但由于其會遍歷給定范圍內(nèi)的所有超參數(shù)組合,所以非常耗時,特別是當(dāng)超參數(shù)的數(shù)量增長時,網(wǎng)格搜索的時間復(fù)雜度將呈現(xiàn)指數(shù)增長。
Optuna 是一個完全用 Python 編寫的自動超參數(shù)調(diào)整框架。專為機器學(xué)習(xí)而設(shè)計,可以與 PyTorch、TensorFlow、Keras、SKlearn 等其他框架一起使用。
Optuna 的優(yōu)化程序中只有三個核心的概念,分別為目標(biāo)函數(shù)(objective),單次試驗(trial),和研究(study)。其中目標(biāo)函數(shù)負責(zé)定義待優(yōu)化函數(shù)并指定超參數(shù)范圍,單詞試驗對應(yīng)著目標(biāo)函數(shù)的單次執(zhí)行,而研究則負責(zé)管理優(yōu)化,決定優(yōu)化的方式,記錄總試驗的次數(shù)、試驗結(jié)果等。
stacking 算法一般采用兩層結(jié)構(gòu),第一層的學(xué)習(xí)器被稱作初級學(xué)習(xí)器,也被稱為基學(xué)習(xí)器,常用作對經(jīng)過處理后的原始樣本的訓(xùn)練和預(yù)測,第二層的學(xué)習(xí)器為次級學(xué)習(xí)器,也被稱為元學(xué)習(xí)器,用于結(jié)合第一層的驗證集與測試集的預(yù)測結(jié)果再次進行學(xué)習(xí)。
Stacking算法能夠結(jié)合每個基學(xué)習(xí)器的優(yōu)點,提高模型的整體預(yù)測精度。Stacking算法的流程圖如圖1所示,假設(shè)第一層有兩個基學(xué)習(xí)器,每個基學(xué)習(xí)器分別對原始訓(xùn)練集進行訓(xùn)練, 得到驗證集的預(yù)測結(jié)果v1 和v2。對整個測試集的進行五次預(yù)測,將結(jié)果進行相加取平均得到測試集結(jié)果T1和T2。水平連接V1和V2得到新訓(xùn)練集TrainNew,水平連接T1和T2得到新的測試集Testew,將新訓(xùn)練集Trainnew與原始訓(xùn)練集一同放入元學(xué)習(xí)器中進行訓(xùn)練,將最終所得的元學(xué)習(xí)器對TestNew進行測試后即可得到測試集的最終預(yù)測結(jié)果。
圖1 stacking算法的流程圖
在傳統(tǒng)stacking算法中,在第二層進行集成時,僅僅是將測試集的預(yù)測結(jié)果進行的平均處理,這樣會平均掉表現(xiàn)好的模型的訓(xùn)練結(jié)果。因此,可對次級學(xué)習(xí)器的每一折預(yù)測結(jié)果進行加權(quán)處理,從而提高模型在測試集上的表現(xiàn),具體的示意圖如圖2所示,其中wi即為權(quán)值,權(quán)值為每一折驗證集的預(yù)測值與真實值的誤差,wi的計算方式如公式(4)所示,式中mape的定義如公式(1)所示。
圖2 次學(xué)習(xí)器中精度加權(quán)的改進
本文選取的是Kaggle競賽中的數(shù)據(jù),數(shù)據(jù)來自于TMDB電影數(shù)據(jù)庫,數(shù)據(jù)集共有9399條,其中有5001條訓(xùn)練集數(shù)據(jù),4398條測試集數(shù)據(jù)。數(shù)據(jù)集共包括電影Id、系列電影名、電影預(yù)算、電影類型、電影官方主頁、TMDB官網(wǎng)id、原始語言、電影原始名稱、電影簡介、流行程度、海報鏈接、出品公司、出品國家、發(fā)行日期、電影時長、電影語言、電影狀態(tài)、宣傳語、電影名稱、電影關(guān)鍵詞、演員、導(dǎo)演和電影總收入這二十三個特征。其中,電影總收入為預(yù)測目標(biāo)變量。
由于Kaggle提供的數(shù)據(jù)為未經(jīng)過處理的原始數(shù)據(jù),其中包含有文本類型的數(shù)據(jù),不能將其直接輸入模型訓(xùn)練,需要進行數(shù)據(jù)預(yù)處理,數(shù)據(jù)預(yù)處理包括正態(tài)化處理、數(shù)值化處理以及標(biāo)準(zhǔn)化處理。
(1)正態(tài)化處理
正態(tài)化處理是指將不符合正態(tài)分布的特征數(shù)據(jù)轉(zhuǎn)換成符合正態(tài)分布的特征數(shù)據(jù)。該數(shù)據(jù)集包含有電影預(yù)算和電影總收入這兩個不符合正態(tài)分布的特征,正態(tài)化處理方式有指數(shù)變換、對數(shù)變換、Box-cox變換等,需要根據(jù)數(shù)據(jù)的不同情況進行選擇,通常采用指數(shù)變換將左偏數(shù)據(jù)的數(shù)值較大的數(shù)據(jù)點間的距離增大,采用對數(shù)變換將右偏數(shù)據(jù)的數(shù)值較大的數(shù)據(jù)點間的距離縮小,而Box-cox變換既可以處理左偏數(shù)據(jù),也可以處理右偏數(shù)據(jù)。本文使用的是對數(shù)變換對電影預(yù)算和電影總收入進行轉(zhuǎn)換,使分布不均的數(shù)據(jù)服從正態(tài)分布。
(2)數(shù)值化處理
數(shù)值化處理是指將類別型特征和文本型特征轉(zhuǎn)換成數(shù)值型特征,該數(shù)據(jù)集共包含有11個類別型特征,分別包括系列電影名、電影類型、電影官方主頁、出品公司、出品國家、電影語言、電影狀態(tài)、電影名稱、電影關(guān)鍵詞、演員、導(dǎo)演。該數(shù)據(jù)集有三個文本型特征,分別包括電影簡介、發(fā)行日期和宣傳語。
獨熱編碼,又稱一位有效編碼,是使用M位狀態(tài)寄存器對M個狀態(tài)進行編碼的方式,每個狀態(tài)都有它獨立的寄存器位,并且在任意時刻,這些寄存器位中只有其中一位有效。獨熱編碼能將類別型特征的取值擴展到歐式空間,有效擴充了特征,使特征之間的距離計算更合理。經(jīng)過獨熱編碼,系列電影名、電影類型、電影官方主頁等11個類別型特征一共轉(zhuǎn)換成了113個數(shù)值型特征。
而對于電影簡介和宣傳語這兩個特征來說,將對應(yīng)文本的長度作為特征的量化值;對于發(fā)行日期這個特征來說,將具體的年、月、日作為其量化值。
(3)標(biāo)準(zhǔn)化處理
標(biāo)準(zhǔn)化處理是指通過一定的數(shù)據(jù)變換方式,將數(shù)據(jù)落入到特定區(qū)間內(nèi),使結(jié)果更具有可比性。標(biāo)準(zhǔn)化的處理方式有極差標(biāo)準(zhǔn)化法,即min-max標(biāo)準(zhǔn)化法、Z-score標(biāo)準(zhǔn)化法、歸一化法、中心化法。本文采用的是min-max標(biāo)準(zhǔn)化法,該方法的具體轉(zhuǎn)換公式如下。
式中x′為轉(zhuǎn)換后的數(shù)據(jù),min為原始數(shù)據(jù)的最小值,max為原始數(shù)據(jù)的最大值,x為原始數(shù)據(jù)。
刪除了電影Id、TMDB官網(wǎng)Id、原始語言、原始名稱、海報鏈接這五個無關(guān)特征后,最終形成了一共包含有9399條數(shù)據(jù),143個特征的數(shù)據(jù)集。
對于第一層的初級學(xué)習(xí)器來說,搭建模型的主要任務(wù)即是進行模型的超參數(shù)優(yōu)化,常用的超參數(shù)的優(yōu)化方法有網(wǎng)格搜索、隨機搜索、貝葉斯優(yōu)化等, Optuna優(yōu)化框架支持以上所有優(yōu)化方法,因此本文選用了Optuna框架對模型的超參數(shù)進行優(yōu)化。
(1)基于XGBoost的票房預(yù)測模型
基于XGBoost的電影票房預(yù)測模型的主要超參數(shù)有max_depth, subsample, colsample_bytree和learning_rate,max_depth為XGBoost中樹的最大深度,max_depth的值越大,樹越復(fù)雜,模型學(xué)習(xí)的更加具體,系統(tǒng)默認值為6,一般設(shè)置在3~10之間。subsample為XGBoost中每棵樹隨機選擇樣本的比率,系統(tǒng)默認值為1,范圍在 (0,1]之間。colsample_bytree是構(gòu)建每棵樹時隨機選擇特征的比例,系統(tǒng)默認值為1,范圍在在(0,1]之間。learning_rate為每一步迭代的步長,默認值為0.3,一般設(shè)置為0.1。
根據(jù)Optuna優(yōu)化框架得到的基于XGBoost的票房預(yù)測模型的主要超參數(shù)如表1所示。
表1 XGBoost模型的超參數(shù)表
(2)基于LightGBM的電影票房預(yù)測模型
基于LightGBM的電影票房預(yù)測模型的主要超參數(shù)有num_leaves, min_data_in_leaf, max_depth, learning_rate 。nums_leaves為LightGBM中每棵樹上的葉子節(jié)點的個數(shù),默認值為31,增大num_leaves的值能提高模型預(yù)測的準(zhǔn)確率,但過高會導(dǎo)致模型過擬合。min_data_in_leaf為LightGBM中一個葉子節(jié)點上的最小樣本數(shù),默認值為20,增大min_data_in_leaf可以防止過擬合。與XGBoost類似,max_depth為樹的最大深度,learning_rate為學(xué)習(xí)率。
根據(jù)Optuna優(yōu)化框架得到的基于LightGBM的票房預(yù)測模型的主要超參數(shù)如表2所示。
表2 LightGBM模型的超參數(shù)表
(3)基于CatBoost的電影票房預(yù)測模型
基于CatBoost的電影票房預(yù)測模型的主要超參數(shù)有iterations, learning_rate, depth, bagging_temperature。與XGBoost類似,iterations為可以建立的樹的數(shù)目,learning_rate為學(xué)習(xí)率,depth為樹的深度,bagging_temperature為貝葉斯套袋控制強度,默認值為1。
根據(jù)Optuna優(yōu)化框架得到的基于CatBoost的票房預(yù)測模型的主要超參數(shù)如表3所示。
表3 CatBoost4模型的超參數(shù)表
(4)基于支持向量回歸的票房預(yù)測模型
在使用rbf作為核函數(shù)的情況下,基于支持向量回歸的票房預(yù)測模型的主要超參數(shù)有g(shù)amma和C。其中,gamma決定了數(shù)據(jù)集映射到新的特征空間后的分布,gamma越大,支持向量越少。gamme越小,支持向量越多C是模型的正則化系數(shù),默認值為1.0,主要用來防止模型過擬合,C值越大,對模型的懲罰越高,泛化能力越弱,即造成了過擬合。反之,C值越小,對模型的懲罰越低,泛化能力越強,即造成欠擬合。
根據(jù)Optuna優(yōu)化框架得到的基于支持向量回歸的票房預(yù)測模型的主要超參數(shù)如表4所示。
表4 基于支持向量回歸的票房預(yù)測模型的超參數(shù)表
(5)基于隨機森林的票房預(yù)測模型
基于隨機森林的票房預(yù)測模型的主要超參數(shù)有n_estimators, max_depth, min_samples_leaf和max_features。與XGBoost類似,max_depth 為決策樹的最大深度,n_estimators為決策樹的個數(shù), min_samples_leaf為葉子節(jié)點所需的最小樣本數(shù),默認值為1,若葉子節(jié)點樣本數(shù)小于min_samples_leaf,則對該葉子節(jié)點和兄弟葉子節(jié)點進行減枝,只留下該葉子節(jié)點的父節(jié)點。max_feature為構(gòu)建決策樹最優(yōu)模型時考慮的最大特征數(shù)。
根據(jù)Optuna優(yōu)化框架得到的基于隨機森林的票房預(yù)測模型的主要超參數(shù)如表5所示。
表5 基于隨機森林的票房預(yù)測模型的超參數(shù)表
(6)基于改進stacking算法的票房預(yù)測模型
在對以上五個模型進行集成時,本文選用的是嶺回歸算法進行集成。分別記錄下每折驗證集真實值與預(yù)測值的差異,對對應(yīng)測試集的結(jié)果進行加權(quán),即得到最終預(yù)測結(jié)果。
將本文提出的基于改進stacking算法的票房預(yù)測模型與基于XGBoost、LightGBM、CatBoost 、隨機森林、支持向量回歸、傳統(tǒng)stacking算法的票房預(yù)測模型的實驗結(jié)果進行對比,最終結(jié)果如表6所示。
表6 不同算法的指標(biāo)對比
從表6中可以看出,單個模型中,基于XGBoost的票房預(yù)測模型性能最好,而基于傳統(tǒng)Stacking算法的票房預(yù)測模型的性能優(yōu)于單個模型的性能,基于改進stacking算法的票房預(yù)測模型性能又優(yōu)于基于傳統(tǒng)stacking算法的票房預(yù)測模型,可見改進stacking算法能充分挖掘和利用數(shù)據(jù)信息,在模型之間取長補短,最終取得更好的效果。
針對電影票房預(yù)測模型精確度低的問題,本文提出了一種對測試集加權(quán)的stacking算法,對 kaggle提供的TMDB電影票房數(shù)據(jù)集進行了預(yù)測。首先,分別訓(xùn)練了第一層的XGBoost、LightGBM。CatBoost、支持向量回歸和隨機森林電影票房模型,并使用了Optuna參數(shù)優(yōu)化框架找到了模型的最優(yōu)超參數(shù),優(yōu)化了模型;然后,在對第一層的模型進行集成時,第二層使用了對測試集加權(quán)的嶺回歸算法。實驗結(jié)果表明,與其他算法所搭建的電影票房預(yù)測模型相比,基于對測試集加權(quán)的改進stacking算法所搭建的模型對電影票房的預(yù)測更加準(zhǔn)確,效果更好。因此,本文的方法可以對投資公司進行電影票房預(yù)測提供有效的參考。然而,本文中使用的電影票房數(shù)據(jù)有限,將來需要更多的數(shù)據(jù)來構(gòu)建魯棒性更強的票房收入預(yù)測模型。