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

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

引言

咱們到底應該怎麼學會、靈活使用機器學習的方法?技術宅作太小小的調研,許多同窗會選擇一本機器學習的書籍,或是一門機器學習的課程來系統性地學習。而在學完書本、課程後,並不清楚如何將這些理論、技術應用到實際的項目流程中
算法

這就比如,你的機器學習知識儲備中已經有了一塊塊碎片化的機器學習知識,但不知道怎樣才能將它們融合成一個總體。在本次的分享中,技術宅將借用國外機器學習大牛的數據,爲你們系統的講解一個針對真實數據集的完整機器學習解決方案,讓你碎片化的知識,一文成型微信

咱們先來看,一個完整的機器學習工程的實現步驟:機器學習

 

1. 數據預處理函數

2. 探索性數據特徵統計工具

3. 特徵工程與特徵選取post

4. 創建基線性能

5. 機器學習建模學習

6. 超參數調優測試

7. 測試集驗證

首先,咱們來看本次機器學習模型想要解決的問題 。咱們使用的是紐約市的公共可用建築能源數據(數據源下載地址:

http://www.nyc.gov/html/gbee/html/plan/ll84_scores.shtml),想要實現的是經過該數據集,利用機器學習算法創建模型,該模型能夠預測出紐約市建築物的能源之星評分,並且咱們要求實現的模型,即篩選出的影響評分的特徵,儘量具備可解釋性。咱們將使用範例數據集,經過Python對上述的每一個步驟,分步實現。而該項目的完整代碼,咱們也將在文章的最後分享給你們。

經過對於咱們想要實現的這一模型的簡單分析,能夠知道咱們須要作的是一個有監督的迴歸機器學習模型

其一,咱們訓練的數據集中,既有潛在的特徵變量,也有目標,整個學習過程就是找到目標與特徵之間的有效映射模型

其二,紐約市建築物的能源之星評分,是一個0-100的連續變量,而非分類標籤,構建的模型屬於迴歸的範疇

簡單分析完咱們想要解決的問題,接下來,咱們就遵循上述七個步驟,依次開發實現咱們想要的模型。

數據預處理

在實際的數據集中,包含互聯網數據、金融數據等,每每都會存在缺失值和異常值,咱們進行機器學習的建模,第一步就須要對數據進行清洗,並在清洗的過程當中處理這些缺失、異常。

咱們使用pandas讀取準備好的csv數據集

咱們讀入的Dataframe共有60列,此處只截取了一部分的數據因子。其中,能源之星得分(ENERGY STAR Score)是咱們須要預測的目標列,而其他的列,咱們均可以將它看做是潛在可以構成特徵的變量,對於這些列,咱們最好都可以清楚每一列的數據表明的含義,以便於咱們可以更好的在未來解釋這個模型。

對於咱們想要預測的目標列,能源之星得分(ENERGY STAR Score),咱們來作一個詳細的說明:該得分來自紐約州每一年所提交的能源使用狀況報告,使用的是1~100的百分制排名,分數越高越好,表明該建築物使用能源的效率的越高,相對來講更加節能環保。

接下來,咱們使用dataframe的info()方法查看每一列的數據類型:

能夠看到,其中有至關多的列屬於objects類型(非數據類型)。若是咱們須要用這些列來造成模型的特徵,就須要將其轉換爲數值數據類型。咱們將全部「Not Available」條目替換爲np.nan,而後再將相關列轉換爲float數據類型,如此一來,全部的列,就都歸入分析範圍了。

在處理完非數據類型的列後,咱們在進行機器學習模型訓練前,必須對缺失數據進行處理。缺失數據的處理方式通常有二者:刪除、填充,刪除指的是直接刪除缺失數據對應的行或列,而填充能夠有前向填充、均值填充等多種方式。對於樣例中的數據集,咱們先來看每列中缺失值的數量。

從上圖的統計結果中,%of Total Values列表示缺失數據量佔該列總數據量的百分比。對於缺失數據量超過必定比例的列,加入機器學習模型訓練數據,顯然會受到缺失值的影響,所以,咱們考慮剔除缺失值超過必定比例的列數據。

除了缺失數據外,咱們還須要對離羣數據進行進一步的處理,離羣數據或是由一些偶發現象產生,或是自己數據在存儲的過程當中出現了錯誤,它們會對特徵的計算值產生較大的影響。咱們對於離羣值採用縮尾處理(Winsorize) ,具體是指,對於低於第一四分位數(Q1) - 3 *四分位差、高於第三四分位數(Q3) + 3 *四分位差的數值,進行縮尾。

處理完缺失數據、離羣數據後,咱們進入下一環節。

探索性數據特徵統計

探索性數據統計分析(簡稱EDA)是對咱們預處理完的數據進行探索性分析的階段,經過EDA,咱們能夠初步知道數據的一些統計特徵,以幫助咱們更加合理的選擇和使用數據構建特徵。

單變量統計特徵

因爲全部數據列中,能源之星得分(ENERGY STAR Score)是最重要的、也是咱們要預測的目標變量,因而咱們先經過hist函數,畫出能源之星得分的直方圖,來看一下能源之星得分的一個具體的分佈。

經過hist繪製的直方圖能夠看到,能源之星得分這一目標變量,既不是均勻分佈,也不是相似正態分佈那樣的鐘形曲線,而是一個兩端分佈頻率極高,中間分佈頻率較低且不均勻的一個分佈。

這個分佈看上去比較奇怪,但若是仔細看一下能源之星得分的官方定義,它是基於「自我報告的能量使用」,也就是要求每一個建築物的全部者自行報告能源的使用狀況,這就比如每一個學生在考試的時候能自定成績,那誰又不想拿滿分呢?而對於0分頻率的忽然增高,或許是由於有些建築物年久失修,連全部者也幾乎放棄治療了。

可是,不管能源之星得分的分佈多麼不合乎常理,它都是咱們這個項目須要預測的惟一目標,咱們更須要關注的是如何準確的預測分數。

分組特徵

咱們能夠先用其中的某一個變量對全部的建築物進行一次分類,再在每一個分類中計算該分類的能源之星得分的數據分佈。咱們能夠按類別對密度圖進行着色,以查看變量對分佈影響。咱們首先查看建築物分佈類型對於能源之星得分的影響,以下是實現代碼與可視化結果。

上圖直觀地反應出了不一樣建築物類型,對於得分確實存在較大的影響,好比辦公樓在高得分段分佈頻率更高,而酒店的低得分區域分佈頻率更高。所以,建築物類型應該是一個比較重要的影響變量。因爲建築物類型是一個離散變量,咱們能夠經過對建築物類型進行獨熱編碼,將他們轉換爲數值變量。

咱們再來看一個紐約市下屬不一樣行政區域對於能源之星得分的影響,從下圖能夠看出,不一樣區域對於得分基本上沒有區分度,也能說明該變量大機率不是一個好的特徵變量。

相關性統計

咱們可使用皮爾遜(Pearson)相關係數來衡量目標與其餘數據列的相關關係,從而找到與目標變量相關性(正負)最強的列的排序。

咱們分佈截取了負相關性、正相關性最高的兩組變量,能夠看到,負相關性的變量,其相關性的絕對數值更高,而且最負相關的幾項類別變量幾乎都與能源使用強度(EUI)有關。EUI表示建築物的能源使用量是其規模或其餘特性的函數(越低越好)。直觀來看,顯著的負相關性是有意義的:隨着EUI的增長,能源之星評分趨於降低。

雙變量分析
咱們還可使用散點圖來對雙變量進行分析,並在散點圖中用不一樣顏色,表明某個變量所區分的不一樣子類別,好比下圖以不一樣建築物的類型做爲分類,繪製的能源之星評分與Site EUI(即負相關排名第一變量)的二維散點圖。

經過這個圖,能夠印證咱們在此前計算的相關性係數,不一樣類型的建築物,隨着SiteEUI的減小,能源之星得分呈現上升態勢。
此外,成對圖(Pairs Plot)也是一種很不錯的分析工具,好比4*4的Pairs Plot,咱們就能同時分析4組變量相互之間的聯合分佈與相關關係,咱們使用seaborn可視化庫和PairGrid函數來建立Pais Plot--上三角部分使用散點圖,對角線使用直方圖以及下三角形使用二維核密度圖和相關係數。

特徵工程與特徵選取

特徵工程和特徵選取,能夠說是整個機器學習項目中最爲關鍵的一步。一個機器學習模型在樣本內外可否有優異的表現,模型的構建與參數的選擇,並非最重要的,最重要的仍是特徵對於目標的預測能力。若是特徵的預測能力足夠強,即便簡單的線性模型,也能有較好的擬合能力。咱們先來簡單解釋一下特徵工程和特徵選取:

特徵工程:特徵工程是指經過原始數據,提取或建立新特徵,在這個過程當中,可能須要對部分原始變量進行轉換。例如對於某些非正態分佈數據取天然對數、對分類變量進行獨熱(one-hot)編碼,使得他們可以被歸入模型訓練中。

特徵選取:特徵選取在實際過程當中是一項須要經驗的操做,每每經過刪除無效或重複的數據特徵以幫助模型更好地學習和總結數據特徵並建立更具可解釋性的模型。特徵選擇更多的是對特徵作減法,只留下那些相對重要的特徵,在刪除的過程當中,須要特別注意避免重要特徵被刪除的狀況。

機器學習模型只能從咱們提供的數據和特徵中學習,因此必須確保數據中有預測咱們目前所須要的所有數據,若是咱們提供的數據特徵維度不夠豐富,最終的學習效果也許會達不到咱們的預期。

接下來,咱們對本次項目的數據集分兩塊進行特徵工程。第一是對於分類變量,採用獨熱(one-hot)編碼進行分類,轉換爲數值。獨熱(one-hot)編碼在模型的訓練數據中包含分類變量時,應用很常見。好比,咱們的某個變量包含三個類別,那麼就用00一、0十、100三個獨熱編碼,分別對應三個原始分類。

第二是對數值型數據取對數。咱們知道,不少原始的數據的分佈都不是正態分佈,若是咱們直接將數據放入模型訓練,可能存在由數據偏態分佈帶來的潛在誤差,因而,咱們對全部數值特徵取天然對數並添加到原始數據中。如下是上述兩個特徵工程操做步驟的Python代碼實現。

完成上述特徵工程後,咱們的變量維度又增長了許多(獨熱編碼、指數變換),這其中大機率存在着一些冗餘的變量,好比高度相關的變量。如下圖爲例,Site EUI與Weather Norm EUI,這兩個變量的相關係數高達0.997,顯然咱們不須要都作保留。

這些相關性很高的變量,在模型中咱們稱之爲共線性(collinear),消除變量之間的共線性,可以讓機器學習模型更魯棒而且具備更強的可解釋性。咱們將使用相關係數來識別和刪除共線性的冗餘特徵,具體作法是,咱們經過循環遍歷,兩兩計算除目標變量外全部變量的相關係數,當某兩個變量相關係數大於必定閾值,咱們就放棄其一,具體實現代碼以下。篩選完成後,剩下64列特徵和1列目標特徵(能源之星得分)。

創建基線(Baseline)

在完成特徵工程和冗餘特徵的篩選後,咱們開始下一步工做:創建模型績效對比的基準,咱們也把它稱之爲基線(Baseline)。咱們經過基線來與最終模型的績效評估指標對比,若是機器學習最終訓練獲得的模型沒有超越基線,那麼說明該模型並不適用該數據集,或是咱們的特徵工程特徵選取存在着問題。

對於迴歸問題,一個合理的基線是經過預估測試集中全部示例的運行結果爲訓練集中目標結果的均值,並根據均值計算平均絕對偏差(MAE)。選擇MAE做爲基線有兩方面考慮,一是它的計算簡單,二是其可解釋性強。

在計算基線前,咱們須要先將原始數據劃分爲訓練集和測試集,這也是爲了在後續的處理過程當中,絕對避免數據泄露的發生。咱們採用比較常規的70%原始數據進行訓練,30%用於測試。

劃分完訓練與測試集,咱們再計算MAE的數值,並計算基線。由下圖結果能夠看到,計算得出預估模型表現爲66,在測試集中的偏差約爲25左右(百分制)。能夠說是比較容易達到的性能。

深夜碼字,睏意襲來,上篇暫且先到這裏,下篇爭取明天更完

關注 「數量技術宅」不迷路(下篇精彩繼續),您的點贊、轉發,是我輸出乾貨,最大的動力

 


往期乾貨分享推薦閱讀

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

股指期貨高頻數據機器學習預測

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

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

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

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

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

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

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

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

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

【數量技術宅|金融數據分析系列分享】爲何中證500(IC)是最適合長期作多的指數

商品現貨數據很差拿?商品季節性難跟蹤?一鍵解決沒煩惱的Python爬蟲分享

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

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

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

相關文章
相關標籤/搜索