一個真實資料集的完整機器學習解決方案(下)

數量技術宅發表於2020-12-18

更多精彩內容,歡迎關注公眾號:數量技術宅。想要獲取本期分享的完整策略程式碼,請加技術宅微信:sljsz01

我們先來回顧一下,一個真實資料集的完整機器學習解決方案(上篇)提到,一個完整的機器學習工程的實現步驟:

1. 資料預處理

2. 探索性資料特徵統計

3. 特徵工程與特徵選取

4. 建立基線

5. 機器學習建模

6. 超引數調優

7. 測試集驗證

在上篇的內容中,我們介紹了第1到第4步的原理、程式碼以及實現(視覺化)結果,接下來,我們將繼續完成這個系列的文章,為大家介紹5-7步的詳細原理、流程、程式碼。

機器學習建模

在進行正式的機器學習建模前,我們還有兩項前置工作需要完成。首先,在資料預處理的步驟中,我們剔除了缺失值大於一定比率的資料列,但是在剩下的資料列中,仍然存在著缺失值,對於這一小部分的缺失值,我們將不再丟棄相應的變數列,而是嘗試對於缺失值進行填補。

我們讀入上一步拆分好的訓練資料集以及測試資料集

一個真實資料集的完整機器學習解決方案(下)

上圖中的NaN,都代表著缺失的資料,我們採用一種簡單的填補方式,即以每列資料的中位數(Median)作為數值,填充到NaN中。

我們借用Scikit-Learn庫中封裝好的函式建立了一個以“中位數值替換”(median)為填補策略的Imputer物件。然後,在訓練集使用imputer.fit函式計算,用imputer.transform函式填充所有資料(訓練集+測試集)中的缺失值。這裡需要特別注意的是,測試集中的缺失值也將被相對應訓練集中的中值所填充,只有這種填充方式,才能嚴格的避免測試資料集的資料洩露。這部分的關鍵實現程式碼我們也貼在了下圖中。

一個真實資料集的完整機器學習解決方案(下)

第二項前置工作是資料的歸一化,我們知道,真實世界中不同的資料往往有不同的量綱,而且量綱之間差距也很大,如果不做歸一化,像支援向量機和K近鄰這些會考慮各項特徵之間距離的方法,會顯著地受到不同特徵量綱範圍不同的影響。儘管某些模型,比如線性迴歸、隨機森林,對特徵量綱不敏感,但考慮到模型的安全性,我們還是建議,所有的建模測試前,都加入這一步驟。

歸一化,具體來說,就是對特徵的每一個值減去該特徵對應的最小值併除以特徵值區間(區間=最大值減最小值),我們借用Scikit-Learn中的MinMaxScale函式實現。為避免資料洩露,我們同樣只使用訓練資料計算區間、最大值和最小值,然後轉換所有訓練集和測試集的資料。

一個真實資料集的完整機器學習解決方案(下)

在做完缺失值填補、特徵歸一化,這兩項前置工作後,接下來我們進入挑選機器學習模型的環節。目前,機器學習的模型日趨多元化,從大量現有的模型中選擇最適用當前資料集的模型並不是一件容易的事。

儘管有些“模型分析流圖”(以微軟製作圖為例)嘗試指引你選擇哪一種模型,但親自去嘗試多種演算法,並根據實際的結果判斷哪種模型效果最好,也許是更好的選擇,機器學習可以說是一個主要由經驗而不是理論驅動的領域。

一個真實資料集的完整機器學習解決方案(下)

雖然嘗試模型的順序無定式可言,但我們仍然可以遵循由簡至繁的基本規律,即從簡單的可解釋模型(如線性迴歸)開始嘗試,如果發現效能不足再轉而使用更復雜但通常更準確的模型。一般來說,模型的可解釋性與準確性,是幾乎不可同時達到的兩極,解釋性強,意味著犧牲準確性,相反準確性強,意味著模型複雜化,解釋力度變弱。

一個真實資料集的完整機器學習解決方案(下)

我們在綜合考慮解釋性、準確性的基礎之上,對於本文所涉及的資料集,採用線性迴歸、K鄰近、隨機森林、梯度提升、支援向量機這5種主流的機器學習模型,進行逐一的建模和結果比較。

完成所有資料清洗與格式化工作後,接下來的模型建立、訓練和預測工作反而相對簡單,我們主要通過Scikit-Learn庫(以下簡稱sklearn)完成,sklearn庫有詳細的幫助文件,對於各種機器學習的演算法,大家都可以參考幫助文件相關的方法說明。

我們以梯度提升模型(Gradient Boosting Regressor)為例,為大家展示從建立模型,到訓練模型,最後預測模型的這一過程,每個步驟,我們基本都可以藉助sklearn庫封裝好的函式來完成。

