1. 程式人生 > >房價精準預測,大資料+機器學習幫你搞定

房價精準預測,大資料+機器學習幫你搞定

一提到房價,就“壓力山大”!無論是首套房還是改善性需求,買在低點賣在高點都是一個可遇不可求的事兒,所以如果有位資料大俠能幫助設計一個預測房價的神器,豈不是“人生很值得”!本期DT資料俠與紐約資料科學學院合作的資料線專欄中,四位資料俠通過“資料超能力”試圖利用Python通過機器學習方式來預測房價,快來看看他們是如何做得吧!

如果讓你全憑直覺來判斷,上圖裡的四個房子哪個最貴?

 

(也許)大多數人會說是右邊的藍色房子,因為它看起來最大也最新。然而,當你看完今天這篇文章,你可能會有不同的答案,並且發現一種更準確的預測房屋價格的方法。

 

這個專案的資料集可以在kaggle頁面(https://www.kaggle.com/c/house-prices-advanced-regression-techniques)找到:這些資料被分為兩類,訓練集和測試集。

關注微信公眾號:程式設計師交流互動平臺!獲取資料學習!

資料列表一共有2600行、79列,包括了不同房屋的描述性資料,比如臥室數、一層的房屋面積等。訓練集裡還包括了房屋的真實價格資料。

 

因變數

房屋價格總體來看,是一個平均值和中位數在20萬美元左右的向右傾斜的分佈,最高的價格在55萬到75萬之間。

自變數

 

類別變數(Categorical Variables )

大多數(79種變數中有51種)是定性變數(categorical),包括房子所在社群、整體質量、房屋型別等。最好預測的變數是與質量相關的變數。比如,整體質量這個變數最終證明是預測價格的最關鍵因素。房子某一個部分的質量,比如泳池、地下室等,也都與最終價格有很強的相關性。

 

數字變數(numeric variables)

 

數字變數大多是關於房屋面積。它們也與價格相關。

 

缺失的資料

過程中的一大挑戰是那些缺失的資料,對於像泳池質量、泳池面積等資料,如果資料缺失了,則說明這棟房子沒有泳池,我們會用0來代替,如果是定性變數,則用“無”來代替。對於那些“意外缺失”的資料,我們則通過其他變數進行估算,補充進去。

特徵工程

 

處理一大堆不清晰的特徵總是充滿挑戰。下面我們要創造和拋棄一些變數,並引入一些啞變數等。

 

拋棄變數

 

通常人們會刪除一些相互高度關聯的特徵。在我們的分析中,我發現車庫建造年份和房屋建造年份關聯度很強,關聯值達到0.83。而且75.8%以上的情況下,這兩個值是相同的。因此,我們決定把有很多缺失的車庫年份資料丟掉。

 

創造新的變數

 

有時候需要創造新的變數從而提升整個模型的表現,我們設計了兩個新變數:

 

1. 賣掉時的房齡

 

2. 賣掉時距重新裝修過去多少年

 

處理變數

 

1. 我們找出11個定性變數,它們存在某種排序的可能,可以分別將它們劃分為很棒、一般和很差;

 

2. 對於其他的定性變數,我們使用pandas.get_dummies來得到獨熱編碼(One-Hot Encoding);

關注微信公眾號:程式設計師交流互動平臺!獲取資料學習!

3. 我們找到24個連續資料變數,它們的斜率大於0.75(向右傾斜),我們使用對數變換來去掉本身的偏態。

正則化(regularization)

 

因為我們需要處理很多變數,所以我們引入了正則化的操作,來處理在過程中發現的那些多重共線性關係,以及使用多元線性迴歸模型可能帶來的過度擬合問題。

 

正則化最棒的地方在於它能減少模型的複雜性,因為它能自動地為你完成特徵挑選的任務。所有正則化模型都會懲罰多餘的特徵。

 

正則化的模型包括 Lasso、Ridge 模型和彈性網路(Elastic Net)。Lasso 演算法(最小絕對值收斂和選擇演算法)會將係數設為0,而ridge迴歸模型會最小化係數,使其中的一些非常接近0。彈性網路模型是Lasso和Ridge的混合。它將彼此相關的變數分到同一組,如果裡面有一個變數是個很強的預測變數(predictor),那麼整個組都會被納入這個模型。

 

下一步是將每個模型的超引數進行交叉驗證。 

 

我們將Lasso模型的阿爾法定為 = .0005,Ridge的阿爾法為2.8 。彈性網路模型的阿爾法為 .0005 , L1_Ratio = 0.9。因為當 L1_Ratio = 0.9 時,彈性網路模型十分接近 Lasso模型,後者有預設的 L1_Ratio = 1 。

特徵選擇

Lasso模型

 

對房屋價格的正運算元係數:地上生活空間、整體房子狀況以及Stone Bridge、North Ridge 和 Crawford社群。

 

負運算元係數:MS Zoing、Edwards 社群和地上廚房。

 

Ridge模型

 

對房屋價格的正運算元係數:整體住宅面積、房頂材料(木瓦)、整體狀況。

 

負運算元係數:一般的分割槽需求、離主幹道或鐵路的距離,以及游泳池狀況良好。

 

訓練資料中模型預測的價格和真實價格的對比

 

下面兩圖展示了我們的模型的精確度。離紅線近的以及在紅線上面的是我們預測準確的,那些偏離的比價多的需要我們進一步研究。

梯度提升迴歸(Gradient boosting regression)

 

梯度提升迴歸是我們表現最好的一個演算法。我們最初使用全部特徵(基準模型)來訓練梯度提升機。我使用 scikit-learn這個Python包提供的 GridSearchCV 功能來進行引數調整的交叉驗證。我們最好的模型引數是:學習值0.05,估計量2000,最大深度3。

 

我們製作了一個相對重要性表格,將梯度提升特徵的重要性用視覺化的方式呈現。特徵重要性分數代表每個特徵在構建這個加強版的決策樹裡是否有用。地上生活空間面積、廚房質量、地下室面積以及車庫大小是最重要的特徵。

PCA(主成分分析 )+ 梯度提升迴歸

 

我們接下來嘗試通過減少特徵的維度來提高我們基準模型的表現。高維度的資料可能很分散,就會讓使用某種演算法來訓練有用的模型變得更難。總的來說,最優的、非多餘的特徵子集會對預測性的演算法有好處,能夠提高訓練率以及加強它的可解釋性和一般性。

 

我們使用 scikit-learn 的 Pipelines 來管理我們的機器學習模型,它允許我們通過應用一個估計量來完成一系列資料的轉化工作。

在這裡我還是要推薦下我自己建的大資料學習交流裙:805127855, 裙 裡都是學大資料開發的,如果你正在學習大資料 ,小編歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有大資料開發相關的),包括我自己整理的一份2018最新的大資料進階資料和高階開發教程,歡迎進階中和進想深入大資料的小夥伴。
 

