南京原創音樂創作社

竞彩篮球让分胜负倍数:《歌手》決賽排名預測之技術篇

原力大數據2019-06-02 01:56:44

让分胜负复式投注中奖率高 www.zgles.com

上一篇文章預測了《歌手》排名和候選“歌王”,大多數人是看個熱鬧而看不到門道,也許你們認為我們是憑空胡謅,而這一篇干貨滿滿的文章,我們從技術角度出發,用詳實的數據和詳盡的方法來說話,給大家展示一下復雜的預測過程,這可不是隨隨便便的忽悠——


1

定義問題


首先,明確我們要解決的問題是什么?是預測——準確來說是用機器學習的方法進行預測。預測什么呢?歌王,還是歌手決賽排名?其實都可以。預測歌王的話,標簽就會二值化,可以使用邏輯回歸等模型;預測排名的話,標簽就會連續化,可以使用回歸模型(當然也可以把標簽當成離散數據,再使用分類模型預測)。為了更豐富,我們將問題定義為用機器學習算法預測歌手決賽排名。



2

數據準備


1、數據獲取

“巧婦難為無米之炊?!筆葑急甘橋苣P偷那疤?。那么,要獲取什么數據?換句話說,要如何設計歌手的特征維度?我認為奪冠幾率與歌手的國籍(地域)、資歷每期比賽的排名相關。最后,我們打算根據以下特征獲取數據:


特征

備注

Name

歌手名

Season

第幾季

isTeam

個人or團隊

isStart

首發or補位or踢館or逆戰or挑戰

Gender

男or女or混合

Location

歌手國籍(地域)

Age

歌手資歷(參賽年份- 出道年份)

Ranking_per_game

每期比賽排名(共12個特征)

Ranking

決賽排名(標簽)

那么,如何獲取這些數據呢?網上并沒有數據源可以直接下載或抓取。我決定采取手動抓取數據的技術,將數據整理儲存到一張csv表格里面。

下圖是部分數據截圖:


2、數據預處理

1)缺失值處理

原始數據中存在很多缺失值,因為絕大部分歌手不是每期都參加。如何處理這些缺失值呢?總不能把包含缺失值的數據都刪了,這樣就一條不剩了,我決定用一個不會跟排名撞到的數字13代替缺失值。

2)離散值處理

數據當中,如性別、地域這些離散型特征數據是無法直接丟進模型里面跑的。我們需要先把它們編碼成數字。我們使用sklearn里面的preprocessing??櫚?/span>

LabelEncoder:

from sklearn import preprocessing as pre

le = pre.LabelEncoder()

data_encode[‘gender’] = le.fit_transform(data_origin[‘gender’])???

以上代碼是將性別數據編碼的例子。

經過數據預處理,理論上可以套模型了。我迫不及待地套了幾個模型,發現效果都很爛。(我用前三季作為訓練數據,第四季作為預測數據。)這迫使我不得不進入到特征工程的環節。



3

特征工程


坊間流傳一句話:數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已??杉卣鞴こ痰鬧匾?!

1、特征生成

我猜測前面將每一期的排名作為一個特征的做法欠妥。一來是因為這些都是“平行特征”,攜帶的信息量不大;二來是因為這樣做存在大量缺失值,很難處理。為了解決這個問題,我決定生成一組新的特征來描述這12期的排名情況。它們分別是:


特征

備注

Mean

排名平均值

Std

排名標準差

Count

常規賽參加期數

Median

排名中位數

Mad

平均絕對離差

Var

方差

Min

最好排名

Max

最差排名

1_count

問鼎第一的次數

下圖是特征替換后的部分數據截圖:(幾乎解決缺失值問題。剩下的標簽缺失值還是用13代替。)

2、特征相關性分析

下面,我們計算了兩兩變量(特征)之間的相關系數矩陣,來全面分析特征之間的關系。

先看特征1(決賽排名)這列。相關系數絕對值大于0.5的特征如下:

8:平均值,10:參加期數,11:中位數,14:最高排名,15:最低排名,16:第一次數

