Scikit-Learn 与 TensorFlow 机器学习实用指南学习笔记 4 —— 数据探索与可视化、发现规律
紅色石頭的個人網站:redstonewill.com
目前為止,我們已經對數據有了初步的認識,大體上明白了我們要處理的數據類型。現在,我們將進入更深入的研究。
首先,確保已經劃分了測試集并放置一邊,我們只會對訓練集進行操作。另外,如果訓練集很大,可以從中采樣一些作為探索集(exploration set),方便進行快速處理。在我們這個例子中,數據集比較小,所以直接在訓練集上處理即可。我們還要創建一個訓練集的復制副本,這樣就不會改動原來的訓練集了。
housing = strat_train_set.copy()1. 地理數據可視化
因為數據集中包含了地理位置信息(經緯度),所以創建所有地區的散點圖來可視化數據是個好主意(如下圖所示)。
housing.plot(kind="scatter", x="longitude", y="latitude")這看起來有點像加州,但是很難看出任何規律。我們設置參數 alpha = 0.1,這樣就更容易看出數據點的密度了(如下圖所示)。
housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.1)現在,我們可以很清晰地看出這些密度較大的區域了。
通常來說,人類的大腦非常善于發現圖片中的模式,但是也需要使用一些可視化參數來讓這些模式更加突出。
接下來,我們來看一下房屋價格(如下圖所示)。其中,圓的半徑代表地區人口(參數 s),圓的顏色代表房價(參數 c)。我們將使用預先定義好的顏色圖 jet(參數 cmap),顏色范圍從藍色(低房價)到紅色(高房價)。
housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.4,s=housing["population"]/100, label="population", figsize=(10,7),c="median_house_value", cmap=plt.get_cmap("jet"), colorbar=True,sharex=False) plt.legend() save_fig("housing_prices_scatterplot")注意,參數 sharex=False 修復了顯示 x 軸和 legend 不顯示的 bug。感謝 Wilmer Arellano 給的建議。出處:https://github.com/pandas-dev/pandas/issues/10611。
這張圖顯示出房價與地理位置(例如沿海)和人口密度關系很大,這一點你可能早就知道。可以使用聚類算法檢測主要的聚集,增加新的特征測量到聚類中心的距離。盡管加州北部沿海地區的房價并不高,但是 ocean_proximity 屬性仍然非常有用。總的來說,預測房價并不是使用一個簡單規則就行的。
2. 尋找關聯性
因為數據集不是很大,我們可以使用 corr() 方法直接計算任意兩個屬性的標準相關系數(也稱皮爾遜相關系數)。
corr_matrix = housing.corr()現在,我們來看一下每個屬性與房價中位數的相關系數分別是多少:
>>> corr_matrix["median_house_value"].sort_values(ascending=False)median_house_value 1.000000 median_income 0.687170 total_rooms 0.135231 housing_median_age 0.114220 households 0.064702 total_bedrooms 0.047865 population -0.026699 longitude -0.047279 latitude -0.142826 Name: median_house_value, dtype: float64相關系數范圍在 [-1, 1] 之間,越接近 1 表示正相關性越強,例如房價中位數與收入中位數。相關系數越接近 -1 表示負相關性越強。你可以看到房價中位數與維度呈現負相關性(數據顯示越往北方,房價呈下降趨勢)。最后,相關系數接近 0 表示無線性相關。下圖展示了 x 軸與 y 軸對應數據的相關系數。
相關系數僅僅測量的是線性相關性(如果 x 增大,y 也同樣增大或減小),可能完全忽略非線性關系(例如,x 在 0 附近,y 會增大)。注意,上圖中最下面的那幾張圖表示的都是相關系數為零的情況,但是它們是非線性相關。第二行展示的幾個圖形相關系數為 1 或 -1,注意與直線的斜率無關。
另外一種檢查不同屬性特征之間的相關系數的方法是使用 Pandas 的 scatter_matrix 函數。它將對每個數值屬性與其它所有數值屬性的相關性進行作圖。因為現在有 9 個數值屬性,總共有 9x9=81 個圖,頁面放不下這么多。所以,我們只選擇幾個與房價中位數關系較大的屬性來作圖。
from pandas.tools.plotting import scatter_matrixattributes = ["median_house_value", "median_income", "total_rooms", "housing_median_age"] scatter_matrix(housing[attributes], figsize=(12, 8))上圖中,主對角線對應的相關系數全是直線(自己與自己的相關系數始終為 1),作圖沒有實質意義,因此顯示的實際上是每個屬性的柱狀圖。關于其它選項設置,可以參閱 Pandas 的文檔。
看起來,最有可能用來預測房價中位數的屬性是收入中位數,讓我們把該圖放大來看:
housing.plot(kind="scatter", x="median_income", y="median_house_value", alpha=0.1)這張圖說明了幾點:第一,相關性較強。你可以清楚看到數據點整體呈上升趨勢,并不分散。第二,我們之前提過的價格上限 $500,000 呈現一條水平直線。同樣在 $450,000、$350,000 和 $280,000 的位置也呈現了較弱的水平直線。在訓練模型的時候最好移除這些樣本點,防止算法學習到這些不好的數據。
3. 嘗試結合不同的屬性
希望前面的章節給了你一些探索數據、獲取規律的方法。你發現了一些數據怪癖,在把數據放入機器學習算法之前,將其清除。你也發現了不同屬性之間的相關性,尤其是與目標屬性的相關性。你也注意到有些屬性呈現長尾分布,可以進行轉換處理(例如計算它們的對數)。當然,不同項目的處理方法并不完全相同,但是大致思路是類似的。
在準備數據給機器學習算法之前,你還可以嘗試進行不同的屬性組合。例如,如果你不知道地區有多少戶,只知道地區總的房間數也沒什么作用。你最想知道的是每戶有多少房間。類似地,知道臥室數量也沒什么用,你可能需要將其與房屋數量進行比較。還有,每戶人口數應該也比較重要。下面,我們來創建這些屬性:
housing["rooms_per_household"] = housing["total_rooms"]/housing["households"] housing["bedrooms_per_room"] = housing["total_bedrooms"]/housing["total_rooms"] housing["population_per_household"]=housing["population"]/housing["households"]現在,我們再來看一下相關矩陣:
>>> corr_matrix = housing.corr() >>> corr_matrix["median_house_value"].sort_values(ascending=False)median_house_value 1.000000 median_income 0.687170 rooms_per_household 0.199343 total_rooms 0.135231 housing_median_age 0.114220 households 0.064702 total_bedrooms 0.047865 population_per_household -0.021984 population -0.026699 longitude -0.047279 latitude -0.142826 bedrooms_per_room -0.260070 Name: median_house_value, dtype: float64看起來還不錯!bedrooms_per_room 屬性與房價中位數的相關性比單獨的 total_rooms 和 total_bedrooms 與房價中位數的相關性更大。可以看出,bedroom/room 比值越小,房價越高。rooms_per_household 屬性也比 total_rooms 包含了更多的信息——顯然,房屋越大,價格就越高。
這一輪的探索不一定要非常完備。重要的是正確開始并快速發現一些規律,這將幫助你得到第一個合理的原型。這是一個迭代的過程:一旦你得到一個原型開始運行,你就可以分析它的輸出,發現更多規律,然后回過頭來繼續探索數據,不斷優化模型。
項目地址:
https://github.com/RedstoneWill/Hands-On-Machine-Learning-with-Sklearn-TensorFlow
總結
以上是生活随笔為你收集整理的Scikit-Learn 与 TensorFlow 机器学习实用指南学习笔记 4 —— 数据探索与可视化、发现规律的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样成为一名更优秀的程序员?我总结出 7
- 下一篇: 有哪些适合新手练手的C/C++项目?