一個真實資料集的完整機器學習解決方案(下)一個真實資料集的完整機器學習解決方案(下)

對於其他的模型,我們只需要在構建模型的時候,呼叫不同的模型對應方法,即可在少量改寫程式碼的前提下,完成所有模型的訓練、評估。我們計算得到所有5個模型的Mae指標,並將該指標與基線(Baseline)進行比對。

一個真實資料集的完整機器學習解決方案(下)

回顧上文,我們此前計算得到的基線Mae指標的數值為24.5,上述5個模型的Mae都大幅低於基線數值,說明機器學習模型,在這個資料集上,對於最終的目標結果有比較顯著的預測能力的改進。

再來對比5個模型相互之間的Mae,可以看到梯度提升模型的Mae最低,而線性迴歸模型的Mae最高,這也反應了我們此前講述的邏輯,模型的可解釋度(複雜程度)與預測能力是一個反向的關係。

超引數調優

當然,在以上的模型訓練中,我們根據經驗設定了模型的超引數,並沒有對這些引數進行調優處理。對於一個機器學習任務,在確定模型後,我們可以針對我們的任務調整模型超引數,以此來優化模型表現。

在超引數調優工作前,我們先簡要介紹一下,超引數與普通引數定義的區別。機器學習中的超引數,通常被認為是資料科學家在訓練之前對機器學習演算法的設定,常見的有隨機森林演算法中樹的個數或K-近鄰演算法中設定的鄰居數等。

超引數的設定會直接影響模型“欠擬合”與“過擬合”的平衡,進而影響模型表現。欠擬合是指我們的模型不足夠複雜(沒有足夠的自由度)去學習從特徵到目標特徵的對映。一個欠適合的模型有著很高的偏差(bias),我們可以通過增加模型的複雜度來糾正這種偏差(bias)。而過擬合則相反,它指的是我們的模型過度記憶了訓練資料的情況,在樣本外的測試集會與訓練集有較大的偏差,對於過擬合,我們可以在模型中引入正則化的規則,在一定程度上加以避免。

對於不同的機器學習問題,每個問題都有其特有的最優超引數組合,不存在所有問題通用的最優解。因此,超引數的遍歷、尋優,是找到最優超引數組合的唯一有效方式。我們同樣借用sklearn庫中的相關函式完成超引數的尋優,並通過隨機搜尋(Random Search)、交叉驗證(Cross Validation)這兩種方法實現。

隨機搜尋(Random Search)是指,定義一個網格後採用隨機抽樣的方式,選取不同的超引數組合,隨機搜尋相比較普通的全網格搜尋,在不影響優化效能的前提下,大幅減少了引數尋優的時間。

交叉驗證(Cross Validation),又稱為K折交叉驗證,原始樣本被隨機劃分為k等份子樣本。在k份子樣本中,依次保留一個子樣本作為測試模型的驗證集,剩下的k-1子樣本用作模型訓練,重複進行k次(the folds)交叉驗證過程,每一個子樣本都作為驗證資料被使用一次。然後,這些摺疊的k結果可以被平均(或其他組合)產生一個單一的估計。最後,我們將K次迭代的平均誤差作為最終的效能指標。

一個真實資料集的完整機器學習解決方案(下)