其中排名平均值和中位數更是超過0.7??杉?/span>平均值真是一個神指標。而懂點數學的人都知道,中位數在很多情況下其實接近于平均數。查找平均值和中位數的相關系數,發現高達0.935。

參加期數的系數是-0.547,意味著在場上待越久,決賽排名越靠前。有點像歌手定位這個特征。

最高/低排名表示了歌手水平的上/下限,這個與中位數(表示“中限”)一樣,都是與決賽排名呈正相關。

3、特征選擇

那么,我們就選擇這些高相關系數的特征進行模型的訓練就行了嗎?不是的。我們看看平均值與其他特征的相關性,發現剛剛分析的幾個特征不但與決賽排名(標簽)相關性高,而且與平均值的相關性也很高!這些叫做冗余特征,對訓練模型益處不大。

問題來了,那要如何找到特征的最佳搭配呢?這個問題讓人來想是難的,只能靠猜;但是讓計算機來“想”,卻很簡單,因為計算機可以把所有特征搭配的可能都試一遍,看看哪個效果最好,也就是所謂的“暴力法”。

from sklearn.feature_selection import RFE

clf = RandomForestRegressor(n_estimators=50, max_depth=14)

selector = RFE(clf, 1, step=1)

selector = selector.fit(data_encode.ix[:,3:], data_encode.ix[:,1])

print selector.ranking_


以上代碼是使用隨機森林算法時的遍歷特征選擇,最后輸出特征重要程度的排序。例如你想取k個特征,那么排序中top k個特征搭配會是效果最佳的。注意,不同算法的特征排名不一樣。

Step 1: 模型訓練

數據準備好了,特征工程也做了,可以訓練模型了。我先后嘗試了線性回歸、決策樹、SVM、樸素貝葉斯和隨機森林五個模型。最后選擇了隨機森林。這里我主要介紹使用隨機森林建模的過程。

Step 2: 初探隨機森林

在嘗試了一系列常用模型都不滿意后,我將希望寄托在隨機森林上。周志華教授在他著名的西瓜書上說:“隨機森林簡單、容易實現、計算開銷小,令人驚奇的是,它在很多現實任務中展現出強大的性能,被譽為‘代表集成學習技術水平的方法’。

隨機森林真的跟決策樹有關系!它的精髓在于“多樣性”。隨機森林先隨機抽取原數據集(從數據和特征兩個方面),生成很多子數據集。然后用子數據集訓練出很多個決策樹,再用每個決策樹預測結果,最后取結果的眾數作為最終結果!

(因為隨機森林是取所有預測結果的平均數,所以預測排名是小數。)

這個結果還不錯,冠軍預測對了,前三對了兩位。但還是不太理想,實際第二的張信哲被預測成第四,實際第四的老狼被預測成第七。

Step 3:分層隨機森林

根據我對《歌手》這個節目的理解,前三名的名次比較重要,后面的排名不太要緊,例如第四季直接用年度六強來取代4~6名。所以我想到一個分層預測模型:

1、把歌手的標簽從排名變成等級,先預測出第一等(前三),和第二等(后四or后五)。

2、? 再用回排名標簽分別預測具體的排名。

看看效果如何:

哇塞!雖然張信哲的預測排名是2.06,可以說是第二等,但是不要緊,他是排在第三位,就是他會被分到前三這一等!這樣一來,分層模型已經成功了一半!再看看第二輪預測:

“上層預測”:

“下層預測”:

前三全部預測準確?。?!



4

預測


最后,我們使用分層隨機森林模型對第五季歌手決賽排名進行預測:

“上層預測”:

“下層預測”:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??


(更多有趣分析詳見頭條姐妹篇文章,謝謝大家




原力大數據(廣州帷策智能科技有限公司)

廣州帷策智能科技有限公司致力于大數據研究及應用項目,積累了豐富且深入的大數據實踐經驗與成果。尤其擅長基于大數據的分析建模、能力固化和產品研發,力求幫助客戶透視業務全景,實現量化決策、精準決策和科學決策,高效提升市場營銷及運營管理能力。


官網??//www.wislife.cn

合作聯系??020- 85279103?

微信?jesich


微信ID:wislife

長按指紋識別二維碼關注