<b>摘要:</b>2016中國高校計算機大賽——大資料挑戰賽是由教育部和全國高等學校計算機教育研究會聯合主辦,清華大學和阿裡雲聯合承辦,在“天池大資料衆智平台”上開展的高端算法競賽。本次賽題是對于阿裡音樂流行趨勢進行預測,本文整理自大賽冠軍團隊datahacker團隊的答辯演講。
本文整理自獲得本次2016中國高校計算機大賽阿裡音樂流行趨勢預測比賽冠軍的datahacker團隊的答辯視訊。datahacker團隊由三名成員組成,成員簡介如下:

datahacker團隊的答辯主要從以下四個方面進行論述:
一、賽題分析
二、規則算法
三、模型算法
四、重要的事情
<b>一、賽題分析</b>
本次大資料挑戰賽以阿裡音樂使用者的曆史播放資料為基礎,期望參賽者可以通過對阿裡音樂平台上每個階段藝人的試聽量的預測,挖掘出即将成為潮流的藝人,進而實作對一個時間段内音樂流行趨勢的準确把控。從下圖中給出的測評公式,可以看出真實的播放量是在分母上邊的,是以如果真實的播放量比較小的話,那麼将會誤差将會非常大,甚至在測試裡面則會出現負分。基于這樣的認識,在相同的可能情況下,datahacker團隊預測的播放量要偏小一些,是以測評的得分會大于偏大的情況。
下圖是挑選出的15個藝人的播放量趨勢,從圖中可以非常明顯地看出藝人的播放量趨勢存在三種狀态:快速上升、指數鏡像型下降以及保持平穩。
下圖是播放量綜合的走勢情況。對于總體播放量而言,也存在三個整體特征:第一個特征就是總體穩步上升,這其實也表現了使用者數的穩步上升;另外一個特征就是在“五一”和端午節兩個假期的播放量明顯低于日常播放量,從後面也可以看到使用者數目足夠多以後表現出了明顯的周期性,這個周期性表現為周末的播放量會降低,工作日就會變多,反映出來就是音樂的播放量在大家的碎片時間比較多,相比而言,在工作日時間大家的碎片化時間會多一些。
datahacker團隊強調了對于基本概念的了解和把握需要非常清晰,因為對于預測問題時往往會做很多的近似,而在近似的過程中,如果不能很系統地把握裡面的輸入和輸出以及自變量、因變量,這樣的話最後往往會造成混淆甚至會走很多彎路。是以需要對于每一個函數以及每一個公式都清晰地了解其輸入以及輸出是什麼,自變量和因變量又是什麼。
首先對于播放量而言,其實播放量實際上是網絡傳播動力學的問題,這方面近期比較熱門,但是目前沒有一個強有力的結果。從賽題的角度而言,datahacker團隊則是通過星期和假期這些可以利用的曆史資料來進行預測的,但是這其中也會存在着一些擾動項。
對于測試集的考慮而言,基本不會使用給出的整個六個月的資料來預測後面兩個月,一般情況是使用後面三四個月甚至兩個月的資料進行預測。datahacker團隊列舉的例子中使用了四個月的曆史資料進行預測,這樣就可以順利地完成比賽。但是使用曆史資料預測七月和八月或者九月和十月,這兩個函數f3和f4是不相同的,因為這其中的擾動是關于時間t的函數,但是為了預測,是以近似地令f3=f4,來得到平均預測值。再進一步,加上星号表示某一特定數,因為比賽中會經常出現更換資料的問題,是以f5/f4就是一個特例,它實際上牽扯到這組資料特有的幾個藝人的特殊資料。最後實際上需要求的就是将f3使用曆史資料回歸出來,将f6抽出來,并且為了避免過拟合的問題需要讓f6=f4-f3而不是f5-f3,并不是特定資料的差,否則就會出現過拟合的問題了。這個思路看上去比較簡單,然而在實際操作時f3和f4的變量很多,是以在實作時需要推導很多模型,并且需要進行模型融合,是以有時混淆是很容易發生的。
那麼經過上面的分析,就轉化到求解f3和f6兩個函數的問題了。這裡求解f3其實就是一個回歸問題,劃分就是兩大類:專家系統和機器學習。專家系統簡稱為規則,就是人為地構造一個非線性函數,并利用資料集求取參數;而機器學習則是利用機器學習方法獲得回歸函數。而f6的求解在整個比賽中也是比較重要的,因為資料挖掘其實就是擷取資訊,在比賽中除了給出資料資訊之外,測評的分數也會包含很多的資訊,如果從測評的分數中有技巧地建構答案進行送出的話,實際上也是可以擷取非常多的資訊的,對于成績而言也會有非常大的提升。
對于f6而言,存在很多的擾動。第一個擾動因素就是長假,可以看出給出的資料裡面是沒有長假資料的,在這一點可以定性地判斷出長假期間播放量會比較低,但是具體會低多少,以及在七天長假中以什麼樣的形式降低,這些都是無法從資料集中擷取資訊的,如果想要提高這部分的分數就需要從測評資訊中擷取。第二點,可以看出前面的播放量是穩步上升的,但是無法保證九月和十月份還是會穩步上升,也有可能走向下降的趨勢。是以這些外部擾動所帶來的影響都是無法通過曆史資料擷取的,需要在測評中通過一些假設進行擷取求證,datahacker團隊還提到包括他們融合模型的參數就是通過測評不斷改善的。
其實比賽最關鍵的問題就是模式一——播放量的爆發增長是否可以預測?這一點通過曆史資料是無法進行精确預測的。另外對于資料而言,去進行資訊沙漏分析,将資料逐個去試也能夠很快地得到這個結論,播放量的爆發增長是不能進行預測的,這個問題也是外部擾動的一項,而且外部擾動會非常強,有時候會有幾十倍的增加。
第二個問題就是題目所給出的資料集中其他的資訊是否有用?datahacker團隊進行了如下分析:
大量的關于使用者行為的資料,對本賽題無用。求解宏觀問題用宏觀方法,求解微觀問題用微觀方法。
下載下傳資料和收藏資料,可能存在有用的資訊。但是在模式一這種強擾動要素無法預測的背景下,這種次要資訊的意義不大,而且提取也較困難。
是以使用的資料隻有藝人播放量和播放人數的曆史值及曆史統計量。
datahacker團隊談到對于模型一爆發式增長是無法預測的,是以就直接舍棄了,就開始預測穩定值,因為在八月份的尾期爆發性的增長會有一個回落,是以将回落分析出來就可以了。為了預測這兩個模型,datahacker團隊根據模型二和模型三的特點,以及播放量總體上升的趨勢構造了v型預測模型。
因為總體播放量在上升并且總使用者數也在上升,是以會呈現v型。這樣就把問題轉化為求基準播放量a和兩個斜率b,c。datahacker團隊使用了一些曆史資料進行線性回歸,第一個就是前三日播放量的均值,第二個是相對于前60日的增長量,後面又選取了中位數以及最小數等特征值。談到為什麼要選取這些值,datahacker團隊表示想法很簡單,将資料的特征數值全部列舉出來,進行線性回歸,之後每次剔除掉一個影響量最小的值,在剔除幾次以後就會找到最合适的三、四個特征值,這時候就會發現測評成績已經非常穩定了,不會再上升了,這時候就可以用于預測了。
datahacker團隊使用了總體播放量的增長量來線性回歸斜率c,與其他團隊有所不同就是他們疊加了每個藝人星期的周期變化和節假日的修正系數。下圖中右側部分就是datahacker團隊給出的例子,其中紅色的線就是資料集給出曆史資料,藍色是他們的預測,從例子中看上去還是很不錯的。datahacker團隊在這其中發現一個很有意思的地方:通過給出的資料目測後面的資料其實是很難的,但是将自己的預測結果圖畫出來,通過目測進行判斷其實與線上評測的結果是高度接近的,也就是使用目測法可以很容地判斷出預測的結果準确與否。
對于資料清洗方面,datahacker團隊對每個藝人每一天播放量最大的5%使用者占播放量的比重做了限制。并且由于測評公式的原因,預測量應該就低不就高,一旦遠高于實際值,将會極大地影響得分。
<b>二、規則算法</b>
前面看到的方式看上去很簡單,就是用線性回歸計算出系數就可以,但是實際上将所有的使用者資料全部放進去以後一起進行預測,效果就不會特别好了。特别是因為前面談到的斜率對于八月份的異常增長使用者的預測,但是後面資料會下降,是以将所有的使用者都放進去時實際的效果會比較差。是以,實際上對于八月份的異常需要進行分類預判,然而對于回落的預判是非常難的,因為異常增長的高度、幅度以及時間發生點都是不可預測的,是以也是無法刻畫的。datahacker團隊在這裡使用替代的方法進行分類,就是使用後30天播放量的均值/前7天播放量的均值來替代模式二的指代性特征,并使用了不同的門檻值設計了分類器。
在論述這部分時,datahacker團隊還談到了一個不确定的經驗:對于百萬級别資料量的訓練集,組合特征在數百維的量級上,這樣其實對分類性能是有益無害的。是以抱着這樣的一個認識,datahacker認為可以放心的堆特征,是以隻使用了兩類資料:播放量和播放人數,但是最後堆出來的特征次元達到了200多個次元,然後将b1按照不同的門檻值進行分成四個組,得到八個類别,并且最後得到了四組預測資料。
接下來就已經将模型建構完成了。實際上,對于不同門檻值的分類器的模型準确度是可以線下計算出來的,計算出來的準确度高的權值就大,準确度低的權值就比較低,最後保證權值和最後等于1就可以了。
datahacker團隊模型的最終得分是505151,這個分數領先其他團隊非常多,特别是在整個線上測試中,他們一直處于領先地位,而在更換資料集之後,資料量大了,datahacker團隊領先的幅度就更大了。datahacker團隊談到他們的模型有以下的優點:
使用了四個模型,滿足機器學習的“好而不同”的特點。
其實機器學習不一定對于性能有很高的影響,但是對于魯棒性的提升卻是會非常明顯的。加上模型融合以後,模型對更換資料集不敏感,對于任意足夠大,且總體參數穩定的資料集,都可以穩定的得到領先的分數。
模型對自身參數也不敏感,可以保證參數在一定範圍内的變化,得分保持在一個很高的水準上。對于gbdt的分類器而言,一般情況下不會調整參數,直接使用預設參數就可以。
<b>三、模型算法</b>
接下來,datahacker團隊簡單地介紹了他們的模型算法。第一點,由于沒有周期性資料,其實模型算法的建構比較困難。需要預測60天這樣一個比較長的時間,使用模型算法的滑窗法的話就會遇到困難,要麼就需要設計出60個模型,每個模型的時間間隔不同;要麼就設計時間間隔相同的模型,再将預測出來的資料作為訓練集帶入到後面的訓練中,這樣誤差就會累積,導緻結果非常差。是以datahacker團隊并沒有在模型算法上面花費太多的時間,因為他們通過之前的觀察認為v型模型是更适合的。
第二點,機器學習的回歸方法對訓練集的資料量要求很高。如果使用歸回方法的話,百萬級别的訓練集都無法支援數百維特征進行訓練,次元的要求就會非常低,這樣對于特征選擇就會有影響。特征數量的限制導緻無法充分利用資訊,進而影響了回歸模型的精度。在菜鳥-需求預測與分倉規劃比賽中,他們也使用了先分類再回歸的類似stacking的方法,取得了較好的成績,這次也用這種方法進行了模型回歸的嘗試。
因為是個探索性的嘗試,是以datahacker團隊直接利用了規則模型裡分類器的機率輸出,将4個分類器的輸出作為4維特征,對b1=後30天播放量的均值/前7天播放量的均值進行了xgboost回歸,最終可以得到後30天播放量均值的預測值。加上周期波動和節假日的修正,最終得分499000+。datahacker團隊談到比較遺憾的是對測評公式了解不夠透徹,賽後才學習到本次測評公式的最佳預測值應該低于均值。如果将最優值帶入的話,該方法還有提高的空間,而且與規則方法也有融合提高的空間。
接下來,datahacker團隊談了一下對于天池比賽的感想。datahacker團隊的成員基本都是經驗豐富的天池的老選手了,可以說見證了天池的成長,雖然時不時的都會編個段子黑天池,但這隻是段子手們笨拙的表達自己的喜愛之情的一種方式。毫無疑問,天池在大資料領域的影響力是有目共睹的。
datahacker團隊談到天池的算法平台是個非常令人激動的産品,遺憾的是功能還不完善:算法數量不夠,特别是時序分析算法,更是完全沒有。資料探索時最重的資料可視化方面更是有待完善,時間序列預測問題不能畫曲線圖實在有點說不過去。在最後datahacker團隊談到了共享機制,希望天池在未來能提供更好的代碼/代碼片段的共享機制,以及最重要的評論機制,畢竟無吐槽不社交。
<b>四、重要的事情</b>
1.始終保持概念清晰,對于任一模型、函數或者系統,都要非常準确的把握自變量和因變量,輸入和輸出分别是什麼。
2.資料挖掘的本質是擷取資訊,對于時間序列預測型競賽來說,資訊的來源有兩個:資料集和測評系統得分。
3.單一模型往往不能取得很好的成績,推薦實作結構簡單,但是實作上有一定複雜性的融合模型,融合模型總會具有更高的精度和更強的魯棒性。
4.資料清洗非常重要,大資料往往代表的是大量有問題的資料。
最後,分享給大家norbert wiener的一句話:要想改善對象的特性,必須從對象上擷取資訊,并将這種資訊反作用于對象上,這種作用就叫做控制。