我們設計了不同的pipeline,每一個有不同的估計量。對於梯度提升迴歸,我們的pipelin包括:

 

1. 特徵縮放,使用了scikit-learn 的python包

 

2. 降維,使用PCA(留下了150個主要的成分)

 

我們完成了特徵工程後,得到200個特徵和大約1500行訓練資料集。在看過累積方差的百分比的表格後,我們決定留下150個核心元素。

並不是所有調整都能優化結果。在我們用PCA操作後,交叉驗證的分數並沒有提高,甚至惡化了(從0.91降到了0.87)。我們相信是降維時,也去掉了一些關鍵資訊。PCA 不僅去掉了隨機出現的噪音,也去掉了有價值的資訊。

 

PCA + 多元線性迴歸

 

對於多元線性迴歸,我們的pipeline 包括:

 

1. 特徵縮放,使用了scikit-learn 的python包

 

2. 降維,使用PCA(留下了150個主要的成分)

 

使用多元線性迴歸的PCA 也沒有帶來好的結果。交叉驗證的分數並沒有提高,甚至惡化了。

 

模型比較

 

XG Boost 是表現最好的模型,多元線性迴歸表現最差,其他模型的結果差不多。

使用單獨某一個模型都能讓我們得到不錯的結果。但是,通常來說,真實生活中的問題並沒有一種線性或者非線性的關係,可以讓我們用一個單獨的模型來重現。把保守和激進、線性和非線性的模型結合起來,才能最好地呈現房價預測這個問題。

 

融合(stacking 和 ensembling)

 

我們先嚐試了一個簡單的合模型(ensembling),以50-50的比例將 XGBoost(非線性)和ENet(線性)組合在一起。

 

接下來,我們按照模型融合(stacking)的基本方法,又嘗試了多個不同模型,來看哪個效果最好。下圖記錄了這些不同模型的表現情況。

結論

 

下面的相關性熱點圖展示了我們不同模型的預測價格。可以看到,彈性網路、Lasso和Ridge本質上很相似,而兩種融合方式也彼此很像。與其他都明顯不同的是 XGBoost 模型

未來可研究方向

 

1. 研究自變數之間的相關性

 

2. 嘗試更多的特徵工程

 

3. 使用聚類分析來創造更多新的特徵

 

4. 對不同模型使用不同的特徵選擇方法:線上性模型中拋棄掉特定的特徵,而在樹形模型中保持大多數的特徵。

在這裡我還是要推薦下我自己建的大資料學習交流裙:805127855, 裙 裡都是學大資料開發的,如果你正在學習大資料 ,小編歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有大資料開發相關的),包括我自己整理的一份2018最新的大資料進階資料和高階開發教程,歡迎進階中和進想深入大資料的小夥伴。