一個完整的機器學習項目在Python中的演練(一)

一個完整的機器學習項目在Python中的演練(一)

來自專欄 TensorFlowNews24 人贊了文章

歡迎大家關注我們的網站和系列教程:http://www.tensorflownews.com/,學習更多的機器學習、深度學習的知識!也可以搜索公眾號:磐創AI,關注我們的文章。

作者:磐石

大家往往會選擇一本數據科學相關書籍或者完成一門在線課程來學習和掌握機器學習。但是,實際情況往往是,學完之後反而並不清楚這些技術怎樣才能被用在實際的項目流程中。就像你的腦海中已經有了一塊塊」拼圖「(機器學習技術),你卻不知道如何講他們拼起來應用在實際的項目中。如果你也遇見過同樣的問題,那麼這篇文章應該是你想要的。本系列文章將介紹一個針對真實世界實際數據集的完整機器學習解決方案,讓您了解所有部分如何結合在一起。

本系列文章按照一般機器學習工作流程逐步進行:

  1. 數據清洗和格式化
  2. 探索性數據分析
  3. 特色工程和選擇
  4. 在性能指標上比較幾種機器學習模型
  5. 對最佳模型執行超參數調整
  6. 評估測試集合中的最佳模型
  7. 解釋模型結果
  8. 得出結論和文件工作

通過完成所有流程,我們將看到每個步驟之間是怎麼聯繫起來的,以及如何在Python中專門實現每個部分。該項目可在GitHub上闊以找到,附實現過程。第一篇文章將涵蓋步驟1-2,其餘的內容將在後面的文章中介紹。

問題定義

編碼之前的第一步是了解我們試圖解決的問題和可用的數據。在這個項目中,我們將使用紐約市的公共可用建築能源數據

(nyc.gov/html/gbee/html/)

目標:使用能源數據建立一個模型,可以預測建築物的能源之星評分(ENERGY STAR Score),並剖析結果以找出影響評分的因素。

我們可以拿到的數據中包括能源之星得分這一項,這使得這是一個監督回歸機器學習任務:

  • 監督:由於我們可以訪問特徵和目標,我們的目標是培養可以學習兩者之間映射的模型
  • 回歸:能源之星得分是一個連續變數

我們想要開發的是一個準確?(它可以預測能量之星得分並接近真實值)且可解釋的模型?(我們可以理解模型這種預測)。那麼,當我們明確這兩點之後,在我們深入挖掘數據並構建模型的過程中我們就有個更明確的標準來指引我們的決策。

數據清洗

與大多數數據科學課程所使用的數據不同,真實數據很混亂,並非每個數據集都是沒有缺失值或異常值的。這意味著在我們開始分析之前,我們需要清洗數據並將其轉換為可讀取的格式。數據清洗是大多數數據科學問題中必不可少的一部分。

首先,使用pandas(Dataframe)讀取數據並查看:

實際數據

這是一個含60列數據的完整數據的子集。我們可以看出幾個問題:首先,雖然我們知道我們想要預測的是能源之星得分(ENERGY STAR Score),但我們不清楚每一列的含義。儘管這也許不是個很必要問題,我們通常可以在不了解其他變數含義的情況下創建一個可能準確的模型,但我們希望更關注於模型的可解釋性,並且至少了解到某些列可能很重要。

當最初得到這個任務時,我先是關注到數據文件的名稱:

並開始搜索「Local_Law_84」相關資料,了解到這是一項紐約市要求所有具有一定規模的建築物報告其能源使用的法律。然後還查詢到了數據中對應每一列的含義。在這個過程中,耐心是很有必要的。

我們並不需要去研究所有的列的準確含義,但能源之星得分(ENERGY STAR Score)是我們必須精確了解·的。它被描述為:

來自每個報告年度所提交的能源使用情況報告,1~100的百分制排名(分數越高越好)。能源之星得分(ENERGY STAR Score)是對建築物能源效率的相對度量。

到這裡我們已經解決了第一個問題,接下來再分析下第二個問題–那些被填充」Not Available「的缺失值。我們可以使用以下dataframe.info()方法來查看列的數據類型:

可以看到,其中有一些明確包含數字(例如ft2)的列被存儲為objects。我們不能對字元串進行數值分析,所以這些數據需要轉換為數值數據類型。

這裡使用下面一小段Python代碼,將所有「Not Available」條目替換為」不是數字」(np.nan),然後將相關列轉換為float數據類型:

一旦相應列都轉換成了數字,我們就可以開始進行數據分析。

缺失數據和異常值

除了異常的數據類型外,處理真實數據時的另一個常見問題是數據缺失。這些數據缺失往往是由很多因素造成,在我們訓練機器學習模型之前必須填寫或刪除。首先,讓我們了解每列中有多少缺失值。(代碼參見github)

儘管刪除信息需要格外小心,但對於那些缺失值的比例很高的列,它們對於模型的訓練很有可能是沒有意義的。刪除這些列的具體閾值取決於具體問題,對於本項目來說,我們選擇刪除缺失值超過50%的列。

然後,我們還需要對異常值做處理。那些異常值可能是由於數據輸入中的拼寫錯誤或者錯誤統計等等原因造成的,或者一些不是上述兩個原因但是對模型訓練沒有好處的極端值。對於這個項目,我們將根據極端異常值(extreme outliers)的定義itl.nist.gov/div898/han)來處理異常值:

  • 低於第一四分位數(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–上三角部分使用散點圖,對角線使用直方圖以及下三角形使用二維核密度圖和相關係數。

我們通過查找一行與列相交的位置,查看變數之間的交互關係。除了看起來很酷之外,這些圖可以幫助我們決定在建模中包含哪些變數。

https://towardsdatascience.com/a-complete-machine-learning-walk-through-in-python-part-one-c62152f39420)

最後,對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站!http://www.tensorflownews.com。我們的公眾號:磐創AI。

推薦閱讀:

python3機器學習經典實例-學習筆記8-分類演算法
使用Python第三方庫pdfminer提取PDF內容,並解決中文編碼不支持的問題
Python--使用Tor瀏覽器隱藏IP
「男友讓我打十萬個「對不起」,漢字標上多少遍。」這個問題用 R 如何實現?
Python3 pandas庫 (29) 逆透視與stack()

TAG:數據挖掘 | Python |