一個完整的機器學習專案在Python中的演練(二)

磐創AI發表於2018-10-11

一個完整的機器學習專案在Python中的演練(二)

編譯 | 磐石

出品 | 磐創AI技術團隊

【磐創AI導讀】:本文主要介紹了本系列的第三項特徵工程與特徵選擇。歡迎大家點選上方藍字關注我們的公眾號:磐創AI(本系列第一篇:點選檢視)

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

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

1.  資料清洗與格式處理

2.  探索性資料分析

3.  特徵工程和特徵選取

4.  機器學習模型效能指標評估

5.  微調最佳模型(超引數)

6.  在測試集上評估最佳模型

7.  解釋模型結果

8.  總結分析

通過完成所有流程,我們將看到每個步驟之間是怎麼聯絡起來的,以及如何在Python中專門實現每個部分。該專案可在GitHub上可以找到,附實現過程。第二篇文章將詳細介紹第三個步驟,其餘的內容將在後面的文章中介紹。

特徵工程和特徵選擇

特徵工程和特徵選擇雖然是完成機器學習專案中很小的一個環節,但它模型最終的表現至關重要。在特徵工程與特徵選擇階段做的工作都會準時在模型的表現上得以體現。首先,讓我們來了解一下這兩項任務是什麼:

  •  特徵工程:特徵工程是一項獲取原始資料並提取或建立新特徵的過程。也就是說可能需要對變數進行轉換。例如通過取自然對數、取平方根或者對分類變數進行獨熱(one-hot)編碼的方式以便它們可以在模型中更好的得以利用。通常來說,特徵工程就是通過對原始資料的一些操作構建額外有效特徵的過程。(詳細介紹可參考https://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/

  • 特徵選擇:特徵選擇是一項選擇資料中與任務最相關的特徵的過程。在特徵選擇的過程中,我們通過刪除無效或重複的資料特徵以幫助模型更好地學習和總結資料特徵並建立更具可解釋性的模型。通常來說,特徵選擇更多的是對特徵做減法,只留下那些相對重要的特徵。(詳細介紹可參考https://machinelearningmastery.com/an-introduction-to-feature-selection/

因為機器學習模型只能從我們提供的資料中學習特徵,所以確保資料包含我們任務的所有相關資訊至關重要。如果我們沒有給模型提供正確的資料,那麼機器學習模型將不會達到我們所期望的表現。

在本專案中,我們將按照以下步驟完成特徵工程

  • 獨熱(one-hot)編碼分類變數(borough和 property use type)

  • 對數值變數做自然對數轉換並作為新特徵新增到原始資料中

獨熱(one-hot)編碼對於在模型訓練中包含分類變數是必要的。例如:機器學習演算法無法理解“辦公室”這種建築型別,因此如果建築物是辦公室,則必須對其進行將其記錄為1,否則將其記錄為0

新增轉換的特徵可以使我們的模型學習到資料中的非線性關係。取平方根、取自然對數或各種各樣的數值轉換是資料科學中特徵轉換的常見做法,並通過領域知識或在多次實踐中發現最有效的方法。這裡我們將對所有數值特徵取自然對數並新增到原始資料中。

下面的程式碼實現了數值特徵選擇並對這些特徵進行了取對數操作,選擇兩個分類變數並對這些特徵進行獨熱(one-hot)編碼、然後將兩列特徵連線在一起。這一系列操作可以通過pandas庫很快捷的實現。

一個完整的機器學習專案在Python中的演練(二)

完成上述操作之後,我們有110列(features)、總共超過11,000個物件(buildings)。但是,這些特徵並非所有都能夠對預測能源之星得分(ENERGY STAR Score)有用,所以接下來我們將通過特徵選擇去除一些變數。

特徵選擇

在上面做特徵工程的過程之後得到的資料中的110列特徵,許多都是多餘或重複的,因為它們彼此高度相關。

例如,下圖是Site EUI與Weather Norm EUI相關係數為0.997的情況。

一個完整的機器學習專案在Python中的演練(二)

一個完整的機器學習專案在Python中的演練(二)


那些相互之間有很強關聯性的特徵被稱為共線(collinear)https://en.wikipedia.org/wiki/Multicollinearity,而且消除這些特徵對中的一個變數通常可以使機器學習模型更魯棒並且具有更強的可解釋性。(需要注意的一點是,現在是在討論特徵與其他特徵的相關性,而不是與目標的相關性。)

有許多方法可以計算特徵之間的共線性(collinearity),其中最常見的是方差膨脹因子(VIF)。在本專案中,我們將使用相關係數來識別和刪除共線特徵。如果它們之間的相關係數大於0.6,我們將放棄一對特徵中的一個。

一個完整的機器學習專案在Python中的演練(二) 

也許你會認為這個值(0.6)是隨便定義的,其實並不是,而是通過多次嘗試不同的閾值比較後得到的。使用0.6這個值可以產生了最好的模型。機器學習是一個經驗性領域,通常是通過試驗發現效能最好引數組合。選擇特徵後,我們剩下64列特徵和1列目標特徵(能源之星得分)。

一個完整的機器學習專案在Python中的演練(二)

 

建立基線

我們現在已經完成了資料清洗,探索性資料分析和特徵工程,開始建立模型之前還需要做最後一步:建立一個初步的基線(baseline)。這實際上是設定一項可以用來核對我們最終模型的實際表現的預估表現。我們可以通過拿最終模型表現與預估模型表現做比較反過來評測此次專案的整體思路。如果機器學習模型的最終表現沒有超越我們的預估表現,那麼我們可能不得不得出如下結論:

  • 使用機器學習的方法無法解決此問題。

  • 或者我們可能需要嘗試其它不同的方法。

對於迴歸問題,一個合理的基線是通過預估測試集中所有示例的執行結果為訓練集中目標結果的中值。這種方式建立的基線為對比模型表現結果設定了一個相對較低的門檻。

我們將使用的度量標準是平均絕對誤差mae)--計算出預測的平均絕對誤差。其實存在很多種迴歸問題的度量指標,但我喜歡Andrew Ng的建議去選擇一個指標然後一直在以後模型評估中使用它。平均絕對誤差(mae)是一個不錯的選擇,它不僅容易計算並且可解釋性強。

在計算基線之前,我們需要將我們的資料分成一個訓練集和一個測試集:

1. 訓練集的作用就是通過給模型提供有標籤的資料來訓練模型能力,換句話說就是訓練集既能“提供問題”又能“提供答案”。旨在讓模型學習特徵與目標之間的對映。

2. 測試集的作用是用來評估訓練好模型。評估過程中不允許模型檢視測試集的標籤,只能使用特徵進行預測。我們可以通過對比測試集的預測值與標籤真實值來評估模型的表現。換句話說就是測試集只“提供問題”給模型不“提供答案”

我們將使用70%的資料進行訓練,30%用於測試: 

一個完整的機器學習專案在Python中的演練(二)

一個完整的機器學習專案在Python中的演練(二)

計算基線並得出預估表現值(mae)

一個完整的機器學習專案在Python中的演練(二)

一個完整的機器學習專案在Python中的演練(二)


通過計算得出預估模型表現為66,在測試集中的誤差約為25左右(分值:1-100)。這是一個很容易達到的效能。

結論

在前兩篇的分析中,我們走過了一個完整機器學習專案的前三個步驟。在明確定義問題之後,我們:

1. 清洗並格式化了原始資料

2. 執行探索性資料分析以瞭解資料集

3. 轉換出了一系列我們將用於模型的特徵

4. 建立了可以判斷整個機器學習演算法的基線。

接下來將展示如何使用Scikit-Learn評估機器學習模型,選擇最佳模型和微調超引數來優化模型。

一個完整的機器學習專案在Python中的演練(二)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555081/viewspace-2216049/,如需轉載,請註明出處,否則將追究法律責任。

相關文章