一個完整的機器學習專案在Python中的演練(一)
編譯 | 磐石
出品 | 磐創AI技術團隊
【磐創AI導讀】:本文是機器學習實戰專案演連繫列第一篇,主要介紹了資料清洗與EDA兩個部分。歡迎大家點選上方藍字關注我們的公眾號:磐創AI。
大家往往會選擇一本資料科學相關書籍或者完成一門線上課程來學習和掌握機器學習。但是,實際情況往往是,學完之後反而並不清楚這些技術怎樣才能被用在實際的專案流程中。就像你的腦海中已經有了一塊塊”拼圖“(機器學習技術),你卻不知道如何講他們拼起來應用在實際的專案中。如果你也遇見過同樣的問題,那麼這篇文章應該是你想要的。本系列文章將介紹一個針對真實世界實際資料集的完整機器學習解決方案,讓您瞭解所有部分如何結合在一起。
本系列文章按照一般機器學習工作流程逐步進行:
1. 資料清洗與格式處理
2. 探索性資料分析
3. 特徵工程和特徵選取
4. 機器學習模型效能指標評估
5. 微調最佳模型(超引數)
6. 在測試集上評估最佳模型
7. 解釋模型結果
8. 總結分析
透過完成所有流程,我們將看到每個步驟之間是怎麼聯絡起來的,以及如何在Python中專門實現每個部分。該專案可在GitHub上可以找到,附實現過程。第一篇文章將涵蓋步驟1-2,其餘的內容將在後面的文章中介紹。
問題定義
編碼之前的第一步是瞭解我們試圖解決的問題和可用的資料。在這個專案中,我們將使用紐約市的公共可用建築能源資料。
()
目標:使用能源資料建立一個模型,可以預測建築物的能源之星評分(ENERGY STAR Score),並剖析結果以找出影響評分的因素。
我們可以拿到的資料中包括能源之星得分這一項,這使得這是一個監督迴歸機器學習任務:
· 監督:由於我們可以訪問特徵和目標,我們的目標是培養可以學習兩者之間對映的模型
· 迴歸:能源之星得分是一個連續變數
我們想要開發的是一個準確 (它可以預測能量之星得分並接近真實值)且可解釋的模型(我們可以理解模型這種預測)。那麼,當我們明確這兩點之後,在我們深入挖掘資料並構建模型的過程中我們就有個更明確的標準來指引我們的決策。
資料清洗
與大多數資料科學課程所使用的資料不同,真實資料很混亂,並非每個資料集都是沒有缺失值或異常值的。這意味著在我們開始分析之前,我們需要清洗資料並將其轉換為可讀取的格式。資料清洗是大多數資料科學問題中必不可少的一部分。
首先,使用pandas(Dataframe)讀取資料並檢視:
實際資料
這是一個含60列資料的完整資料的子集。我們可以看出幾個問題:首先,雖然我們知道我們想要預測的是能源之星得分(ENERGY STAR Score),但我們不清楚每一列的含義。儘管這也許不是個很必要問題,我們通常可以在不瞭解其他變數含義的情況下建立一個可能準確的模型,但我們希望更關注於模型的可解釋性,並且至少了解到某些列可能很重要。
當最初得到這個任務時,我先是關注到資料檔案的名稱:
並開始搜尋“Local_Law_84”相關資料,瞭解到這是一項紐約市要求所有具有一定規模的建築物報告其能源使用的法律。然後還查詢到了資料中對應每一列的含義。在這個過程中,耐心是很有必要的。
我們並不需要去研究所有的列的準確含義,但能源之星得分(ENERGY STAR Score)是我們必須精確瞭解·的。它被描述為:
來自每個報告年度所提交的能源使用情況報告,1~100的百分制排名(分數越高越好)。能源之星得分(ENERGY STAR Score)是對建築物能源效率的相對度量。
到這裡我們已經解決了第一個問題,接下來再分析下第二個問題--那些被填充”Not Available“的缺失值。我們可以使用以下dataframe.info()方法來檢視列的資料型別:
可以看到,其中有一些明確包含數字(例如ft²)的列被儲存為objects。我們不能對字串進行數值分析,所以這些資料需要轉換為數值資料型別。
這裡使用下面一小段Python程式碼,將所有“Not Available”條目替換為”不是數字”(np.nan),然後將相關列轉換為float資料型別:一旦相應列都轉換成了數字,我們就可以開始進行資料分析。
缺失資料和異常值
除了異常的資料型別外,處理真實資料時的另一個常見問題是資料缺失。這些資料缺失往往是由很多因素造成,在我們訓練機器學習模型之前必須填寫或刪除。首先,讓我們瞭解每列中有多少缺失值。(程式碼參見github)
儘管刪除資訊需要格外小心,但對於那些缺失值的比例很高的列,它們對於模型的訓練很有可能是沒有意義的。刪除這些列的具體閾值取決於具體問題,對於本專案來說,我們選擇刪除缺失值超過50%的列。
然後,我們還需要對異常值做處理。那些異常值可能是由於資料輸入中的拼寫錯誤或者錯誤統計等等原因造成的,或者一些不是上述兩個原因但是對模型訓練沒有好處的極端值。對於這個專案,我們將根據極端異常值(extreme outliers)的定義()來處理異常值:
· 低於第一四分位數(Q1) - 3 *四分位差
· 高於第三四分位數(Q3) + 3 *四分位差
(有關刪除列值和異常值的程式碼,請參閱github)。在資料清洗和異處理異常值之後,我們剩下11,000多個buildings和49個features。
探索性資料分析(EDA)
現在,我們已經完成了資料清洗這個略微乏味的步驟。接下來就可以對我們的資料進行探索性分析了。探索性資料分析(EDA)是分析資料集以總結其主要特徵的方法,通常使用視覺化的方法。
簡而言之,EDA的目標是瞭解我們的資料可以告訴我們什麼,以幫助我們合理選擇和使用資料特徵。
單變數圖(EDA中使用的典型圖形技術之一)
我們的目標是預測能源之星得分ENERGY STAR Score(在我們的資料集中被重新命名為score),所以我們可以從檢查這個單變數(ENERGY STAR Score)的分佈開始。直方圖是一種視覺化單個變數分佈的簡單而有效的方法,使用matplotlib很容易就可以實現。
從上圖可以看出能源之星得分(ENERGY STAR Score)分佈是不均勻的,最高分100分和最低分1分有佔很大一部分。然而,能源之星得分是一個百分位數,我們希望看到一個統一的分佈,每個得分分配給相同數量的建築物。
如果我們回到能源之星得分的定義,我們會看到它是基於“自我報告的能量使用”,這可能就解釋了為什麼會有這麼多非常高的分數。要求建築物所有者報告自己的能源使用情況就像要求學生在測試中報告自己的分數一樣,高分往往會居多。因此,這可能不是衡量建築物能效的最客觀標準。
如果我們有無限空閒時間,我們可也許能想要調查為什麼這麼多建築物有非常高或非常低的分數,甚至可以透過選擇這些建築物並分析它們的共同點。但是,我們的目標只是預測分數,而不是設計更好的建築物評分方法。所以,我們可以在我們的報告中記下分數具有可疑分佈,但我們主要關注的還是分數預測。
尋找關係
剖析功能和目標之間的關係是EDA的主要步驟之一。與目標相關的變數對模型很有用。檢查目標上的分類變數(僅採用有限的一組值)的效果的一種方法是透過使用該seaborn庫的密度圖。
密度圖視覺化了單個變數的分佈,它也可以被看作是一個平滑的直方圖。我們可以按類別對密度圖進行著色,以檢視變數對分佈影響。下面的程式碼建立了一個視覺化不同建築物型別(僅限於具有超過100個資料點的建築物型別)的能源之星得分密度圖:
我們可以看到建築型別對能源之星評分有重大影響。辦公樓往往有較高的分數,而酒店的分數較低。這告訴我們,我們應該在建模中包含建築型別這一類,因為它確實對目標有影響。作為一類變數,我們將不得不對建築物型別進行獨熱編碼。
一個類似的繪製可以用來視覺化自治市鎮的能源之星得分如下:自治市鎮對建築型別的評分似乎沒有太大的影響。儘管如此,我們也希望將其納入我們的模型中,因為各區之間存在細微的差異。
我們可以使用皮爾遜(Pearson)相關係數量化變數之間的關係。皮爾遜(Pearson)相關係數是衡量兩個變數之間的線性關係的強度和方向的一種方法。+1分是表示完美的線性正相關關係,-1分是表示完美的負線性關係。相關係數的幾個值如下所示:
雖然相關係數無法捕捉非線性關係,但它是開始分析變數之間如何取得相關性的好方法。在Pandas中,我們可以輕鬆計算出資料列之間的相關性:
與目標的最正相關(上)和最負相關(下):
從上圖可以看出成最負相關的幾項類別變數幾乎都與能源使用強度(EUI)有關。能源使用強度(EUI)是表示建築物的能源使用量是其規模或其他特性的函式(越低越好)。直觀地說,這些相關性是有意義的:隨著EUI的增加,能源之星評分趨於下降。
雙變數圖
我們使用散點圖來表現兩個連續變數之間的關係,這樣可以在點的顏色中包含分類變數等附加資訊。例如,下面的圖表就體現了建築物型別的能源之星評分對比Site EUI:
透過這個圖,我們可以看出-0.7的相關係數變化。隨著Site EUI減少,能源之星得分增加,這種關係在建築型別中保持穩定。
我們最後討論一下成對圖(Pairs Plot)。這是一種很好的探索性分析工具,它可以讓我們看到多個變數對之間的關係以及單個變數的分佈。在這裡,我們使用seaborn視覺化庫和PairGrid函式來建立Pais Plot--上三角部分使用散點圖,對角線使用直方圖以及下三角形使用二維核密度圖和相關係數。
我們透過查詢一行與列相交的位置,檢視變數之間的互動關係。除了看起來很酷之外,這些圖可以幫助我們決定在建模中包含哪些變數。
本次主要介紹了流程中的前兩部分,敬請期待後邊的剖析。(編譯自:)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555081/viewspace-2216047/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一個完整的機器學習專案在Python中的演練(三)機器學習Python
- 一個完整的機器學習專案在Python中的演練(二)機器學習Python
- 一個完整的機器學習專案在Python中演練(四)機器學習Python
- 一個完整的機器學習專案在Python中演練(三)機器學習Python
- [譯]Python中的非同步IO:一個完整的演練Python非同步
- 機器學習入門系列(2)--如何構建一個完整的機器學習專案(一)機器學習
- 一個完整的scrapy 專案
- 一個練習專案,好玩的bbs-python-cherrypyPython
- 一個練習專案,好玩的bbs-python-flaskPythonFlask
- 一個練習專案,好玩的bbs-python-bottlePython
- 泰坦尼克生還預測:完整的機器學習專案(一)機器學習
- 一個專案完整的管理流程有哪些
- 一個練習專案,好玩的bbs-python-tornadoPython
- 一個練習專案,好玩的bbs-python-pyramidPython
- 完整的設計一個專案需要什麼?
- 完整的python專案例項-python完整專案Python
- python實戰一個完整的專案-年終課程盤點|16 個 Python 綜合實戰專案合集Python
- 機器學習專案中不可忽視的一個密辛 - 大數定理機器學習
- 一個練習專案,好玩的bbs-1
- 一個練習專案,好玩的bbs-javaJava
- 一個練習專案,好玩的bbs-c#C#
- webpack實戰(一):真實專案中一個完整的webpack配置Web
- 一個小而全的Python專案示例Python
- 在專案中建立一個使用者
- 開源一個功能完整的SpringBoot專案框架Spring Boot框架
- 推薦:一個適合於Python新手的入門練手專案Python
- 記一次完整的專案部署
- 開源一個機器學習文字分析專案機器學習
- 在開發過程中終止一個專案的想法
- 什麼是攻防演練?攻防演練包含哪些專案?
- 在專案中遇到的一些bug
- 完整的python專案例項-Python例項練手專案彙總(附原始碼)Python原始碼
- GitHub最著名的20個Python機器學習專案!GithubPython機器學習
- 經驗&教訓分享:我的第一個機器學習專案機器學習
- 分享一個完整的社群專案(Android端加後臺)Android
- 實戰 | 如何上線一個機器學習專案?機器學習
- 使用Express MongoDB開發一個完整MVC專案ExpressMongoDBMVC
- 如何5分鐘跑起來一個完整專案?