導讀:本文會介紹一些技術,,幫你更好地理解數(shù)據(jù),,以及探索特征之間的關系,。 本文使用Python建立對數(shù)據(jù)的理解。我們會分析變量的分布,,捋清特征之間的關系,。最后,你會學習給樣本分層,,并將數(shù)據(jù)集拆分成測試集與訓練集,。 作者:托馬茲·卓巴斯(Tomasz Drabas) 如需轉載請聯(lián)系大數(shù)據(jù)(ID:hzdashuju) 01 生成描述性的統(tǒng)計數(shù)據(jù) 要完全理解任何隨機變量的分布,我們需要知道其平均數(shù)與標準差,、最小值與最大值,、中位數(shù)、四分位數(shù),、偏度和峰度,。 1. 準備 要實踐本技巧,你只需裝好pandas模塊。此外沒有要求了,。 2. 怎么做 下面的代碼可以快速達成對數(shù)據(jù)的初步理解,。假設數(shù)據(jù)已從CSV文件讀出,并存于csv_read變量(data_describe.py文件)中: csv_desc = csv_read[ 3. 原理 pandas有個很管用的.describe()方法,,它替我們做了大部分的工作。這個方法能生成我們想要的大部分描述變量,;輸出看起來是這樣的(為清晰做了相應簡化): beds DataFrame對象的索引標明了描述性統(tǒng)計數(shù)據(jù)的名字,每一列代表我們數(shù)據(jù)集中一個特定的變量,。不過,,我們還缺偏度、峰度和眾數(shù),。為了更方便地加入csv_desc變量,,我們使用.transpose()移項了.describe()方法的輸出結果,使得變量放在索引里,,每一列代表描述性的變量,。
有了基礎的統(tǒng)計數(shù)據(jù),我們可以補上其他的,。要留意的是,,.skew(...)和.kurt(...)方法以類似的格式返回數(shù)據(jù),而.mode(...)不然,;.mode(...)方法返回的數(shù)據(jù)要進行調(diào)整,,以便和.describe()方法的輸出格式保持一致。 4. 更多 描述性的統(tǒng)計數(shù)據(jù)也可用SciPy和NumPy計算得到,。當然,,比起pandas來不那么直觀(data_describe_alternative.py文件)。 首先加載兩個模塊,。 import scipy.stats as st 然后從CSV文件讀取數(shù)據(jù): r_filenameCSV = '../../Data/Chapter02/' + 'realEstate_trans_full.csv' .genfromtxt(...)方法以文件名作為第一個(也是唯一必需的)參數(shù),。指定分隔符是一個好做法;本例中分隔符是',',,也可以是\t,。names參數(shù)指定為True,意味著變量名存于第一行,。最后,,usecols參數(shù)指定文件中哪些列要存進csv_read對象。 最終可以計算出要求的數(shù)據(jù): .genfromtxt(...)方法創(chuàng)建的數(shù)據(jù)是一系列元組。.describe(...)方法只接受列表形式的數(shù)據(jù),,所以得先(使用列表表達式)將每個元組轉換成列表,。 這個方法的輸出可以說對用戶不太友好: 5. 參考
02 探索特征之間的相關性 兩個變量之間的相關系數(shù)用來衡量它們之間的關系,。系數(shù)為1,,我們可以說這兩個變量完全相關;系數(shù)為-1,,我們可以說第二個變量與第一個變量完全負相關,;系數(shù)0意味著兩者之間不存在可度量的關系。 這里要強調(diào)一個基礎事實:不能因為兩個變量是相關的,,就說兩者之間存在因果關系,。
1. 準備 要實踐本技巧,,你要先裝好pandas模塊,。此外沒有要求了。 2. 怎么做 我們將測算公寓的臥室數(shù)目,、浴室數(shù)目,、樓板面積與價格之間的相關性。再一次,,我們假設數(shù)據(jù)已經(jīng)在csv_read對象中了,。下面是代碼(data_correlations.py文件): # 計算相關性 3. 原理 pandas可用于計算三種相關度:皮爾遜積矩相關系數(shù)、肯達爾等級相關系數(shù)和斯皮爾曼等級相關系數(shù),。后兩者對于非正態(tài)分布的隨機變量并不是很敏感,。 我們計算這三種相關系數(shù),并且將結果存在csv_corr變量中,。DataFrame對象csv_read調(diào)用了.corr(...)方法,,唯一要指定的參數(shù)是要使用的計算方法。結果如下所示: 4. 參考
03 數(shù)據(jù)取樣 有時候數(shù)據(jù)集過大,,不方便建立模型,。出于實用的考慮(不要讓模型的估計沒有個盡頭),最好從完整的數(shù)據(jù)集中取出一些分層樣本,。 本文從MongoDB讀取數(shù)據(jù),,用Python取樣。 1. 準備 要實踐本技巧,,你需要PyMongo,、pandas和NumPy。其他沒有什么要準備的,。 2. 怎么做 有兩種做法:確定一個抽樣的比例(比如說,,20%),,或者確定要取出的記錄條數(shù)。下面的代碼展示了如何提取一定比例的數(shù)據(jù)(data_sampling.py文件): strata_frac = 0.2 3. 原理 首先確定取樣的比例,,即strata_frac變量,。從MongoDB取出數(shù)據(jù)。MongoDB返回的是一個字典,。pandas的.from_dict(...)方法生成一個DataFrame對象,,這樣處理起來更方便。 要獲取數(shù)據(jù)集中的一個子集,,pandas的.sample(...)方法是一個很方便的途徑,。不過這里還是有一個陷阱:所有的觀測值被選出的概率相同,可能我們得到的樣本中,,變量的分布并不能代表整個數(shù)據(jù)集,。 在這個簡單的例子中,為了避免前面的陷阱,,我們遍歷臥室數(shù)目的取值,用.sample(...)方法從這個子集中取出一個樣本,。我們可以指定frac參數(shù),,以返回數(shù)據(jù)集子集(臥室數(shù)目)的一部分。 我們還使用了DataFrame的.append(...)方法:有一個DataFrame對象(例子中的sample),,將另一個DataFrame附加到這一個已有的記錄后面,。ignore_index參數(shù)設為True時,會忽略附加DataFrame的索引值,,并沿用原有DataFrame的索引值,。 4. 更多 有時,你會希望指定抽樣的數(shù)目,,而不是占原數(shù)據(jù)集的比例,。之前說過,pandas的 .sample(...)方法也能很好地處理這種場景(data_sampling_alternative.py文件),。 首先,,我們指定要從原數(shù)據(jù)集中抽樣的記錄數(shù)目: strata_cnt = 200 要保持不同臥室數(shù)目的取值比例與原數(shù)據(jù)集一致,我們首先計算每個桶中該放的記錄數(shù): ttl_cnt = sales['beds'].count() DataFrame的.count()方法會計算整個數(shù)據(jù)集中的總數(shù)目,。然后,,我們可以分別計算出各臥室數(shù)目下的比例,乘上strata_cnt變量,,就得到了各自的記錄條數(shù),。.value_counts()方法返回的是指定列(例子中的beds)中,每個值的數(shù)目,。然后將數(shù)據(jù)集中每條記錄除以ttl_cnt再乘以想要的樣本大小,。 抽樣可以使用.sample(...)方法,。不過,我們這次不指定frac參數(shù)了,,而是指定要提取的記錄數(shù)n: for bed in beds: 04 將數(shù)據(jù)集拆分成訓練集,、交叉驗證集和測試集 要建立一個可信的統(tǒng)計模型,我們需要確信它精確地抽象出了我們要處理的現(xiàn)象,。要獲得這個保證,,我們需要測試模型。要保證精確度,,我們訓練和測試不能用同樣的數(shù)據(jù)集,。 本技法中,你會學到如何將你的數(shù)據(jù)集快速分成兩個子集:一個用來訓練模型,,另一個用來測試,。 1. 準備 要實踐本技巧,你需要pandas,、SQLAlchemy和NumPy,。其他沒有什么要準備的。 2. 怎么做 我們從PostgreSQL數(shù)據(jù)庫讀出數(shù)據(jù),,存到DataFrame里,。通常我們劃出20%~40%的數(shù)據(jù)用于測試。本例中,,我們選出1/3的數(shù)據(jù)(data_split.py文件): # 指定用于測試的數(shù)據(jù)比例 3. 原理 我們從指定劃分數(shù)據(jù)的比例與存儲數(shù)據(jù)的位置開始:兩個存放訓練集和測試集的文件,。 我們希望隨機選擇測試數(shù)據(jù)。這里,,我們使用NumPy的偽隨機數(shù)生成器,。.rand(...)方法生成指定長度(len(data))的隨機數(shù)的列表。生成的隨機數(shù)在0和1之間,。 接著我們將這些數(shù)字與要歸到訓練集的比例(1-test_size)進行比較:如果數(shù)字小于比例,,我們就將記錄放在訓練集(train屬性的值為True)中;否則就放到測試集中(train屬性的值為False),。 最后兩行將數(shù)據(jù)集拆成訓練集和測試集,。~是邏輯運算“否”的運算符,;這樣,,如果train屬性為False,那么“否”一下就成了True,。 4. 更多 SciKit-learn提供了另一種拆分數(shù)據(jù)集的方法,。我們先將原始的數(shù)據(jù)集分成兩塊,一塊是因變量y,,一塊是自變量x: # 選擇自變量和因變量 然后就可以拆了: # 拆分 .train_test_split(...)方法幫我們將數(shù)據(jù)集拆成互補的子集:一個是訓練集,,另一個是測試集,。在每個種類中,我們有兩個數(shù)據(jù)集:一個包含因變量,,另一個包含自變量,。 |
|