本文咱們使用加州住房價格數據集,從零開始,一步一步創建模型,預測每一個區域的房價中位數。目的是完整實現一個機器學習的流程。
數組
問題分析
獲取數據
爲了方便,我已經事先將數據下載到本地,後臺回覆「房價」,便可獲取。該數據集以每個街區爲單位,包含街區的經緯度,居民年齡中位數,總房間數,總臥室數,人口數量,家庭數量,收入中位數,房價中位數,距離海邊的描述等信息。街區在後文中也被稱爲區域,咱們最終是要根據每一個區域的其餘特徵預測該區域的房價中位數。微信
查看數據的結構
1.使用pandas讀取數據,並用head()
方法查看前5行樣例。能夠看到一共有10個屬性(特徵)機器學習
2.使用info()
方法查看數據集的總體描述信息
ide
咱們能夠得到如下信息:數據集一共包含20640個實例,其中total_bedroom有一些的缺失值。一共有9個float類型的屬性,一個object類型的屬性,ocean_proximity。學習
3.對於惟一一個分類屬性,使用value_counts()
方法查看它的分佈狀況測試
能夠看到,該屬性共有5個取值,每一個取值都是字符串類型,後面咱們須要對其進行必定的轉換。編碼
4.對於數值屬性,使用describe()
方法查看摘要,該方法默認處理數值類型的屬性spa
結果輸出了每一個屬性的個數count,平均值mean,標準差std,最小值min,最大值max,還有25%,50%,75%三個百分位數。須要注意這裏的空值會被忽略,因此total_bedroom的count值是20433。
.net
5.用直方圖觀察每一個屬性,瞭解數據的分佈狀況
(點擊查看大圖,黑色的座標軸標籤不太容易看)
以其中一個屬性median_income爲例,從第二行第三列的子圖中咱們能夠看到,大多數的區域收入中位數約爲2-4(單位未知)。收入超過10的區域不多。相似的能夠對其餘屬性有一個認識。
劃分訓練集和測試集
以上咱們對整個數據集進行了熟悉,包括數據類型,缺失狀況。每一個屬性單獨的取值等等。接下來咱們首先將數據劃分爲訓練集和測試集,爲後續創建模型作鋪墊。創建模型要在訓練集上進行分析,而不關注任何測試集的信息,這樣有助於提高模型的泛化能力。須要注意的是,在進行劃分時,有純隨機抽樣的方式和分層抽樣的方式。
1.純隨機抽樣
2.分層抽樣
這裏使用分層抽樣須要結合實際的情境。咱們從某渠道瞭解到,收入中位數對於預測房價的中位數有較大的影響。因此咱們考慮在測試集中,該屬性各取值的比例和整個數據集中接近。
因爲收入是數值型的,咱們首先須要將其離散化。
上面的代碼將收入離散化爲5類,輸出了每一類的比例。接下來進行分層抽樣。
分層抽樣獲得的start_test_set的不一樣收入類別的比例與原數據集幾乎一致。而隨機抽樣的各收入類別的比例則與它們有一些差異。
劃分完訓練和測試集以後,能夠把income_cat屬性刪掉(代碼略)。
數據探索和和可視化
這裏咱們須要把測試集放在一邊,只探索訓練集,首先建立了一個副本。
1.探索不一樣的經緯度區域的數量
從圖中能夠看出某些經緯度(須要結合地理知識)的區域較多,某些地域較少,這樣對於區域的分佈有了一個直觀的認識。
2.探索房價與人口和地理位置的關係規律
圓點越大表明人口越多,顏色越深表明房價越高。能夠看到沿海地區房價高,人口多的地方房價高。
3.探究不一樣屬性與房價中位數的相關性
相關係數法
分佈矩陣
因爲屬性較多,所以只選取了與房價中位數最相關的幾個。在上面的圖中,對角線上展現了每一個屬性的直方圖,其餘位置展現了兩兩屬性間的散點圖。
能夠發現收入的中位數與房價中位數相關性最強。
咱們從圖中可以發現兩者的相關性,但也有幾條水平的直線是」異常「值。例如房價50w,45w,28w處的直線。後續可能須要對其進行刪除。
4.試驗不一樣屬性的組合
這一步咱們能夠從實際出發,經過現有的特徵進行一些相互組合,衍生出新的特徵。例如:
每一個家庭的房間數=總房間數(totals_rooms)/總家庭數(housholds)
每一個房間的臥室數=總的臥室數(total_bedrooms)/總的房間數(total_rooms)
每一個家庭的人口數=總的人口數/總的家庭數(housholds)
驗證一下咱們新構造的三個特徵與目標值之間的相關性係數:
能夠看到新構造的屬性比原來的兩個屬性與房價中位數的相關性更高。這一步能夠幫助咱們更深刻的思考與預測目標相關的影響因素,幫助創建更深入的理解。
數據準備
在開始以前,須要把預測目標和基本屬性分開。
1.數據清理
缺失值的處理
前面咱們提到total_bedrooms屬性有缺失。咱們能夠如下方法來處理:
Scikit-Learn中提供了Imputer類來處理缺失值。使用中位數填充缺失值的代碼以下:
刪除缺失的行,可使用pandas中的
dropna()
方法刪除該列,可使用pandas中的
drop()
方法用平均值或中位數填充該值,可使用pandas中的fillna()方法
處理文本和分類屬性
這裏咱們來處理上一步中刪掉的ocean_proximity屬性,它是一個類別型變量。須要將其轉換爲數字才能輸入模型。Scikit-Learn有兩種方式處理這種狀況。
① 使用LabelEncoder
encoder的classes_屬性中對應的值依次被編碼爲0, 1, 2, 3, 4。
② 使用 OneHotEncoder
以上兩種方法最終能夠獲得onehot形式的矩陣。但第一種方法首先獲得一個scipy的稀疏矩陣,僅存儲非0元素的位置,但仍然能夠像使用二維數組來使用它。在調用toarray才能獲得numpy的數組。第二種方法是直接獲得最終的結果。更快捷。但當特徵不少的時候,numpy數組的存儲會比較佔空間。
特徵縮放
爲了消除數據中量綱的影響,一般有兩種方式對數據進行縮放:最大最小縮放和標準化。在scikitlearn中都提供了相應的方法。
最大最小縮放是將值減去最小值併除以最大值和最小值的差,將值最終歸於0-1之間。標準化縮放則是首先減去平均值而後除以方差,最終範圍不必定是0-1之間。
Scikit-Learn中提供了Imputer類來處理缺失值。使用中位數填充缺失值的代碼以下:
因爲中位數只能針對數值型屬性計算,咱們須要先建立一個只有數值型屬性的數據副本。
imputer計算好的缺失值存儲在imputer.statistics中。經過上面的步驟,咱們就把total_bedrooms的缺失值用中位數進行了填充。
數據準備小結
上面咱們對數據進行了缺失值處理,分類變量onehot處理,特徵縮放處理等。這裏進行一下統一的總結。以下面代碼所示。最終獲得的訓練集有16個特徵。
對於這一環節的數據處理,sklearn中提供了pipline的方式,能夠將這一系列過程流水線化。看起來更清晰。準備好了數據以後,接下來如何進行模型選取,評估,參數調整呢。這些詳細的內容咱們下一篇文章再來系統學習~
小結
用下面的思惟導圖對本文的內容串聯一下,能夠在後臺回覆「房價」獲取本文的數據,代碼,思惟導圖和PDF版本。
reference:
《機器學習實戰:基於Scikit-Learn和Tensorflow》第二章
以清淨心看世界;
用歡喜心過生活。
超哥的雜貨鋪,你值得擁有~
長按二維碼關注咱們
推薦閱讀:
2.簡單幾步,教你使用scikit-learn作分類和迴歸預測
個人視頻號已開通,目前已經發了3個做品,正在更新SQL相關的內容~歡迎關注!
本文分享自微信公衆號 - 超哥的雜貨鋪(gh_a624b94bfdab)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。