【導(dǎo)讀】這是一篇完全手把手進行機器學(xué)習(xí)項目構(gòu)建的教程,包含:1. 數(shù)據(jù)清理和格式化 2. 探索性數(shù)據(jù)分析 3. 特征工程和特征選擇 4. 在性能指標上比較幾種機器學(xué)習(xí)模型 5. 對最佳模型執(zhí)行超參數(shù)調(diào)整 6. 在測試集合中評估最佳模型 7. 解釋模型結(jié)果 8. 得出結(jié)論。今天是第一部分(1-3)從數(shù)據(jù)清理,到數(shù)據(jù)分析,到特征工程,再到Baseline的構(gòu)建,作者以淺顯易懂的語言和清晰的示例和代碼教你從頭開始走過一個機器學(xué)習(xí)之旅,并且附詳細的代碼,大家可以收藏和學(xué)習(xí)。
作者 | William Koehrsen
編譯 | 專知
參與 | Chaofan, Xiaowen
用python完成一個完整的機器學(xué)習(xí)項目:第一部分
——Putting the machine learning pieces together
閱讀一本數(shù)據(jù)科學(xué)書籍或?qū)W習(xí)一門相關(guān)的課程,你可能感覺你有了獨立的碎片,但不知道如何將它們拼在一起。想要繼續(xù)推進下去并解決完整的機器學(xué)習(xí)問題可能令人望而生畏,但完成第一個項目后將使你有信心應(yīng)對任何數(shù)據(jù)科學(xué)問題。本系列文章將介紹——使用了真實世界數(shù)據(jù)集的機器學(xué)習(xí)項目的完整解決方案,讓你了解所有碎片是如何拼接在一起的。
我們將按照一般機器學(xué)習(xí)的工作流程逐步進行:
1. 數(shù)據(jù)清理和格式化
2. 探索性數(shù)據(jù)分析
3. 特征工程和特征選擇
4. 在性能指標上比較幾種機器學(xué)習(xí)模型
5. 對最佳模型執(zhí)行超參數(shù)調(diào)整
6. 在測試集合中評估最佳模型
7. 解釋模型結(jié)果
8. 得出結(jié)論
按照上述流程,我們將介紹每個步驟如何進入到下一步,以及如何用Python實現(xiàn)每個部分。完整的項目在GitHub上可以找到,第一個notebook在這里。 第一篇文章將涵蓋步驟1-3,其余的內(nèi)容將在后面的文章中介紹。
GitHub完整項目鏈接:
https://github.com/WillKoehrsen/machine-learning-project-walkthrough
問題定義
編碼之前的第一步是了解我們試圖解決的問題和可用的數(shù)據(jù)。在這個項目中,我們將使用公共可用的紐約市的建筑能源數(shù)據(jù)【1】。
目標是使用能源數(shù)據(jù)建立一個模型,來預(yù)測建筑物的Energy Star Score(能源之星分數(shù)),并解釋結(jié)果以找出影響評分的因素。
數(shù)據(jù)包括Energy Star Score,意味著這是一個監(jiān)督回歸機器學(xué)習(xí)任務(wù):
監(jiān)督:我們可以知道數(shù)據(jù)的特征和目標,我們的目標是訓(xùn)練可以學(xué)習(xí)兩者之間映射關(guān)系的模型。
回歸:Energy Star Score是一個連續(xù)變量。
我們想要開發(fā)一個模型,在準確性上——它可以實現(xiàn)預(yù)測Energy Star Score,并且結(jié)果接近真實值。在解釋上—— 我們可以理解模型的預(yù)測。
一旦我們知道了目標,在深入挖掘數(shù)據(jù)并構(gòu)建模型時,就可以用它來指導(dǎo)我們的決策。
數(shù)據(jù)清洗
與大多數(shù)數(shù)據(jù)科學(xué)課程所相信的相反,并非每個數(shù)據(jù)集都是一組完美的觀測數(shù)據(jù),沒有缺失值或異常值(你可以查看你的mtcars【2】和iris數(shù)據(jù)集【3】)。 現(xiàn)實世界的數(shù)據(jù)很亂,這意味著在我們開始分析之前,我們需要清理并將其轉(zhuǎn)換為可接受的格式【4】。數(shù)據(jù)清理,是大多數(shù)實際的數(shù)據(jù)科學(xué)問題中不具吸引力,但必不可少的一部分。
首先,我們可以將數(shù)據(jù)用Pandas DataFrame加載并查看:
這是包含60列的完整數(shù)據(jù)的子集。 我們已經(jīng)可以看到幾個問題:首先,我們知道我們想要預(yù)測的Energy Star Score的情況,但我們不知道任何一列的含義。 雖然這不一定是個問題——我們通??梢栽跊]有任何變量知識的情況下創(chuàng)建一個準確的模型——我們想把重點放在模型的可解釋性上,而至少了解一些列可能是重要的。
起初,我從初創(chuàng)階段得到任務(wù)時,我不想問所有的列名是什么意思,所以我查看了csv文件的名稱,
并決定搜索“Local Law 84”。 所以在上文我解釋——這是紐約法律要求的,所有具有一定規(guī)模的建筑物報告其能源使用情況。 關(guān)于列的更多搜索內(nèi)容在這里。 也許看一個文件名是一個明顯的開始,但對我來說,這是提醒你要放慢速度,這樣你才不會錯過任何重要的東西!
我們不需要研究所有的列的定義,但我們至少應(yīng)該了解Energy Star Score,它被描述為:
根據(jù)報告年度中,自我報告的能源使用情況而進行的1至100百分位的排名。 Energy Star Score是用于比較建筑物能效的相對度量?!?】
這解決了第一個小問題,但第二個問題是缺少的值被編碼為“Not Available”。 這是Python中的一個字符串,這意味著甚至包含數(shù)字的列都將被存儲為object數(shù)據(jù)類型,因為Pandas會將包含任何字符串的列轉(zhuǎn)換為所有元素都為字符串的列。我們可以使用dataframe.info()方法來查看列的數(shù)據(jù)類型:
當(dāng)然,一些明確包含數(shù)字(例如ft2)的列被存儲為object類型。 我們不能對字符串進行數(shù)值分析,因此必須將其轉(zhuǎn)換為數(shù)字(特別是浮點數(shù))數(shù)據(jù)類型!
這里有一個簡短的Python代碼,用不是數(shù)字(np.nan)代替所有“Not Available”條目,np.nan可以被解釋為數(shù)字,這樣就可以將相關(guān)列轉(zhuǎn)換為float數(shù)據(jù)類型:
一旦列是數(shù)字,我們就可以開始進行調(diào)查數(shù)據(jù)。
缺少數(shù)據(jù)和異常值
除了不正確的數(shù)據(jù)類型外,處理真實世界數(shù)據(jù)時的另一個常見問題是缺失值。 這可能是由于許多原因引起的,在我們訓(xùn)練機器學(xué)習(xí)模型之前必須填寫或刪除。首先,讓我們了解每列中有多少缺失值(請參閱notebook中的代碼)。
(為了創(chuàng)建這個表,我使用了這個Stack Overflow論壇的一個函數(shù)【6】)。
盡管我們總是希望小心刪除信息,但如果列中缺失值的比例很高,那么它對我們的模型可能不會有用。刪除列的閾值應(yīng)該取決于實際問題,并且對于此項目,我們將刪除缺失值超過50%的列。
此時,我們可能還想要移除異常值。這些異??赡苁怯捎跀?shù)據(jù)輸入中的拼寫錯誤,單位中的錯誤,或者它們可能是合法但是極端的值。對于這個項目,我們將根據(jù)極端異常值的定義來消除異常:
1. the first quartile ? 3 ? interquartile range
2. he third quartile + 3 ? interquartile range
(有關(guān)刪除列和異常的代碼,請參閱notebook)。 在數(shù)據(jù)清理和異常清除過程結(jié)束時,我們剩下11,000多個建筑物和49個特征。
探索性數(shù)據(jù)分析
現(xiàn)在,數(shù)據(jù)清理這個乏味但必要的步驟已經(jīng)完成,我們可以繼續(xù)探索我們的數(shù)據(jù)!探索性數(shù)據(jù)分析(EDA)是一個開放式的過程,我們可以計算統(tǒng)計數(shù)據(jù),并畫圖去發(fā)現(xiàn)數(shù)據(jù)中的趨勢,異常,模式或關(guān)系。(trends, anomalies, patterns, or relationships)
簡而言之,EDA的目標是了解我們的數(shù)據(jù)可以告訴我們什么。它通常以高層概述開始,在我們發(fā)現(xiàn)有趣的數(shù)據(jù)部分后,再縮小到特定的區(qū)域。這些發(fā)現(xiàn)本身可能很有意思,或者可以用于通知我們的建模選擇,例如幫助我們決定使用哪些特征。
單變量圖
目標是預(yù)測Energy Star Score(將其重新命名為score),因此合理的開始是檢查此變量的分布。直方圖是可視化單個變量分布的簡單而有效的方法,使用matplotlib很容易。
這看起來很可疑! Energy Star Score是百分位數(shù),這意味著我們期望看到一個統(tǒng)一的分布,即每個得分分配給相同數(shù)量的建筑物。然而,不成比例的建筑物具有最高的100分或最低的1分(對于Energy Star Score來說更高表示越好)。
如果我們回到score的定義,我們會看到它基于“自我報告能量使用”,這可能解釋了分數(shù)偏高——要求建筑物所有者報告自己的能源使用情況就像要求學(xué)生在測試中報告自己的分數(shù)! 因此,這可能不是衡量建筑能效的最客觀標準。
如果我們有無限的時間,我們可能想要調(diào)查為什么這么多建筑物有非常高和非常低的分數(shù)——我們可以通過選擇這些建筑物并查看它們的共同點。但是,我們的目標只是預(yù)測分數(shù),而不是設(shè)計更好的建筑物評分方法! 我們可以在我們的報告中記下分數(shù)具有可疑分布,但我們主要關(guān)注預(yù)測分數(shù)。
尋找關(guān)系
EDA的主要部分是搜索特征和目標之間的關(guān)系。與目標相關(guān)的變量對模型很有用,因為它們可用于預(yù)測目標。通過使用seaborn庫的密度圖可以檢查目標上的分類變量(僅采用有限的一組值)的效果。
密度圖可以被認為是平滑的直方圖,因為它顯示了單個變量的分布。我們可以按類別對密度圖進行著色,以查看分類變量如何改變分布。下面的代碼創(chuàng)建了一個用建筑物類型(僅限于具有超過100個數(shù)據(jù)點的建筑物類型)著色的Energy Star Score密度圖:
我們可以看到建筑類型對Energy Star Score有重大影響。 辦公樓往往有較高的分數(shù),而酒店的分數(shù)較低。這告訴我們,我們應(yīng)該在建模中包含建筑類型,因為它確實對目標有影響。 作為分類變量,我們將不得不對建筑物類型進行one-hot編碼。
同上,可以顯示自治市鎮(zhèn)的Energy Star Score:
自治市鎮(zhèn)對建筑類型的評分似乎沒有太大的影響。 盡管如此,我們可能希望將其納入我們的模型中,因為各區(qū)之間存在細微的差異。
為了量化變量之間的關(guān)系,我們可以使用Pearson相關(guān)系數(shù)。它可以用來衡量兩個變量之間的線性關(guān)系的強度和方向。 +1分是完美的線性正相關(guān)關(guān)系,-1分是完美的負線性關(guān)系。 相關(guān)系數(shù)的幾個值如下所示:
雖然相關(guān)系數(shù)無法捕捉非線性關(guān)系,但它是開始計算變量如何相關(guān)的好方法。 在Pandas中,我們可以輕松計算數(shù)據(jù)框中任何列之間的相關(guān)性:
與目標的最負面(左)和最正面(右)相關(guān)性:
特征與目標之間存在幾個強烈的負相關(guān)性,而EUI對目標最為負面。(這些測量方法在計算方式上略有不同)EUI——能源使用強度(Energy Use Intensity)——是建筑物使用的能源量除以建筑物的平方英尺。它意味著衡量一個建筑,效率越低越好。直觀地說,這些相關(guān)性是有意義的:隨著EUI的增加,Energy Star Score趨于下降。
雙變量圖
為了可視化兩個連續(xù)變量之間的關(guān)系,我們使用散點圖。我們可以在點的顏色中包含附加信息,例如分類變量。例如,下面的圖表顯示了不同建筑物類型的Energy Star Score與site EUI的關(guān)系:
這個圖讓我們可以看到-0.7的相關(guān)系數(shù)。 隨著Site EUI減少,Energy Star Score增加,這種關(guān)系在建筑類型中保持穩(wěn)定。
我們將做的最后的探索性plot被稱為Pairs Plot。這是一個很好的探索工具,因為它可以讓我們看到多個變量對之間的關(guān)系以及單個變量的分布。在這里,我們使用seaborn可視化庫和PairGrid函數(shù)來創(chuàng)建上三角上具有散點圖的配對圖,對角線上的直方圖以及下三角形上的二維核密度圖和相關(guān)系數(shù)。
要查看變量之間的交互,我們查找行與列相交的位置。例如,要查看Weather EUorm EUI與score的相關(guān)性,我們查看Weather EUorm EUI行和score列,并查看相關(guān)系數(shù)為-0.67。 除了看起來很酷之外,諸如這些圖可以幫助我們決定在建模中應(yīng)該包含哪些變量。
特征工程和選擇
特征工程和選擇通常會為機器學(xué)習(xí)問題投入最大的時間。首先,讓我們來定義這兩個任務(wù)是什么:
特征工程:獲取原始數(shù)據(jù)并提取或創(chuàng)建新特征的過程。這可能意味著需要對變量進行變換,例如自然對數(shù)和平方根,或者對分類變量進行one-hot編碼,以便它們可以在模型中使用。 一般來說,我認為特征工程是從原始數(shù)據(jù)創(chuàng)建附加特征。
特征選擇:選擇數(shù)據(jù)中最相關(guān)的特征的過程。在特征選擇中,我們刪除特征以幫助模型更好地總結(jié)新數(shù)據(jù)并創(chuàng)建更具可解釋性的模型。一般來說,我認為特征選擇是減去特征,所以我們只留下那些最重要的特征。
機器學(xué)習(xí)模型只能從我們提供的數(shù)據(jù)中學(xué)習(xí),因此確保數(shù)據(jù)包含我們?nèi)蝿?wù)的所有相關(guān)信息至關(guān)重要。如果我們沒有給模型提供正確的數(shù)據(jù),那么我們將它設(shè)置為失敗,我們不應(yīng)該期望它學(xué)習(xí)!
對于這個項目,我們將采取以下功能設(shè)計步驟:
One-hot編碼分類變量(borough and property use type)。
添加數(shù)值變量的自然對數(shù)轉(zhuǎn)換。
在模型中,分類變量的One-hot編碼是必要的。機器學(xué)習(xí)算法無法理解像“office”這樣的建筑類型,因此如果建筑物是辦公室,則必須將其記錄為1,否則將其記錄為0。
添加轉(zhuǎn)換特征可以幫助我們的模型學(xué)習(xí)數(shù)據(jù)中的非線性關(guān)系。采用平方根,自然對數(shù)或特征的次冪是數(shù)據(jù)科學(xué)中的常見做法,也是基于領(lǐng)域知識或在實踐中最有效的方法。這里我們將使用數(shù)字特征的自然對數(shù)。
以下代碼選擇數(shù)字特征,對這些特征進行對數(shù)轉(zhuǎn)換,選擇兩個分類特征,對這些特征進行one-hot編碼,然后將兩個特征結(jié)合在一起。這似乎需要做很多工作,但在pandas中相對簡單!
在這個過程之后,我們有超過11,000個具有110列(特征)的觀測值(建筑物)。并非所有這些特征都可能對預(yù)測Energy Star Score有用,所以現(xiàn)在我們將轉(zhuǎn)向特征選擇從而去除一些變量。
特征選擇
我們數(shù)據(jù)中的110個特征中的許多特征是多余的,因為它們彼此高度相關(guān)。 例如,以下是Site EUI與Weather Normalized SiteEUI的相關(guān)系數(shù)為0.997的圖。
相互強相關(guān)的特征被稱為共線,消除這些特征對中的一個變量通??梢詭椭鷻C器學(xué)習(xí)模型推廣并更易于解釋。(我應(yīng)該指出,我們正在討論特征與其他特征的相關(guān)性,而不是與目標的相關(guān)性,這有助于我們的模型?。?/span>
有許多方法可以計算特征之間的共線性,其中最常見的是方差擴大因子。在這個項目中,我們將使用相關(guān)系數(shù)來識別和刪除共線特征。如果它們之間的相關(guān)系數(shù)大于0.6,我們將放棄一對特征中的一個。對于實現(xiàn),看看notebook(和這個stack overflow答案)
雖然這個閾值可能看起來是任意的,但我嘗試了幾個不同的閾值,這個選擇產(chǎn)生了最好的模型機器學(xué)習(xí)是一個經(jīng)驗性領(lǐng)域,通過試驗來發(fā)現(xiàn)性能最好的!特征選擇后,我們剩下64個特征和1個目標。
建立Baseline
我們現(xiàn)在已經(jīng)完成了數(shù)據(jù)清理,探索性數(shù)據(jù)分析和特征工程。開始建模之前要做的最后一步是建立一個Baseline。這實際上是我們可以比較我們的結(jié)果的一種猜測。如果機器學(xué)習(xí)模型沒有超越這個猜測,那么我們可能必須得出結(jié)論,機器學(xué)習(xí)對于任務(wù)來說是不可接受的,或者我們可能需要嘗試不同的方法。
對于回歸問題,合理的Baseline是猜測測試集中所有示例的訓(xùn)練集上目標的中值。這設(shè)置了一個任何模型都要超越的相對較低的標準。
我們將使用的度量標準是平均絕對誤差(Mean Absolute Error)(MAE),它測量預(yù)測的平均絕對誤差。有很多回歸的指標,但我喜歡Andrew Ng的建議【7】,選擇一個指標,然后在評估模型時堅持使用它。平均絕對誤差很容易計算,并且可以解釋。
在計算Baseline之前,我們需要將我們的數(shù)據(jù)分成一個訓(xùn)練集和一個測試集:
1. 訓(xùn)練集是我們在訓(xùn)練期間給我們的模型提供特征以及答案的。目地是讓模型學(xué)習(xí)特征與目標之間的映射。
2. 測試集合的特征用于評估訓(xùn)練的模型。模型不允許查看測試集的答案,并且只能使用特征進行預(yù)測。我們知道測試集的答案,因此我們可以將測試預(yù)測與答案進行比較。
我們將使用70%的數(shù)據(jù)進行訓(xùn)練,30%用于測試:
現(xiàn)在我們可以計算出Baseline的性能:
Baseline的估計在測試集中約為25分。 得分范圍從1到100,所以這代表25%的誤差,相當(dāng)?shù)偷囊粋€超越!
結(jié)論
在本文中,我們走過了機器學(xué)習(xí)問題的前三個步驟。 在定義問題之后,我們:
1. 清理并格式化原始數(shù)據(jù)
2. 進行探索性數(shù)據(jù)分析以了解數(shù)據(jù)集
3. 開發(fā)了一系列我們將用于模型的特征
最后,我們還完成了建立我們可以判斷我們的機器學(xué)習(xí)算法的Baseline的關(guān)鍵步驟。
第二篇文章將展示如何使用Scikit-Learn評估機器學(xué)習(xí)模型,選擇最佳模型并執(zhí)行超參數(shù)調(diào)整來優(yōu)化模型。
1.http://www.nyc.gov/html/gbee/html/plan/ll84_scores.shtml
2.http://stat.ethz.ch/R-manual/R-devel/library/datasets/html/mtcars.html
3.https://archive.ics.uci.edu/ml/datasets/iris
4.https://www.springboard.com/blog/data-wrangling/
5.https://www.energystar.gov/buildings/facility-owners-and-managers/existing-buildings/use-portfolio-manager/interpret-your-results/what
6.https://stackoverflow.com/questions/26266362/how-to-count-the-nan-values-in-a-column-in-pandas-dataframe/39734251#39734251
7.https://www.coursera.org/learn/machine-learning-projects/lecture/wIKkC/single-number-evaluation-metric
原文鏈接:
https://towardsdatascience.com/a-complete-machine-learning-walk-through-in-python-part-one-c62152f39420
代碼鏈接:
https://github.com/WillKoehrsen/machine-learning-project-walkthrough/blob/master/Machine%20Learning%20Project%20Part%201.ipynb