机器学习实用指南:如何从数据可视化中发现数据规律?
點(diǎn)擊上方“AI有道”,選擇“置頂”公眾號(hào)
重磅干貨,第一時(shí)間送達(dá)
本系列為《Scikit-Learn 和 TensorFlow 機(jī)器學(xué)習(xí)指南》的第四講。上文請(qǐng)見下面這篇文章:
機(jī)器學(xué)習(xí)實(shí)戰(zhàn)指南:如何入手第一個(gè)機(jī)器學(xué)習(xí)項(xiàng)目?
目前為止,我們已經(jīng)對(duì)數(shù)據(jù)有了初步的認(rèn)識(shí),大體上明白了我們要處理的數(shù)據(jù)類型。現(xiàn)在,我們將進(jìn)入更深入的研究。
首先,確保已經(jīng)劃分了測(cè)試集并放置一邊,我們只會(huì)對(duì)訓(xùn)練集進(jìn)行操作。另外,如果訓(xùn)練集很大,可以從中采樣一些作為探索集(exploration set),方便進(jìn)行快速處理。在我們這個(gè)例子中,數(shù)據(jù)集比較小,所以直接在訓(xùn)練集上處理即可。我們還要?jiǎng)?chuàng)建一個(gè)訓(xùn)練集的復(fù)制副本,這樣就不會(huì)改動(dòng)原來(lái)的訓(xùn)練集了。
housing = strat_train_set.copy()1. 地理數(shù)據(jù)可視化
因?yàn)閿?shù)據(jù)集中包含了地理位置信息(經(jīng)緯度),所以創(chuàng)建所有地區(qū)的散點(diǎn)圖來(lái)可視化數(shù)據(jù)是個(gè)好主意(如下圖所示)。
這看起來(lái)有點(diǎn)像加州,但是很難看出任何規(guī)律。我們?cè)O(shè)置參數(shù) alpha = 0.1,這樣就更容易看出數(shù)據(jù)點(diǎn)的密度了(如下圖所示)。
housing.plot(kind="scatter", x="longitude", y="latitude", alpha=0.1)現(xiàn)在,我們可以很清晰地看出這些密度較大的區(qū)域了。?
通常來(lái)說(shuō),人類的大腦非常善于發(fā)現(xiàn)圖片中的模式,但是也需要使用一些可視化參數(shù)來(lái)讓這些模式更加突出。?
接下來(lái),我們來(lái)看一下房屋價(jià)格(如下圖所示)。其中,圓的半徑代表地區(qū)人口(參數(shù) s),圓的顏色代表房?jī)r(jià)(參數(shù) c)。我們將使用預(yù)先定義好的顏色圖 jet(參數(shù) cmap),顏色范圍從藍(lán)色(低房?jī)r(jià))到紅色(高房?jī)r(jià))。
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")注意,參數(shù) `sharex=False` 修復(fù)了顯示 x 軸和 legend 不顯示的 bug。感謝 Wilmer Arellano 給的建議。出處:https://github.com/pandas-dev/pandas/issues/10611。
這張圖顯示出房?jī)r(jià)與地理位置(例如沿海)和人口密度關(guān)系很大,這一點(diǎn)你可能早就知道。可以使用聚類算法檢測(cè)主要的聚集,增加新的特征測(cè)量到聚類中心的距離。盡管加州北部沿海地區(qū)的房?jī)r(jià)并不高,但是 ocean_proximity 屬性仍然非常有用。總的來(lái)說(shuō),預(yù)測(cè)房?jī)r(jià)并不是使用一個(gè)簡(jiǎn)單規(guī)則就行的。
2.?尋找關(guān)聯(lián)性
因?yàn)閿?shù)據(jù)集不是很大,我們可以使用 corr() 方法直接計(jì)算任意兩個(gè)屬性的標(biāo)準(zhǔn)相關(guān)系數(shù)(也稱皮爾遜相關(guān)系數(shù))。
corr_matrix = housing.corr()現(xiàn)在,我們來(lái)看一下每個(gè)屬性與房?jī)r(jià)中位數(shù)的相關(guān)系數(shù)分別是多少:
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
相關(guān)系數(shù)范圍在 [-1, 1] 之間,越接近 1 表示正相關(guān)性越強(qiáng),例如房?jī)r(jià)中位數(shù)與收入中位數(shù)。相關(guān)系數(shù)越接近 -1 表示負(fù)相關(guān)性越強(qiáng)。你可以看到房?jī)r(jià)中位數(shù)與維度呈現(xiàn)負(fù)相關(guān)性(數(shù)據(jù)顯示越往北方,房?jī)r(jià)呈下降趨勢(shì))。最后,相關(guān)系數(shù)接近 0 表示無(wú)線性相關(guān)。下圖展示了 x 軸與 y 軸對(duì)應(yīng)數(shù)據(jù)的相關(guān)系數(shù)。
相關(guān)系數(shù)僅僅測(cè)量的是線性相關(guān)性(如果 x 增大,y 也同樣增大或減小),可能完全忽略非線性關(guān)系(例如,x 在 0 附近,y 會(huì)增大)。注意,上圖中最下面的那幾張圖表示的都是相關(guān)系數(shù)為零的情況,但是它們是非線性相關(guān)。第二行展示的幾個(gè)圖形相關(guān)系數(shù)為 1 或 -1,注意與直線的斜率無(wú)關(guān)。
另外一種檢查不同屬性特征之間的相關(guān)系數(shù)的方法是使用 Pandas 的 scatter_matrix 函數(shù)。它將對(duì)每個(gè)數(shù)值屬性與其它所有數(shù)值屬性的相關(guān)性進(jìn)行作圖。因?yàn)楝F(xiàn)在有 9 個(gè)數(shù)值屬性,總共有 9x9=81 個(gè)圖,頁(yè)面放不下這么多。所以,我們只選擇幾個(gè)與房?jī)r(jià)中位數(shù)關(guān)系較大的屬性來(lái)作圖。
from pandas.tools.plotting import scatter_matrixattributes = ["median_house_value", "median_income", "total_rooms", "housing_median_age"] scatter_matrix(housing[attributes], figsize=(12, 8))上圖中,主對(duì)角線對(duì)應(yīng)的相關(guān)系數(shù)全是直線(自己與自己的相關(guān)系數(shù)始終為 1),作圖沒(méi)有實(shí)質(zhì)意義,因此顯示的實(shí)際上是每個(gè)屬性的柱狀圖。關(guān)于其它選項(xiàng)設(shè)置,可以參閱 Pandas 的文檔。 看起來(lái),最有可能用來(lái)預(yù)測(cè)房?jī)r(jià)中位數(shù)的屬性是收入中位數(shù),讓我們把該圖放大來(lái)看:
housing.plot(kind="scatter", x="median_income", y="median_house_value", alpha=0.1)這張圖說(shuō)明了幾點(diǎn):第一,相關(guān)性較強(qiáng)。你可以清楚看到數(shù)據(jù)點(diǎn)整體呈上升趨勢(shì),并不分散。第二,我們之前提過(guò)的價(jià)格上限 $500,000 呈現(xiàn)一條水平直線。同樣在 $450,000、$350,000 和 $280,000 的位置也呈現(xiàn)了較弱的水平直線。在訓(xùn)練模型的時(shí)候最好移除這些樣本點(diǎn),防止算法學(xué)習(xí)到這些不好的數(shù)據(jù)。
3.?嘗試結(jié)合不同的屬性
希望前面的章節(jié)給了你一些探索數(shù)據(jù)、獲取規(guī)律的方法。你發(fā)現(xiàn)了一些數(shù)據(jù)怪癖,在把數(shù)據(jù)放入機(jī)器學(xué)習(xí)算法之前,將其清除。你也發(fā)現(xiàn)了不同屬性之間的相關(guān)性,尤其是與目標(biāo)屬性的相關(guān)性。你也注意到有些屬性呈現(xiàn)長(zhǎng)尾分布,可以進(jìn)行轉(zhuǎn)換處理(例如計(jì)算它們的對(duì)數(shù))。當(dāng)然,不同項(xiàng)目的處理方法并不完全相同,但是大致思路是類似的。
在準(zhǔn)備數(shù)據(jù)給機(jī)器學(xué)習(xí)算法之前,你還可以嘗試進(jìn)行不同的屬性組合。例如,如果你不知道地區(qū)有多少戶,只知道地區(qū)總的房間數(shù)也沒(méi)什么作用。你最想知道的是每戶有多少房間。類似地,知道臥室數(shù)量也沒(méi)什么用,你可能需要將其與房屋數(shù)量進(jìn)行比較。還有,每戶人口數(shù)應(yīng)該也比較重要。下面,我們來(lái)創(chuàng)建這些屬性:
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"]現(xiàn)在,我們?cè)賮?lái)看一下相關(guān)矩陣:
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
看起來(lái)還不錯(cuò)!bedrooms_per_room 屬性與房?jī)r(jià)中位數(shù)的相關(guān)性比單獨(dú)的 total_rooms 和 total_bedrooms 與房?jī)r(jià)中位數(shù)的相關(guān)性更大。可以看出,bedroom/room 比值越小,房?jī)r(jià)越高。rooms_per_household 屬性也比 total_rooms 包含了更多的信息——顯然,房屋越大,價(jià)格就越高。?
這一輪的探索不一定要非常完備。重要的是正確開始并快速發(fā)現(xiàn)一些規(guī)律,這將幫助你得到第一個(gè)合理的原型。這是一個(gè)迭代的過(guò)程:一旦你得到一個(gè)原型開始運(yùn)行,你就可以分析它的輸出,發(fā)現(xiàn)更多規(guī)律,然后回過(guò)頭來(lái)繼續(xù)探索數(shù)據(jù),不斷優(yōu)化模型。
【推薦閱讀】
我的深度學(xué)習(xí)入門路線
深度學(xué)習(xí)“四大名著”發(fā)布!愛(ài)可可推薦!
實(shí)用指南1:這些基礎(chǔ)盲點(diǎn)請(qǐng)務(wù)必注意!
實(shí)用指南2:機(jī)器學(xué)習(xí)面臨哪些挑戰(zhàn)?
實(shí)戰(zhàn)指南3:如何入手第一個(gè)機(jī)器學(xué)習(xí)項(xiàng)目?
總結(jié)
以上是生活随笔為你收集整理的机器学习实用指南:如何从数据可视化中发现数据规律?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 优秀的程序员应该掌握多少门编程语言?
- 下一篇: 怎样成为一名更优秀的程序员?我总结出 7