當我們在進行機器學習領域的學習和研究時,遇到的第一個難點就是數據探索性分析(Exploratory Data Analysis)。雖然從各種文獻中不難了解到數據探索性分析的重要性和一般的步驟流程,但是在面對實際問題時,往往會有不知道從哪兒下手以及不知道怎麼根據分析結果來優化算法的困境。本文通過對真實業務場景數據的探索性分析及建模與優化,嘗試對其進行解構,揭示其真實的意圖和作用,希望能對同行有所啟示。本文採用kaggle平臺上正在進行的Jane Street 市場交易預測比賽數據,該比賽要求參賽選手設計一個量化交易預測模型,利用全球主要證券所得市場數據識別最有效的交易,從而實現回報最大化。
數據探索性分析首先要根據數據集所描述的主體含義,即這個數據集蘊含的背景知識,確定其所屬的問題領域,通常通過對業務的深刻理解實現。以Jane Street市場交易預測比賽數據為例,我們首先要理解這個交易預測模型的目的是實現交易牟利最大化,也就是最大限度的實現「低買高賣」,但是由於市場的波動性這個目的很難實現。因此給定一組交易的歷史相關數據(例如股票市場的)和歷史回報率,希望能訓練出模型,能夠根據當前交易的實時相關數據,準確預測該交易的未來回報率,從而篩選出那些回報率高的交易進行操作,回報率低的交易不進行操作。通過對業務背景的解讀,我們大致判斷這是一個時間序列類的預測問題,根據操作和不操作兩種行為,進一步判斷出其是時間序列二分類預測問題。有了對問題領域的大致判斷,接下來結合業務背景知識對數據集進一步展開分析。首先觀察數據集中訓練集和測試集的特徵列,如圖1所示。
發現訓練集比測試集多了五列特徵,分別是resp_1、resp_2、resp_3、resp_4、resp,resp大致可以猜測代表回報率,可是為什麼有五列回報率?我們再回到業務背景中去找答案,業務背景中描述resp_1~resp_4代表不同時間範圍內的回報率。不是很理解什麼含義,分析一下resp和resp_1~resp_4的相關性,使用熱力圖進行可視化分析。
通過熱力圖可視化相關性發現,這五列回報率間存在很明顯的相關性,並且越臨近的列相關性越高。再選取前10行數據用折線圖觀察下各列回報率的波動狀況。
大致可以理解,每筆交易的回報率都是隨著時間時刻變化的,resp代表交易時刻的回報率,resp1~resp4代表交易時刻前四個時點的回報率。也就是說,每筆交易的回報率本身也是一個時間序列,在預測進行交易是否進行時,可以依據當前時刻的resp值進行判斷,也可以嘗試依據給定時間周期內整體的回報率趨勢進行判斷。如果依據當前時刻resp值進行是否交易的判斷,resp<0時目標值action=0,且resp>0時目標值action=1,則數據集的目標值分布如下圖(a)所示,如果依據回報率區間整體均值和最大值進行是否交易的判斷,其目標值分布如下圖(b)和(c)所示。回報率的使用對目標值分布有一定的影響,可能是影響模型準確性的因素之一。
圖(a) 圖(b) 圖(c)
通過對數據業務背景的解讀,我們已經得知所需要解決的是一個典型的時間序列二分類預測問題,並且其目標值需要通過一組時間序列來確定。當對整體問題有了大致了解,接下來就需要針對具體的特徵變量進行具體分析,分析從三個方面進行。特徵含義往往結合特徵變量的名稱。部分特徵變量往往通過名稱就可以大致了解其含義,了解其特徵含義可以幫助我們更好的理解數據本身,協助建模。本文中使用的數據總共有133列特徵,其中名稱有意義的特徵列為『date』,『weight』和『ts_id』,其他列從』feature_0』~』feature_129』,明顯是做過匿名處理的特徵,暫不做分析。對名稱有意義的特徵進行分析。其中『ts_id』列因為標明是ID列,並且其序號從0開始到2390490無重複,與數據集行數相同,並且因為是時間序列類數據,故可認定其為按一定時間先後排序的交易序列號。『date』列顧名思義可知是日期類,觀察其具體取值是從0~500的整數,估計每個取值代表一天,並且『date』每個取值對應的交易數量不同,其分布如下圖所示,橫坐標代表』date』取值,縱坐標代表每一個』date』取值區間對應的『ts_id』數量。可以發現交易數量的分布並不平穩,大致以date值85為界限,之前與之後的交易數據分布有明顯的差異。
『weight』列含義為權重,結合背景知識中權重和回報率一起作為評價函數的輸入項,並且』weight』為0的交易不影響最終評價函數的評分,大致可以判斷其是一個代表交易的盈利率或者說重要性的指標。觀察其分布如下圖所示。
其中權重為0的數據大約佔總數據量的17.1%,也就是說原始數據集中有17.1%的交易數據,是否進行交易對評價結果不產生影響,可以在訓練模型時去掉。接下來對『feature_0』~』feature_129』這130維特徵進行分析,雖然特徵已經做了匿名處理,但是還提供了一個features.csv的文件,描述了特徵的一些情況,對其進行分析。文件總共包含30個標籤,分別對130維特徵進行了True和False的標記,對每維特徵的標籤數量分析如圖7所示。可以發現『feature_0』特徵比較特殊,一個標籤也沒有,其他特徵都至少存在一個標籤,最多不超過四個標籤,『feature_0』特徵可能需要給與比較多的關注。經過前面的分析,對數據已經有了相對清晰的認知,接下來要對『feature_0』~『feature_129』這130維特徵做「髒數據」分析,主要包括缺失值和異常值的分析。缺失值分析可以通過統計特徵集中的null值個數實現,各特徵的缺失率如下圖所示。
可以分析得知,130維特徵中有88維特徵存在缺失值,平均缺失率大致為2.18%,最大缺失率為16.55%,缺失率最大的四個特徵是『feature_17』,『feature_18』,』feature_27』,』feature_28』,考慮到缺失率沒有超過50%,可以先不處理,也可以在建模時用均值或者分位數填充。異常值分析可以考慮使用箱線圖,部分特徵的箱線圖如下圖所示:
從圖9中發現,除了『feature_0』外,其他特徵都存在許多偏離較大的異常值,可以考慮進行移除。完成特徵「髒數據」分析後通常會繼續對特徵進行統計分布分析。首先判斷特徵是否是正態分布的,對於非正態分布的特徵可以考慮進行相應轉換。之所以希望特徵是正態分布的,是因為機器學習領域的很多模型是基於數據服從正態分布的假設,所以如果數據服從正態分布,會對模型的訓練效果有比較明顯的提升。可以使用Q-Q圖對特徵進行分析,部分特徵的Q-Q圖如下圖所示。
可以發現,很多特徵變量的數據分布都不是正態的,後續可以使用數據變化對其進行處理其次對比訓練集和特徵集的數據分布是否一致,對於分布不一致的特徵,考慮進行刪除處理。本文使用KDE分布圖來進行觀察。130維特徵中沒有發現訓練集和測試集明顯分布不一致的特徵。
最後對特徵的相關性進行分析,用來發現特徵變量和目標變量間、以及特徵變量之間的關係,為特徵工程中提取特徵做準備。本文使用相關性熱力圖來進行觀察。觀察與目標值’resp』相關性最高的10個特徵變量。
發現一個非常有意思的現象,與目標值’resp』相關性最高的10維特徵,彼此間的相關性也非常高,建模時如果選擇線性回歸模型,需要對相關性高的特徵多加關注。
所有的數據探索性分析最終都是為建模進行服務的。通過上文的數據探索性分析,可以指導我們進行建模。通過對數據業務背景的解讀,我們得知需要建立的是一個基於時間序列的二分類預測模型,可以先採用決策樹類模型做基礎模型,本文使用了Xgboost分類模型,不對原始數據做任何處理,直接用xgboost模型進行預測分類,訓練集和驗證集比例為7:3時,基礎得分為4078.620。首先結合對特徵含義的分析。考慮過濾掉weight特徵值為0的特徵,模型得分提升到4292.947,同時調整訓練集和驗證集的比例分布,當訓練集和驗證集比例為9:1時,模型得分提升到4601.8。用resp_1,resp_2,resp_3,resp_4,resp五列回歸值的均值判斷action取值,替代單純的根據resp判斷action取值,模型得分提升到5277.285。其次結合對特徵異常值的分析。由於使用的是樹類模型,對缺失值不敏感,可以將缺失值統一處理為-999,也可以用特徵的均值替代,對於樹類模型來說,模型得分沒有明顯的提升。接下來考慮對部分非正態分布的特徵進行轉化,當對標籤為』feature_1』,』feature_2』,』feature_41』,』feature_42』的特徵進行log變化,將其轉換為正態分布時,模型得分提升到了6310.758。根據數據探索性分析的結果,完成了第一輪的建模和優化,將模型得分從基礎分4078.620,提升到了6310.758,提升率達到54.7%,效果很顯著。第一輪建模和優化完成後進入了一段瓶頸期,於是再次回到數據探索性分析,嘗試解構出更多的信息。仍然從特徵開始,我注意到『date』這一列特徵,作為時間序列類問題最重要的特徵,應該有繼續挖掘的價值。首先結合不同日期值交易數量分布圖(圖5),可以觀察到以date=85為界限,之前的日交易頻率明顯比之後的高,不了解是因為什麼原因導致的。根據kaggle網站上的一些建議,嘗試放棄掉前85天的數據,只用後415天的數據進行建模,模型得分提升到了6390,再稍微調整下參數,最終達到了6405.901。調整參數的時候,發現之前建模時犯了一個錯誤,date這維特徵本身有時間約束,建模時不能用未來的數據對歷史的數據做驗證,所以改變了之前隨機劃分訓練集和測試集的方式,改變使用前385天的數據訓練,後30天的數據驗證,模型得分提升到了7040.166,嘗試調整下訓練集和測試集的比例,當使用前375天的數據訓練,後40天的數據驗證時效果最好,模型得分為8757.05,,在第一輪的基礎上又提升了38.7%。僅僅通過兩輪數據探索性分析,便極大地優化了模型,顯著提升了預測的效果,由此可見其重要性。並且數據探索性分析可以持續迭代進行,不斷挖掘出數據集內隱藏的一些特徵,加深我們對於背景知識的理解,指引我們進行有效的特徵工程,並且為建立模型和優化模型提供理論依據,是進行數據挖掘和機器學習最有效的輔助手段。