張濤,陳瀟瀟
(北方工業大學, 北京,100144)
隨著社會經濟的發展,社會生活水平提高,看電影已經成為一項主要的娛樂活動。據國家統計局統計,2021中國票房近470億,幾乎是2019年中國票房的5倍[1]。盡管大多數公司都想從這個巨大的市場中分一杯羹,但只有幾部熱門電影實現了盈利,其他電影則在虧損[2]。因此,如何準確地預測電影票房,降低投資風險,避免公司因投資失敗而遭受巨大損失已成為亟需解決的問題。
隨著人工智能技術的快速發展,越來越多的學者將機器學習等數據挖掘技術應用于電影票房預測中,郭萱[3]以2014年-2016年的173部影片為研究對象,引入了基于條件推斷樹的隨機森林模型對電影票房進行預測,研究結果表明,基于條件推斷樹的隨機森林預測模型比傳統的隨機森林預測模型準確度更高。楊朝強[4]分別訓練了LSTM模型和BP神經網絡模型,得出了LSTM模型的平均相對誤差比BP神經網絡模型的平均相對誤差要低的結論。李振興[5]的研究結果表明,演員是影響電影票房的關鍵因素。甘雨涵[6]爬取了2016年全年在國內上映的150部電影的豆瓣評論信息,通過分析評論中的情感傾向,證明了口碑對電影票房的重要性。
在前人研究的基礎上,本文首先分別建立了XGBoost、LightGBM、CatBoost、隨機森林(Random Forest)和支持向量回歸(support vector Regression)票房預測模型,并通過optuna框架對五個票房預測模型的超參數進行優化,提高單個票房預測模型的預測精確度;然后,使用測試集,通過加權stacking算法進行了電影票房預測,并與傳統的票房預測模型進行了對比,驗證了模型的有效性。
為了有效評估模型的預測效果,本文采用了平均絕對百分比誤差(MAPE)、均方誤差 (MSE)、均方根誤差(RMSE)以及kaggle上的評分這四項指標作為模型評價指標。
平均絕對百分比誤差(MAPE)表示的是真實值與預測值之差的絕對值占真實值之比。MAPE值越小,模型預測效果越好。具體公式如下:
式中:n為樣本數,為預測值,yi為真實值。
均方誤差(MSE)是指預測值與真實值的距離的平方和的平均數,MSE的值越小,模型預測效果越好,具體公式如下:
均方根誤差(RMSE)是均方誤差的算數平方根,RMSE的值越小,模型預測效果越好,具體公式如下:
Kaggle上的評分是指當用戶提交對測試集的預測結果時,kaggle對測試集的預測結果的打分,kaggle上的評分越低,排名越靠前,模型預測效果越好。
Sklearn 的GridSearchCV函數可通過網格搜索與交叉驗證的方式來進行超參數優化,但由于其會遍歷給定范圍內的所有超參數組合,所以非常耗時,特別是當超參數的數量增長時,網格搜索的時間復雜度將呈現指數增長。
Optuna 是一個完全用 Python 編寫的自動超參數調整框架。專為機器學習而設計,可以與 PyTorch、TensorFlow、Keras、SKlearn 等其他框架一起使用。
Optuna 的優化程序中只有三個核心的概念,分別為目標函數(objective),單次試驗(trial),和研究(study)。其中目標函數負責定義待優化函數并指定超參數范圍,單詞試驗對應著目標函數的單次執行,而研究則負責管理優化,決定優化的方式,記錄總試驗的次數、試驗結果等。
stacking 算法一般采用兩層結構,第一層的學習器被稱作初級學習器,也被稱為基學習器,常用作對經過處理后的原始樣本的訓練和預測,第二層的學習器為次級學習器,也被稱為元學習器,用于結合第一層的驗證集與測試集的預測結果再次進行學習。
Stacking算法能夠結合每個基學習器的優點,提高模型的整體預測精度。Stacking算法的流程圖如圖1所示,假設第一層有兩個基學習器,每個基學習器分別對原始訓練集進行訓練, 得到驗證集的預測結果v1 和v2。對整個測試集的進行五次預測,將結果進行相加取平均得到測試集結果T1和T2。水平連接V1和V2得到新訓練集TrainNew,水平連接T1和T2得到新的測試集Testew,將新訓練集Trainnew與原始訓練集一同放入元學習器中進行訓練,將最終所得的元學習器對TestNew進行測試后即可得到測試集的最終預測結果。

