更多精彩內容,歡迎關注公衆號:數量技術宅。想要獲取本期分享的完整策略代碼,請加技術宅微信:sljsz01html
咱們先來回顧一下,一個真實數據集的完整機器學習解決方案(上篇)提到,一個完整的機器學習工程的實現步驟:算法
1. 數據預處理數組
2. 探索性數據特徵統計安全
3. 特徵工程與特徵選取微信
4. 創建基線網絡
5. 機器學習建模dom
6. 超參數調優機器學習
7. 測試集驗證函數
在上篇的內容中,咱們介紹了第1到第4步的原理、代碼以及實現(可視化)結果,接下來,咱們將繼續完成這個系列的文章,爲你們介紹5-7步的詳細原理、流程、代碼。post
在進行正式的機器學習建模前,咱們還有兩項前置工做須要完成。首先,在數據預處理的步驟中,咱們剔除了缺失值大於必定比率的數據列,可是在剩下的數據列中,仍然存在着缺失值,對於這一小部分的缺失值,咱們將再也不丟棄相應的變量列,而是嘗試對於缺失值進行填補。
咱們讀入上一步拆分好的訓練數據集以及測試數據集
上圖中的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庫的官方文檔以瞭解詳細信息。咱們對如下的超參數組合進行調優:
首先肯定各個超參數的遍歷範圍取值,以構建一個超參數尋優網絡,對於梯度提高迴歸模型,咱們選擇以下的超參數尋優網絡
緊接着,咱們建立一個RandomizedSearchCV對象,經過sklearn庫中的內置函數,採用4折交叉驗證(cv=4),執行超參數尋優。
在完成超參數尋優的計算過程後,best_estimater方法將展現剛纔尋優過程當中找到的最佳超參數組合。
理論上,咱們能夠進行無限屢次的超參數尋優,不斷調整超參數的範圍以找到最優解,但技術宅不建議你們過分去執行這個步驟,對於一個機器學習模型來講,優秀的特徵工程,其重要性要遠大於普遍的超參數尋優遍歷。機器學習的收益遞減規律是指,特徵工程能對模型有較大提高,而超參調整則只能起到錦上添花的效果。
對於單一參數的調整尋優,咱們也能夠經過圖形可視化的方式進行觀察,好比下圖咱們僅改變決策樹的數量,來觀察模型的表現變化狀況。
隨着模型使用的樹的個數增長,訓練集偏差和測試集偏差都會減小。但咱們須要看到雖然訓練集的偏差一直在減小,但測試集的偏差,在樹的數量到達300-400後,幾乎不降低了。這就說明過分增長決策樹的個數,最終帶來的只是在訓練集上的過分擬合,而對測試集沒有什麼增量的幫助。
針對這種狀況,一方面咱們能夠增長樣本的數量,獲取更多的數據用於訓練、測試,另外一方面,咱們也能夠適當下降模型的複雜度。
在此前全部的數據處理和建模的步驟中,咱們都須要杜絕數據泄露的狀況發生,只有這樣,咱們才能在測試集上準確、客觀地評估模型的最終性能。
咱們對比超參數尋優前、尋優後,兩個模型在測試集上的表現,並以Mae做爲評估指標。
能夠看到,通過超參數尋優後肯定的模型,相比較未尋優的模型,Mae下降了約10%,也就是說模型的預測精度上升了10%,這個改善幅度,對於超參數尋優來講,已是一個不錯的幅度了。
但對於這個尋優的過程來講,是須要花費必定的時間成本的,例如咱們的這個尋優,相比原始的模型,花費了原始模型約10倍左右的時間,從1s不到到12s。這也說明了機器學習是一種「權衡遊戲」,咱們須要不斷地平衡準確性與可解釋性、誤差與方差、準確性與運行時間等表現。正確的組合是因問題而異的。
如今,咱們已經有了最終超參調優後的模型,就可使用該模型,來評估他們與真實值的誤差了,咱們對於測試集,繪製預測值與實際值的密度圖對比,以及預測值減去實際值所獲得的殘差hist圖,來對模型的預測效果進行可視化的展現。
咱們來分析一下這個可視化的結果:雖然模型預測值的密度峯值接近中值在66附近,而非真實值的100左右密度峯值,但模型預測值密度分佈大體接近實際值密度分佈。而模型預測值與真實值的殘差分佈,也是符合正態分佈的。
最後,這個結果說明了,咱們構建的梯度提高迴歸機器學習模型,可以較爲準確的預測樣本外的建築物能源之星得分,達到了咱們最初預測目標變量的這一實際目的。
那麼,咱們這個系列的文章(上篇、下篇)到這裏所有結束了,感謝耐心讀完長文的粉絲,技術宅真誠的但願,經過本身的文字,讓你有所收穫有所得。
關注 「數量技術宅」不迷路,您的點贊、轉發,是我輸出乾貨,最大的動力
【數量技術宅|量化投資策略系列分享】基於指數移動平均的股指期貨交易策略
AMA指標原做者Perry Kaufman 100+套交易策略源碼分享
【數量技術宅|金融數據系列分享】套利策略的價差序列計算,恐怕沒有你想的那麼簡單
【數量技術宅|量化投資策略系列分享】成熟交易者期貨持倉跟隨策略
【數量技術宅|金融數據分析系列分享】爲何中證500(IC)是最適合長期作多的指數
商品現貨數據很差拿?商品季節性難跟蹤?一鍵解決沒煩惱的Python爬蟲分享
【數量技術宅|金融數據分析系列分享】如何正確抄底商品期貨、大宗商品