一個完整的機器學習項目在Python中的演練(二)
來自專欄 TensorFlowNews11 人贊了文章
歡迎大家關注我們的網站和系列教程:http://www.tensorflownews.com/,學習更多的機器學習、深度學習的知識!也可以搜索公眾號:磐創AI,關注我們的文章。
作者:磐石
大家往往會選擇一本數據科學相關書籍或者完成一門在線課程來學習和掌握機器學習。但是,實際情況往往是,學完之後反而並不清楚這些技術怎樣才能被用在實際的項目流程中。就像你的腦海中已經有了一塊塊」拼圖「(機器學習技術),你卻不知道如何講他們拼起來應用在實際的項目中。如果你也遇見過同樣的問題,那麼這篇文章應該是你想要的。本系列文章將介紹一個針對真實世界實際數據集的完整機器學習解決方案,讓您了解所有部分如何結合在一起。
本系列文章按照一般機器學習工作流程逐步進行:
- 數據清洗與格式處理
- 探索性數據分析
- 特徵工程和特徵選取
- 機器學習模型性能指標評估
- 微調最佳模型(超參數)
- 在測試集上評估最佳模型
- 解釋模型結果
- 總結分析
通過完成所有流程,我們將看到每個步驟之間是怎麼聯繫起來的,以及如何在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庫很快捷的實現。
完成上述操作之後,我們有110列(features)、總共超過11,000個對象(buildings)。但是,這些特徵並非所有都能夠對預測能源之星得分(ENERGY STAR Score)有用,所以接下來我們將通過特徵選擇去除一些變數。
特徵選擇
在上面做特徵工程的過程之後得到的數據中的110列特徵,許多都是多餘或重複的,因為它們彼此高度相關。
例如,下圖是Site EUI與Weather Norm EUI相關係數為0.997的情況。
那些相互之間有很強關聯性的特徵被稱為共線(collinear)https://en.wikipedia.org/wiki/Multicollinearity,而且消除這些「特徵對」中的一個變數通常可以使機器學習模型更魯棒並且具有更強的可解釋性。(需要注意的一點是,現在是在討論特徵與其他特徵的相關性,而不是與目標的相關性。)
有許多方法可以計算特徵之間的共線性(collinearity),其中最常見的是方差膨脹因子(VIF)。在本項目中,我們將使用相關係數來識別和刪除共線特徵。如果它們之間的相關係數大於0.6,我們將放棄一對特徵中的一個。
也許你會認為這個值(0.6)是隨便定義的,其實並不是,而是通過多次嘗試不同的閾值比較後得到的。使用0.6這個值可以產生了最好的模型。機器學習是一個經驗性領域,通常是通過試驗發現性能最好參數組合。選擇特徵後,我們剩下64列特徵和1列目標特徵(能源之星得分)。
建立基線
我們現在已經完成了數據清洗,探索性數據分析和特徵工程,開始建立模型之前還需要做最後一步:建立一個初步的基線(baseline)。這實際上是設置一項可以用來核對我們最終模型的實際表現的預估表現。我們可以通過拿最終模型表現與預估模型表現做比較反過來評測此次項目的整體思路。如果機器學習模型的最終表現沒有超越我們的預估表現,那麼我們可能不得不得出如下結論:
- 使用機器學習的方法無法解決此問題。
- 或者我們可能需要嘗試其它不同的方法。
對於回歸問題,一個合理的基線是通過預估測試集中所有示例的運行結果為訓練集中目標結果的中值。這種方式建立的基線為對比模型表現結果設定了一個相對較低的門檻。
我們將使用的度量標準是平均絕對誤差(mae)–計算出預測的平均絕對誤差。其實存在很多種回歸問題的度量指標,但我喜歡Andrew Ng的建議去選擇一個指標然後一直在以後模型評估中使用它。平均絕對誤差(mae)是一個不錯的選擇,它不僅容易計算並且可解釋性強。
在計算基線之前,我們需要將我們的數據分成一個訓練集和一個測試集:
- 訓練集的作用就是通過給模型提供有標籤的數據來訓練模型能力,換句話說就是訓練集既能「提供問題」又能「提供答案」。旨在讓模型學習特徵與目標之間的映射。
- 測試集的作用是用來評估訓練好模型。評估過程中不允許模型查看測試集的標籤,只能使用特徵進行預測。我們可以通過對比測試集的預測值與標籤真實值來評估模型的表現。換句話說就是測試集只「提供問題」給模型不「提供答案」。
我們將使用70%的數據進行訓練,30%用於測試:
計算基線並得出預估表現值(mae):
通過計算得出預估模型表現為66,在測試集中的誤差約為25左右(分值:1-100)。這是一個很容易達到的性能。
結論
在前兩篇的分析中,我們走過了一個完整機器學習項目的前三個步驟。在明確定義問題之後,我們:
- 清洗並格式化了原始數據
- 執行探索性數據分析以了解數據集
- 轉換出了一系列我們將用於模型的特徵
- 建立了可以判斷整個機器學習演算法的基線。
接下來將展示如何使用Scikit-Learn評估機器學習模型,選擇最佳模型和微調超參數來優化模型。
最後,對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站!http://www.tensorflownews.com。我們的公眾號:磐創AI。
推薦閱讀:
※基礎數據分析——案例分析1(藥品銷售數據分析)
※數據挖掘02-----kaggle Titanic
※川普贏了,但美國的數據同行們卻輸了
※第二十章 KNN演算法(上)
※數據挖掘與可視化分析——以武漢市房價為例