圖1 stacking算法的流程圖
在傳統stacking算法中,在第二層進行集成時,僅僅是將測試集的預測結果進行的平均處理,這樣會平均掉表現好的模型的訓練結果。因此,可對次級學習器的每一折預測結果進行加權處理,從而提高模型在測試集上的表現,具體的示意圖如圖2所示,其中wi即為權值,權值為每一折驗證集的預測值與真實值的誤差,wi的計算方式如公式(4)所示,式中mape的定義如公式(1)所示。

圖2 次學習器中精度加權的改進
本文選取的是Kaggle競賽中的數據,數據來自于TMDB電影數據庫,數據集共有9399條,其中有5001條訓練集數據,4398條測試集數據。數據集共包括電影Id、系列電影名、電影預算、電影類型、電影官方主頁、TMDB官網id、原始語言、電影原始名稱、電影簡介、流行程度、海報鏈接、出品公司、出品國家、發行日期、電影時長、電影語言、電影狀態、宣傳語、電影名稱、電影關鍵詞、演員、導演和電影總收入這二十三個特征。其中,電影總收入為預測目標變量。
由于Kaggle提供的數據為未經過處理的原始數據,其中包含有文本類型的數據,不能將其直接輸入模型訓練,需要進行數據預處理,數據預處理包括正態化處理、數值化處理以及標準化處理。
(1)正態化處理
正態化處理是指將不符合正態分布的特征數據轉換成符合正態分布的特征數據。該數據集包含有電影預算和電影總收入這兩個不符合正態分布的特征,正態化處理方式有指數變換、對數變換、Box-cox變換等,需要根據數據的不同情況進行選擇,通常采用指數變換將左偏數據的數值較大的數據點間的距離增大,采用對數變換將右偏數據的數值較大的數據點間的距離縮小,而Box-cox變換既可以處理左偏數據,也可以處理右偏數據。本文使用的是對數變換對電影預算和電影總收入進行轉換,使分布不均的數據服從正態分布。
(2)數值化處理
數值化處理是指將類別型特征和文本型特征轉換成數值型特征,該數據集共包含有11個類別型特征,分別包括系列電影名、電影類型、電影官方主頁、出品公司、出品國家、電影語言、電影狀態、電影名稱、電影關鍵詞、演員、導演。該數據集有三個文本型特征,分別包括電影簡介、發行日期和宣傳語。
獨熱編碼,又稱一位有效編碼,是使用M位狀態寄存器對M個狀態進行編碼的方式,每個狀態都有它獨立的寄存器位,并且在任意時刻,這些寄存器位中只有其中一位有效。獨熱編碼能將類別型特征的取值擴展到歐式空間,有效擴充了特征,使特征之間的距離計算更合理。經過獨熱編碼,系列電影名、電影類型、電影官方主頁等11個類別型特征一共轉換成了113個數值型特征。
而對于電影簡介和宣傳語這兩個特征來說,將對應文本的長度作為特征的量化值;對于發行日期這個特征來說,將具體的年、月、日作為其量化值。
(3)標準化處理
標準化處理是指通過一定的數據變換方式,將數據落入到特定區間內,使結果更具有可比性。標準化的處理方式有極差標準化法,即min-max標準化法、Z-score標準化法、歸一化法、中心化法。本文采用的是min-max標準化法,該方法的具體轉換公式如下。
式中x′為轉換后的數據,min為原始數據的最小值,max為原始數據的最大值,x為原始數據。
刪除了電影Id、TMDB官網Id、原始語言、原始名稱、海報鏈接這五個無關特征后,最終形成了一共包含有9399條數據,143個特征的數據集。
對于第一層的初級學習器來說,搭建模型的主要任務即是進行模型的超參數優化,常用的超參數的優化方法有網格搜索、隨機搜索、貝葉斯優化等, Optuna優化框架支持以上所有優化方法,因此本文選用了Optuna框架對模型的超參數進行優化。
(1)基于XGBoost的票房預測模型
基于XGBoost的電影票房預測模型的主要超參數有max_depth, subsample, colsample_bytree和learning_rate,max_depth為XGBoost中樹的最大深度,max_depth的值越大,樹越復雜,模型學習的更加具體,系統默認值為6,一般設置在3~10之間。subsample為XGBoost中每棵樹隨機選擇樣本的比率,系統默認值為1,范圍在 (0,1]之間。colsample_bytree是構建每棵樹時隨機選擇特征的比例,系統默認值為1,范圍在在(0,1]之間。learning_rate為每一步迭代的步長,默認值為0.3,一般設置為0.1。
根據Optuna優化框架得到的基于XGBoost的票房預測模型的主要超參數如表1所示。