我們還是以前文中舉例的梯度提升迴歸模型(Gradient Boosted Regressor)為例,來演示隨機搜尋與交叉驗證的過程。梯度提升迴歸模型(有多項超引數,具體可以檢視sklearn庫的官方文件以瞭解詳細資訊。我們對以下的超引數組合進行調優:

  • loss:損失函式的最小值設定
  • n_estimators:所使用的弱“學習者”(決策樹)的數量
  • max_depth:決策樹的最大深度
  • min_samples_leaf:決策樹的葉節點所需的最小示例個數
  • min_samples_split:分割決策樹節點所需的最小示例個數
  • max_features:最多用於分割節點的特徵個數

首先確定各個超引數的遍歷範圍取值,以構建一個超引數尋優網路,對於梯度提升迴歸模型,我們選擇如下的超引數尋優網路

一個真實資料集的完整機器學習解決方案(下)

緊接著,我們建立一個RandomizedSearchCV物件,通過sklearn庫中的內建函式,採用4折交叉驗證(cv=4),執行超引數尋優。

一個真實資料集的完整機器學習解決方案(下)

 

在完成超引數尋優的計算過程後,best_estimater方法將展示剛才尋優過程中找到的最佳超引數組合。

一個真實資料集的完整機器學習解決方案(下)

理論上,我們可以進行無限多次的超引數尋優,不斷調整超引數的範圍以找到最優解,但技術宅不建議大家過度去執行這個步驟,對於一個機器學習模型來說,優秀的特徵工程,其重要性要遠大於廣泛的超引數尋優遍歷。機器學習的收益遞減規律是指,特徵工程能對模型有較大提升,而超參調整則只能起到錦上添花的效果。

對於單一引數的調整尋優,我們也可以通過圖形視覺化的方式進行觀察,比如下圖我們僅改變決策樹的數量,來觀察模型的表現變化情況。

一個真實資料集的完整機器學習解決方案(下)

隨著模型使用的樹的個數增加,訓練集誤差和測試集誤差都會減少。但我們需要看到雖然訓練集的誤差一直在減少,但測試集的誤差,在樹的數量到達300-400後,幾乎不下降了。這就說明過度增加決策樹的個數,最終帶來的只是在訓練集上的過度擬合,而對測試集沒有什麼增量的幫助。

針對這種情況,一方面我們可以增加樣本的數量,獲取更多的資料用於訓練、測試,另一方面,我們也可以適當降低模型的複雜度。

測試集驗證

在此前所有的資料處理和建模的步驟中,我們都需要杜絕資料洩露的情況發生,只有這樣,我們才能在測試集上準確、客觀地評估模型的最終效能。

我們對比超引數尋優前、尋優後,兩個模型在測試集上的表現,並以Mae作為評估指標。

一個真實資料集的完整機器學習解決方案(下)

可以看到,經過超引數尋優後確定的模型,相比較未尋優的模型,Mae降低了約10%,也就是說模型的預測精度上升了10%,這個改善幅度,對於超引數尋優來說,已經是一個不錯的幅度了。

但對於這個尋優的過程來說,是需要花費一定的時間成本的,例如我們的這個尋優,相比原始的模型,花費了原始模型約10倍左右的時間,從1s不到到12s。這也說明了機器學習是一種“權衡遊戲”,我們需要不斷地平衡準確性與可解釋性、偏差與方差、準確性與執行時間等表現。正確的組合是因問題而異的。

一個真實資料集的完整機器學習解決方案(下)一個真實資料集的完整機器學習解決方案(下)

現在,我們已經有了最終超參調優後的模型,就可以使用該模型,來評估他們與真實值的偏差了,我們對於測試集,繪製預測值與實際值的密度圖對比,以及預測值減去實際值所得到的殘差hist圖,來對模型的預測效果進行視覺化的展示。

一個真實資料集的完整機器學習解決方案(下)一個真實資料集的完整機器學習解決方案(下)

我們來分析一下這個視覺化的結果:雖然模型預測值的密度峰值接近中值在66附近,而非真實值的100左右密度峰值,但模型預測值密度分佈大致接近實際值密度分佈。而模型預測值與真實值的殘差分佈,也是符合正態分佈的。

最後,這個結果說明了,我們構建的梯度提升迴歸機器學習模型,能夠較為準確的預測樣本外的建築物能源之星得分,達到了我們最初預測目標變數的這一實際目的。

那麼,我們這個系列的文章(上篇、下篇)到這裡全部結束了,感謝耐心讀完長文的粉絲,技術宅真誠的希望,通過自己的文字,讓你有所收穫有所得。

關注 “數量技術宅”不迷路,您的點贊、轉發,是我輸出乾貨,最大的動力

 


往期乾貨分享推薦閱讀

一個真實資料集的完整機器學習解決方案(上)

如何使用交易開拓者(TB)開發數字貨幣策略

股指期貨高頻資料機器學習預測

如何使用TradingView(TV)回測數字貨幣交易策略

如何投資股票型基金?什麼時間買?買什麼?

【數量技術宅|量化投資策略系列分享】基於指數移動平均的股指期貨交易策略

AMA指標原作者Perry Kaufman 100+套交易策略原始碼分享

【 數量技術宅 | 期權系列分享】期權策略的“獨孤九劍”

【數量技術宅|金融資料系列分享】套利策略的價差序列計算,恐怕沒有你想的那麼簡單

【數量技術宅|量化投資策略系列分享】成熟交易者期貨持倉跟隨策略

如何獲取免費的數字貨幣歷史資料

【數量技術宅|量化投資策略系列分享】多週期共振交易策略

【數量技術宅|金融資料分析系列分享】為什麼中證500(IC)是最適合長期做多的指數

商品現貨資料不好拿?商品季節性難跟蹤?一鍵解決沒煩惱的Python爬蟲分享

【數量技術宅|金融資料分析系列分享】如何正確抄底商品期貨、大宗商品

【數量技術宅|量化投資策略系列分享】股指期貨IF分鐘波動率統計策略

【數量技術宅 | Python爬蟲系列分享】實時監控股市重大公告的Python爬蟲

相關文章