- 機器學習實戰:基于Scikit-Learn、Keras和TensorFlow(原書第3版)
- (法)奧雷利安·杰龍
- 2166字
- 2024-09-11 17:33:03
2.4 探索和可視化數據以獲得見解
到目前為止,你只是快速瀏覽了數據來大致了解你正在處理的數據類型。現在的目標是更深入了解。
首先,確保你已經把測試集放在一邊,你只是在探索訓練集。其次,如果訓練集非常大,你可能希望對探索集進行采樣,使探索階段的操作變得簡單快捷。在這種情況下,訓練集很小,所以你可以直接在完整數據集上工作。由于你要實驗完整訓練集的各種變換,因此你應該制作一份原始副本,以便之后可以恢復:

2.4.1 可視化地理數據
因為數據集包含地理信息(緯度和經度),所以創建所有地區的散點圖來可視化數據是個好主意(見圖2-11):


圖2-11:數據的地理散點圖
這看起來很像加州,但除此之外很難看到任何特定的模式。將alpha選項設置為0.2,可以更容易地可視化數據點密度高的地方(見圖2-12):

現在好多了:你可以清楚地看到高密度區域,即灣區以及洛杉磯和圣迭戈周圍,以及中央山谷中一長串相當高密度的區域(特別是薩克拉門托和弗雷斯諾周圍)。
我們的大腦非常擅長發現圖片中的模式,但你可能需要嘗試使用可視化參數才能使模式脫穎而出。

圖2-12:突出顯示高密度區域的更好的可視化
接下來看看房價(見圖2-13)。每個圓圈的半徑代表該地區的人口數量(選項s),顏色代表價格(選項c)。在這里,你使用名為jet的預定義顏色圖(選項cmap),其范圍從藍色(低)到紅色(高)[8]:

圖2-13告訴你,房價與地理位置(例如靠近海洋)和人口密度密切相關,你可能已經知道了。聚類算法應該有助于檢測主集群和添加新特征來衡量與集群中心的接近程度。海洋鄰近度也可能是有用的屬性,不過北加州沿海地區的房價不是太高,所以這個簡單的規則也不是萬能的。

圖2-13:加州房價:紅色為昂貴,藍色為便宜,圓圈越大代表地區人口越多
2.4.2 尋找相關性
由于數據集不是太大,你可以使用corr()方法輕松計算出每對屬性之間的標準相關系數(也稱為皮爾遜r):

現在你可以查看每個屬性與房價中位數的相關性:

相關系數取值范圍為-1到1。它越接近1,表示存在越強的正相關。例如,當收入中位數上升時,房價中位數往往會上升。當系數接近-1時,表示存在很強的負相關。你可以看到緯度和房價中位數之間存在弱的負相關(即當你向北走時,價格略有下降的趨勢)。最后,接近于0的系數意味著不存在線性相關。
查看屬性之間相關性的另一種方法是使用Pandas的scatter_matrix()函數,該函數將每個數值屬性與其他每個數值屬性進行對比。由于現在有11個數值屬性,你將得到112=121個圖表,這些圖表無法放在一頁紙上,因此你要關注一些看起來與房價中位數最相關的屬性(見圖2-14):

圖2-14:這個散布矩陣繪制了每個數值屬性與其他每個數值屬性的對比圖,加上主對角線上每個數值屬性的直方圖(左上到右下)

如果Pandas把每個變量與它自身畫一個圖,則主對角線將全都是直線,這樣毫無意義。因此取而代之的是,Pandas顯示每個屬性的直方圖(有其他選項可用,有關更多詳細信息請參閱Pandas文檔)。
查看相關散點圖,預測房價中位數最有希望的屬性似乎是收入中位數,因此你可以放大散點圖(見圖2-15):


圖2-15:收入中位數與房價中位數
這個圖揭示了一些事情。首先,相關性確實很強,你可以清楚地看到上升趨勢,而且點不是太分散。其次,你之前注意到的價格上限清晰可見,為500 000美元的水平線。但該圖還揭示了其他不太明顯的直線:450 000美元附近有一條水平線,350 000美元附近也有一條,280 000美元附近似乎隱約也有一條,再往下可能還有幾條。你可能想嘗試刪除相應的地區,以防止你的算法學習重現這些數據。
相關系數僅衡量線性相關性(“隨著x上升,y通常上升/下降”)。它可能會完全錯過非線性關系(例如,“當x接近0時,y通常會上升”)。
圖2-16展示了各種數據集及其相關系數。請注意,盡管事實上它們的軸顯然不是獨立的,但底行的所有圖的相關系數都為0:這些是非線性關系的樣例。此外,第二行顯示相關系數為1或-1的樣例,請注意,這與斜率無關。例如,以英寸為單位的身高與以英尺或納米為單位的身高的相關系數為1。

圖2-16:各種數據集的標準相關系數(來源:維基百科,公共領域圖像)
2.4.3 實驗不同屬性組合
通過前面幾節的介紹,希望你了解了探索數據和獲得見解的幾種方法。在將數據提供給機器學習算法之前,你確定了一些你可能想要清理的數據,并且你發現了屬性之間有趣的相關性,尤其是與目標屬性之間的相關性。你還注意到某些屬性呈右偏分布,因此你可能希望對它們進行變換(例如,通過計算它們的對數或平方根)。當然,你的工作時數會因每個項目而有很大差異,但總體思路是相似的。
在為機器學習算法準備數據之前,你可能想要做的最后一件事是嘗試各種屬性組合。例如,如果你不知道一個地區有多少戶人家,則該地區的房間總數就沒有多大用處。你真正想要的是每個家庭的房間數。同樣,臥室總數本身也不是很有用:你可能想將其與房間數量進行比較。每戶人口似乎也是一個值得關注的有趣屬性組合。你可以按如下方式創建這些新屬性:

然后再次查看相關矩陣:

嘿,還不錯!與房間或臥室總數相比,新的bedrooms_ratio屬性與房價中位數的相關性更高。顯然,臥室/房間比例較低的房子往往更貴。每戶房間的數量也比一個地區的房間總數更具信息量,顯然房子越大,它們就越貴。
這一輪探索不需要很徹底,關鍵是要從正確的腳步開始并快速獲得見解,這將幫助你獲得第一個相當不錯的原型。但這是一個迭代過程:一旦你啟動并運行了一個原型,你就可以分析它的輸出來獲得更多的見解并返回到這個探索步驟。