表1 XGBoost模型的超參數表
(2)基于LightGBM的電影票房預測模型
基于LightGBM的電影票房預測模型的主要超參數有num_leaves, min_data_in_leaf, max_depth, learning_rate 。nums_leaves為LightGBM中每棵樹上的葉子節點的個數,默認值為31,增大num_leaves的值能提高模型預測的準確率,但過高會導致模型過擬合。min_data_in_leaf為LightGBM中一個葉子節點上的最小樣本數,默認值為20,增大min_data_in_leaf可以防止過擬合。與XGBoost類似,max_depth為樹的最大深度,learning_rate為學習率。
根據Optuna優化框架得到的基于LightGBM的票房預測模型的主要超參數如表2所示。

表2 LightGBM模型的超參數表
(3)基于CatBoost的電影票房預測模型
基于CatBoost的電影票房預測模型的主要超參數有iterations, learning_rate, depth, bagging_temperature。與XGBoost類似,iterations為可以建立的樹的數目,learning_rate為學習率,depth為樹的深度,bagging_temperature為貝葉斯套袋控制強度,默認值為1。
根據Optuna優化框架得到的基于CatBoost的票房預測模型的主要超參數如表3所示。

表3 CatBoost4模型的超參數表
(4)基于支持向量回歸的票房預測模型
在使用rbf作為核函數的情況下,基于支持向量回歸的票房預測模型的主要超參數有gamma和C。其中,gamma決定了數據集映射到新的特征空間后的分布,gamma越大,支持向量越少。gamme越小,支持向量越多C是模型的正則化系數,默認值為1.0,主要用來防止模型過擬合,C值越大,對模型的懲罰越高,泛化能力越弱,即造成了過擬合。反之,C值越小,對模型的懲罰越低,泛化能力越強,即造成欠擬合。
根據Optuna優化框架得到的基于支持向量回歸的票房預測模型的主要超參數如表4所示。

表4 基于支持向量回歸的票房預測模型的超參數表
(5)基于隨機森林的票房預測模型
基于隨機森林的票房預測模型的主要超參數有n_estimators, max_depth, min_samples_leaf和max_features。與XGBoost類似,max_depth 為決策樹的最大深度,n_estimators為決策樹的個數, min_samples_leaf為葉子節點所需的最小樣本數,默認值為1,若葉子節點樣本數小于min_samples_leaf,則對該葉子節點和兄弟葉子節點進行減枝,只留下該葉子節點的父節點。max_feature為構建決策樹最優模型時考慮的最大特征數。
根據Optuna優化框架得到的基于隨機森林的票房預測模型的主要超參數如表5所示。

表5 基于隨機森林的票房預測模型的超參數表
(6)基于改進stacking算法的票房預測模型
在對以上五個模型進行集成時,本文選用的是嶺回歸算法進行集成。分別記錄下每折驗證集真實值與預測值的差異,對對應測試集的結果進行加權,即得到最終預測結果。
將本文提出的基于改進stacking算法的票房預測模型與基于XGBoost、LightGBM、CatBoost 、隨機森林、支持向量回歸、傳統stacking算法的票房預測模型的實驗結果進行對比,最終結果如表6所示。

表6 不同算法的指標對比
從表6中可以看出,單個模型中,基于XGBoost的票房預測模型性能最好,而基于傳統Stacking算法的票房預測模型的性能優于單個模型的性能,基于改進stacking算法的票房預測模型性能又優于基于傳統stacking算法的票房預測模型,可見改進stacking算法能充分挖掘和利用數據信息,在模型之間取長補短,最終取得更好的效果。
針對電影票房預測模型精確度低的問題,本文提出了一種對測試集加權的stacking算法,對 kaggle提供的TMDB電影票房數據集進行了預測。首先,分別訓練了第一層的XGBoost、LightGBM。CatBoost、支持向量回歸和隨機森林電影票房模型,并使用了Optuna參數優化框架找到了模型的最優超參數,優化了模型;然后,在對第一層的模型進行集成時,第二層使用了對測試集加權的嶺回歸算法。實驗結果表明,與其他算法所搭建的電影票房預測模型相比,基于對測試集加權的改進stacking算法所搭建的模型對電影票房的預測更加準確,效果更好。因此,本文的方法可以對投資公司進行電影票房預測提供有效的參考。然而,本文中使用的電影票房數據有限,將來需要更多的數據來構建魯棒性更強的票房收入預測模型。