勵嘉豪 曾丹
摘要
房價預(yù)測是大數(shù)據(jù)處理的經(jīng)典命題。本文基于kaggle平臺的房價預(yù)測數(shù)據(jù)集,實現(xiàn)了特征分析、特征清洗、特征工程、特征選擇、模型選擇和集成學(xué)習(xí)。其中特征工程中對多達79個特征的處理以及使用Stacking進行集成學(xué)習(xí)是本文的亮點除了stacking學(xué)習(xí)法,本文還嘗試了boosting學(xué)習(xí)法的XGB和LGBM以及Bagging學(xué)習(xí)法,最終在kaggle.com的最好成績?yōu)?.11274,在世界 4000多只隊中排名TOP4%,這證明本文模型有效得預(yù)測了房價同時避免了過擬合。
【關(guān)鍵詞】Housing data;Feature RMSE;Stacking;Engineering;boosting
1 引言
Kaggle平臺的房價預(yù)測是大數(shù)據(jù)處理的經(jīng)典熱門比賽。kaggle將使用Root-Mean-Squared-Error(RMSE)來評價預(yù)測房價的對數(shù)和實測房價的對數(shù),使用對數(shù)意味著你對高價和低價房屋價格預(yù)測的準(zhǔn)確度對最終結(jié)果的影響將會同等。
關(guān)于RMLSE(使用對數(shù)的均方根誤差):
Cli代表了觀測值,Pi代表了預(yù)測值,IIS代表的是記錄個數(shù)。
在現(xiàn)有結(jié)構(gòu)化數(shù)據(jù)比賽中,隨機森林RF和梯度提升回歸樹GBDT是比較熱門的,也是kaggle所推薦的算法。論文【1】通過MSE來評估模型,并選取了XGB,Lasso和Ridge的按權(quán)組合,最終得分0.11390;論文【2】通過Lasso選擇特征并使用隨機森林回歸預(yù)測,由于其并未提供最終得分故對其結(jié)果不予比較;論文【3】使用65%LASSO和35%GBR的模型組合,最佳得分為0.11260。本文中的Bagging學(xué)習(xí)法正是由隨機森林所集成,而大殺器XGB則是GBDT的強化版,它采用二階導(dǎo)數(shù)計算,增加正則項防止過擬合。
同時由于數(shù)據(jù)量不大,所以本文不考慮采用深度學(xué)習(xí)算法而是選擇了更適合處理小數(shù)據(jù)量的淺層學(xué)習(xí),因此對于特征的預(yù)處理就尤為關(guān)鍵,特別是在初始特征高達79個的情況下,如何有效地進行特征工程值得深思與推敲。
在數(shù)據(jù)分析中,本文利用python的matplollib和seabom包等使數(shù)據(jù)可視化,統(tǒng)計數(shù)據(jù)總量,分析數(shù)據(jù)是否正態(tài)分布,繪制相關(guān)圖并考慮哪些特征對最終結(jié)果又較大的影響。
數(shù)據(jù)清洗中對79個特征的缺失值進行處理,清洗異常點,并調(diào)整訓(xùn)練集的價格使之符合正態(tài)分布。
在特征工程中,本文將一些數(shù)值型變量轉(zhuǎn)換為分類變量,對一些序列型數(shù)據(jù)進行編碼,增加新的特征,對傾斜較嚴(yán)重的數(shù)值型數(shù)據(jù)通過BOX COX進行矯正,最后對分類變量進行durarn、展開。
在模型選擇方面,本文通過交叉驗證選擇了LASSO,RIDGE,ELA,SVR,KR-R等模型,并分別調(diào)參。
在模型融合學(xué)習(xí)法中,使用Stacking構(gòu)建兩層學(xué)習(xí)器,用第一層訓(xùn)練的結(jié)果去預(yù)測第二層,并將stacking結(jié)果與其他學(xué)習(xí)法XGB,Bagging,以及LGBM按權(quán)相加,最終輸出提交的預(yù)測樣本。
2 特征分析
使用Python的工具包,可以使數(shù)據(jù)之間的聯(lián)系變得更加立體,這對于數(shù)據(jù)工程師來說是不可或缺的技能。Kaggle提供了三個CSV文件,分別是訓(xùn)練集train.esv,測試集test.csv,以及提交樣本submission.csv。訓(xùn)練集和測試集由79個特征構(gòu)成,其中36個是數(shù)值型特征,43個是類別特征,訓(xùn)練集有1460個樣本,而測試集中有1459個樣本。
2.1 查看銷售量與月份的關(guān)系
如圖1所示。
2.2 研究SalePrice和GrLivArea的關(guān)系
如圖2所示。
除此之外,本文繪制了特征效果圖以及挖掘最相關(guān)的五個特征,研究了SalePrice和overallqual的關(guān)系,以及替相關(guān)度較高的特征做散點圖,在此不——列舉。
3 特征清洗
3.1 異常值清洗
異常值對于最終結(jié)果的影響不容小覷,所以我們第一步選擇對異常值進行清洗。通過前面特征分析時的經(jīng)驗,我們敏銳地發(fā)現(xiàn)在圖6中,存在前者大于4000而后者卻低于30000的情況,于是我們將這些異常值清除。
3.2 調(diào)整價格
由于價格分布不符合正態(tài)分布,所以對價格進行10Glp變換使之符合正態(tài)分布。
3.3 處理缺失值
通過定義的查缺函數(shù),我們可以得到缺失值情況:
如表1,可以看到有將近34個特征有缺失值,其中POOLQC的缺失量高達2900多.缺失值處理如下:
PoolQC:
除三個特例(有面積無質(zhì)量)用平均值填充外,其余填None。
IotFrontage:
使用與Neighborhood相關(guān)的多項式擬合。
GaragcYrBIt:
離散化后填None。
MSZonging:
按出現(xiàn)最多的組合填。
其余缺失值分別填0,None或眾數(shù)。
4 特征工程
本文的特征工程是一大亮點,基于79個不同的原始特征,本文分別對其進行變換,使之盡可能提升回歸任務(wù)的準(zhǔn)確性。
4.1 標(biāo)簽化
首先將一些類別型特征轉(zhuǎn)換為數(shù)值型特征標(biāo)簽化。
4.2 創(chuàng)造新屬性
(1)基于某一項原始特征的特殊取值構(gòu)建的新特征,以right_season為例,將mosold特征中為5,6,7月的樣本season定義為1,其余定義為0,那么right season就代表了這個樣本是否是在房市旺季出售(從對mosold特征分析的圖表6可以知道5,6,7月份銷售量最大)。
(2)對訓(xùn)練樣本的SalePrice做分類,分類結(jié)果存在新特征Price_Category中,低于15000的為0,15000到25000之間為1,大于25000的為2。同時我們選用了支持向量機SVM對測試樣本進行超平面劃分,對測試樣本的Price_Category進行分類,這個預(yù)測區(qū)間對將來的回歸預(yù)測有重要影響。
4.3 離散化
增加完新變量以后,對涉及年份的特征進行離散化。這樣做除了增強了模型的非線性能力外,還從一個很大權(quán)值管理一個特征,拆分成了許多小的權(quán)值管理這個特征多個表示,降低了特征值擾動對模型為穩(wěn)定性影響,也降低了異常數(shù)據(jù)對模型的影響,進而使得模型具有更好的魯棒性。
最后,對數(shù)值型數(shù)據(jù)去四分之三位標(biāo)準(zhǔn)化處理。對一部分?jǐn)?shù)據(jù)使用BOX COX進行轉(zhuǎn)換使之符合正態(tài)分布。
5 特征選擇
如圖3,對現(xiàn)有數(shù)據(jù)做特征選擇,選出重要的特征,進行特征組合,生成新增有用特征,同時不重要的特征需要考慮剔除。本文選用LASSO進行特征選擇:
選擇最重要的特征例如'LotArea','TotalBsmtSF','GrLivArea','GarageArea','KitchenQual'和其他特征相結(jié)合,通過定義自動生成函數(shù),更快生成大量的新特征。同時添加了一些重要的冗余項,組合生成三個新特征House,Area,Rooms:分布表示了房屋總面積,帶上車庫總面積和房間總個數(shù)。不重要的特征例如TotConfig Cornef等則被剔除。
6 模型選擇
在回歸模型的選擇上,本文初始考慮了14個模型,為了鑒別他們的好壞,定義了基于RMSE的交叉驗證評估指標(biāo)。所謂交叉驗證法,就是將訓(xùn)練集再劃分,分為K個大小相似的互斥子集,每次訓(xùn)練K-1個子集,剩下的那個子集作為驗證集,最后將K個驗證結(jié)果平均。交叉驗證主要用于評價模型的泛化能力,從而進行模型選擇。本文采用十折交叉驗證,即取K=10。經(jīng)初步驗證,各模型(參數(shù)默認(rèn)狀態(tài)下)得分如表2。
總體看來,樹模型普遍不如線性模型,分析下來覺得是特征稀疏化帶來的影響。
于是基于初步驗證,本文選擇了Ridge,Lasso,Gbr,Svr,Ela,Bay,Ker,Xgb,LGB這9個模型。接下來是對單個模型的調(diào)參,通過定義的調(diào)參函數(shù),利用GridSearchCV(網(wǎng)格搜索)對模型進行參數(shù)調(diào)整。調(diào)參以后各模型得分如表3.
7 集成學(xué)習(xí)
本文集成學(xué)習(xí)策略方面分為Stacking和其他。
7.1 其他學(xué)習(xí)方法
Bagging是并行式集成學(xué)習(xí)方法最著名的代表,采樣T個包含m個訓(xùn)練樣本的采樣集,對此訓(xùn)練出T個基學(xué)習(xí)器,最后對這些基學(xué)習(xí)器采用簡單平均法得到最終結(jié)果。
如表4,本文使用Ridge作為基學(xué)習(xí)器,對bagging得分進行評價:
可以看到相比于單個Ridge,Bagging提高了泛化性能。
Xgboost(極度梯度提升)由CAR]回歸樹集成,是屬于boosting類的集成學(xué)習(xí)。與GBDT相比,XGB對代價函數(shù)進行了二階泰勒展開,同時用到了一階與二階導(dǎo)數(shù)。另一方面,xgboost在損失函數(shù)里加入的正則項,正則項里包含了樹的葉子節(jié)點個數(shù)、每個葉子節(jié)點上輸出score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的vanance,使學(xué)習(xí)出來的模型更加簡單,防止過擬合。
lightGBM也是Boosting集成學(xué)習(xí)的一種,包含兩個關(guān)鍵點:light即輕量級,GBM梯度提升機。與XGB相對比,在過濾數(shù)據(jù)樣例尋找分割值時,LightGBM使用的是全新的技術(shù):基于梯度的單邊采樣(GOSS)(XGBoost則通過預(yù)分類算法和直方圖算法來確定最優(yōu)分割)。GOSS保留所有的大梯度樣例,并在小梯度樣例上采取隨機抽樣。為了使用相同的數(shù)據(jù)分布,在計算信息增益時,GOSS在小梯度數(shù)據(jù)樣例上引入一個常數(shù)因子。因此,GOSS在減少數(shù)據(jù)樣例數(shù)量與保持已學(xué)習(xí)決策樹的準(zhǔn)確度之間取得了很好的平衡。
7.5 Stacking學(xué)習(xí)法
對于stacking學(xué)習(xí)法的個體學(xué)習(xí)器需要考慮的標(biāo)準(zhǔn)是好而不同,基于這個準(zhǔn)則本文選擇并分析了以下模型
7.2.1 Lasso&Ridge
兩個模型都引入了正則化項,其中Lasso引入的是L1范數(shù)而Ridge引入的是L2范數(shù)。這兩個范數(shù)都有助于降低過擬合的風(fēng)險,同時L1范數(shù)可以帶來額外的好處,稀疏解,即只有少數(shù)重要特征權(quán)重非0,相當(dāng)于做了特征選擇。
7.2.2 ELA
彈性網(wǎng)絡(luò)在嶺回歸和Lasso回歸中進行了折中,通過混合比(mix ratio)r進行控制:r=0:彈性網(wǎng)絡(luò)變?yōu)閹X回歸r=1:彈性網(wǎng)絡(luò)便誤Lasso回歸。
7.2.3 KNN
一種常用的監(jiān)督學(xué)習(xí)方法,對于給定的測試樣本,基于某種距離度量出訓(xùn)練集中與之最近的K個樣本,對這K個樣本的目標(biāo)值進行平均得到預(yù)測值。作為懶惰學(xué)習(xí)的著名代表,此類學(xué)習(xí)技術(shù)在訓(xùn)練階段僅僅把樣本保存起來,訓(xùn)練時間開銷為0,直到收到測試樣本才開始處理。
7.2.4 BAY
貝葉斯學(xué)習(xí)過程可簡述在前一個訓(xùn)練集合的后驗概率上,乘以新的測試樣本點的似然估計,得到新的集合的后驗概率。其優(yōu)點有:
(1)貝葉斯回歸對數(shù)據(jù)有自適應(yīng)能力,可以重復(fù)的利用實驗數(shù)據(jù),并防止過擬合。
(2)貝葉斯回歸可以在估計過程中引入正則項。
7.2.5 SVR
支持向量回歸與傳統(tǒng)回歸不同之處在于傳統(tǒng)回歸模型通常直接基于模型輸出和真實輸出之間的差別來計算損失,除非兩者完全相同,誤差才為0,而SVR允許一個最大為E的偏差,即模型輸出和真實輸出誤差大于E時才計算損失,間隔帶內(nèi)的訓(xùn)練樣本被認(rèn)為是預(yù)測正確的。
簡單的stacking將各個模型平均相加,考慮到各個個體學(xué)習(xí)器性能差別不大,我們不用賦予他們不同的權(quán)值,簡單的平均處理可能更好。平均以后評分如表5所示。
考慮兩層stacking,對這個過程稍微做些詳細(xì)的解釋。以十折交叉驗證為例,假設(shè)第一層的模型1是Ridge,我們訓(xùn)練集有1400行,測試集有1400行(大致)。首先將整個訓(xùn)練樣本分為10份,每次用其中的9份1260行,剩下的一份就是140行,每次拿基于那九份1260行訓(xùn)練出的Ridge模型對剩下的140行進行預(yù)測,第一次會得到140行1列的a1,同時,還要拿這個模型對原來1400行的測試集進行預(yù)測,得到1400行1列的b1,因為是十折,所以十次以后會得到a1到a10和b1到b10.之后,把10個140行的ax(x取值1到10)拼接起來就變成了1400行1列的A1。而對于b1-b10,取平均,將1400行10列變成1400行1列的B1。以上是對于第一個模型的操作,如果第一層一共有4個模型,那么就會得到A1,A2,A3,A4和B1,B2,B3,B4.將A1-A4合并為1400行4列的train data,將B1-B4合并為1400行4列的test data,讓第二層的模型以train data為輸入,test data為輸出進行訓(xùn)練,便是一個兩層stacking集成學(xué)習(xí)的流程。集成學(xué)習(xí)以后的評分如表6。
可以看到兩層stacking集成學(xué)習(xí)結(jié)果比簡單平均效果要好。
8 結(jié)果
最后,用訓(xùn)練完成的模型對測試集進行訓(xùn)練,通過定義的函數(shù)計算測試結(jié)果與訓(xùn)練樣本結(jié)果的對數(shù)均方差。幾個模型對數(shù)均方差如表7。
最終提交的結(jié)果選取Stacking,XGB,LGBM和Bagging按一定權(quán)值相加,以Stacking為主,得分最高為0.11274最后排名全球4000支隊中TOP4%。
9 總結(jié)與展望
本文展示了一個結(jié)構(gòu)化數(shù)據(jù)比賽的所有流程。包括對特征的清洗,缺失值的填充,擴展新特征,選擇特征,選擇模型,調(diào)模型參數(shù),以及模型融合。
缺失值填充的時候需要注意樣本的數(shù)據(jù)分布,不能盲目填充0或者None,擴展的特征必須是有價值的,不然會造成過多冗余,選擇特征的時候不能隨意刪減增加,防止丟失有用特征。最重要的一點是模型的選擇,基于數(shù)據(jù)樣本不同分布選擇不同模型,不能印象主義,要實際驗證以后選擇合適的模型。尤其是Stacking的第一層基學(xué)習(xí)器,要遵守好而不同的原則,避免質(zhì)量層次不齊或者類型重復(fù)的現(xiàn)象。
在將來,對新特征進行更多創(chuàng)造性的構(gòu)造將成為首要任務(wù),對數(shù)據(jù)樣本做進一步的挖掘。同時,特征選擇的時候做到有用的全保留,沒用的盡量刪減,減少學(xué)習(xí)任務(wù)難度,模型的選擇范圍也將進一步縮小,做到真正的好而不同。
參考文獻
[1]ChenchenFan Zechen Cui XiaofengZhong 'House Prices Prediction withMachine Learning AlgorithmsICMLC2018:6-10.
[2]Bharatendra Rai'Feature Selectionand Predictive Modeling ofHousing Data Using Random Forest'International Journal of Industrialand Systems Engineering Vol:11,No:4,2017.
[3]Sifei Lu,Zengxiang Li,ZhengQin,Xulei Yang,Rick Siow MongGoh'A Hybrid Regression Techniquefor House Prices Prediction'IEEE International Conference onIndustrial Engineer ing&EngineeringManagement,2018:319-323.
[4]https://www.kaggle.com/serigne/stacked-regressions-top-4-on-leaderboard
[5]周志華‘機器學(xué)習(xí).