原創|大數據新聞|編輯:鄭恭琳|2020-12-02 16:25:21.393|閱讀 371 次
概述:Kaggle官網提供了大量的機器學習數據集,本文從其中選擇了Boston HousePrice數據集,展示了如何建立機器學習模型的通常過程。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
本文采用Kaggle上面的Boston HousePrice數據集展示了如何建立機器學習模型的通常過程,包括以下幾個階段:
標簽變量(房價)采取了對數轉換,使其符合正太分布,最后從12個備選模型中[補充模型名稱]選出預測效果最好的6個模型Lasso,Ridge,SVR,KernelRidge,ElasticNet,BayesianRidge分別進行加權平均集成和Stacking集成,最后發現Stacking集成效果更好,創新之處在于將Stacking集成后的數據加入原訓練集中再次訓練Stacking集成模型,使得模型性能再次得到改善,作為最后的預測模型,預測結果提交kaggle上后表現不錯。另外受限于訓練時間,超參數搜索空間小,有待改善。
Kaggle官網提供了大量的機器學習數據集,本文從其中選擇了Boston HousePrice數據集,下載地址為//www.kaggle.com/c/house-prices-advanced-regression-techniques/data,下載后的數據集包括train.csv,test.csv,data_description.txt,sample_submission.csv四個文件,顧名思義train.csv為訓練數據集,用于訓練模型,test.csv為測試數據集,用于驗證模型的準確性,data_description.txt描述train.csv字段,sample_submission.csv提供了最后提交文件的樣式。其中訓練集有1459條樣本,81個字段,一個ID字段,一個標簽SalePrice字段,測試集共有1458條樣本,80個字段。
賽題給我們79個描述房屋的特征,要求我們據此預測房屋的最終售價,即對于測試集中每個房屋的ID給出對于的SalePrice字段的預測值,主要考察我們數據清洗、特征工程、模型搭建及調優等方面的技巧。本賽題是典型的回歸類問題,評估指標選用的是均方根誤差(RMSE),為了使得價格的高低對結果的評估有均等的影響,賽題均方根誤差基于預測值和實際值分別取對數來計算。特征初步分析:
特征名稱 |
描述 |
類型 |
單位 |
SalePrice |
房屋售價,我們要預測的label |
數值型 |
美元 |
MSSubClass |
建筑的等級 |
類別型 |
|
MSZoning |
區域分類 |
類別型 |
|
LotFrontage |
距離街道的直線距離 |
數值型 |
英尺 |
LotArea |
地皮面積 |
數值型 |
平方英尺 |
Street |
街道類型 |
類別型 |
|
Alley |
巷子類型 |
類別型 |
|
LotShape |
房子整體形狀 |
類別型 |
|
LandContour |
平整度級別 |
類別型 |
|
Utilities |
公共設施類型 |
類別型 |
|
LotConfig |
房屋配置 |
類別型 |
|
LandSlope |
傾斜度 |
類別型 |
|
Neighborhood |
市區物理位置 |
類別型 |
|
數據清洗,是整個數據分析過程中不可缺少的一個環節,其結果質量直接關系到模型效果和最終結論。數據清洗對象主要有離群點、缺失值、重復值,以及數據轉換等。
離群值
離群點通常指的是數值型變量,通過做特征GrLivArea和SalePrice散點圖發現右下方存在兩個異常點,因為不太可能居住面積越大,而售價卻越低,因刪除。
變量轉換
SalePrice是我們需要預測的目標變量,下面對SalePrice做一些分析。用正太分布去擬合SalePrice,同時做其正太概率圖圖可以發現目標變量呈現右偏態分布。
因為線性模型更適合擬合正太分布,因此需要對目標變量做log轉換使其接近正態分布。做log變換后重復上面步驟發現偏度明顯減小,幾乎接近正態分布。
缺失值
將訓練集與測試集合在一個數據框中一起處理缺失值。分析數據缺失情況,如下圖所示
思考:
根據各個特征的實際意義分別進行缺失值填充。分析各特征與SalePrice的相關性,最好使用熱力圖。
可以看到對角線有一條白線,這代表相同的特征相關性為最高,但值得注意的是,有兩個正方形小塊:TotaLBsmtSF和1stFlrSF、GarageAreas和GarageCars處。這代表全部建筑面積TotaLBsmtSF與一層建筑面積1stFlrSF成強正相關,車庫區域GarageAreas和車庫車輛GarageCars成強正相關,那么在填補缺失值的時候就有了依據,我們可以直接刪掉一個多余的特征或者使用一個填補另一個。
對于特征PoolQC,因為具有很高的缺失率,NA表示不帶游泳池,根據常識中大多數房屋都不帶游泳池,因此缺失值全部用None填充。
對于特征MiscFeature,Alley,Fence,FireplaceQu和MSSubClass,NA都表示沒有特征所代表的實際意義,因此缺失值都用None填充。
對于特征LotFrontage,根據特征描述,因為任一房屋都非常可能與它的鄰居擁有相同的相連的街道區域,因此可以按照特征Neighborhood分組后在根據其眾數填充。
對于特征GarageType, GarageFinish, GarageQual , GarageCond,直接用None填充。
對于特征GarageYrBlt, GarageArea 和GarageCars,因為都是數值型變量,缺失表示沒有,因此全部用0填充。
對于特征BsmtFinSF1, BsmtFinSF2, BsmtUnfSF, TotalBsmtSF, BsmtFullBath和BsmtHalfBath,都是數值型變量,缺失都表示沒有,全部用0填充。
對于特征BsmtQual, BsmtCond, BsmtExposure, BsmtFinType1 和BsmtFinType2,都是類別型變量,缺失表示沒有basement,因此都用None填充。
對于特征MasVnrArea 和MasVnrType,因為NA很可能意味著沒有表層砌體飾面,因此分別用0和None填充。
對于特征MSZoning,Electrical ,KitchenQual,Exterior1st ,Exterior2nd和SaleType,因為缺失率較低,全部用眾數填充。
對于特征Functional ,因為NA意味著typical,因此用Typ填充。
對于特征Utilities,除了兩個NA和一個NoSeWa外,全部為AllPub,又NoSeWa屬于訓練集中,因此這個特征對于訓練模型沒有意義,應該刪除。
編碼
1. 有些數據實際含義是類別型特征,在此處用了數值表示,需要將其轉化為類別型特征,比如賣出的月份MoSold,這些變量有MSSubClass,BsmtFullBath,BsmtHalfBath,HalfBath,BedroomAbvGr,KitchenAbvGr,MoSold,YrSold,YearBuilt,YearRemodAdd,LowQualFinSF,GarageYrBlt。
2. 對SalePrice按照分類型變量進行分組后,進行特征映射。以變量MSSubClass為例,依據平均值可以將MSSubClass映射為右圖所示。
依次對變量MSSubClass, MSZoning, Neighborhood, Condition1, BldgType, HouseStyle, Exterior1st, MasVnrType, ExterQual, Foundation, BsmtQual, BsmtExposure, Heating, HeatingQC, KitchenQual, Functional, FireplaceQu, GarageType, GarageFinish, PavedDrive, SaleType, SaleCondition分組后進行特征映射。
3. 下面對特征進行編碼,采用LabelEncode和OneHotEncode。先對于三個跟年相關的變量YearBuilt, YearRemodAdd, GarageYrBlt進行LabelEncoding編碼,然后對于那些偏度很大的變量,先進行log1p轉換后在進行OneHotEncode。接著將數據集按照原來的比例拆分為訓練集和測試集,因為擔心訓練集和測試集中還有大量的離群點,考慮到模型的穩健性,使用robustscaler對所有數據進行縮放。
對數據完成了預處理,下面就進入了特征過程。
有這么一句話在業界廣泛流傳:數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已。顧名思義,其本質是一項工程活動,目的是最大限度地從原始數據中提取特征以供算法和模型使用。通過總結和歸納,人們認為特征工程主要包括特征創造和特征選擇。
特征選擇
特征選擇主要有兩個目的一是減少特征數量、降維,使模型泛化能力更強,二是減少過擬合, 增強對特征和特征值之間的理解。選取特征主要依據以下兩點:
一、特征是否發散:如果一個特征不發散,例如方差接近于0,也就是說樣本在這個特征上基本上沒有差異,這個特征對于樣本的區分并沒有什么用。
二、特征與目標的相關性:這點比較顯見,與目標相關性高的特征,應當優選選擇。除方差法外,本文介紹的其他方法均從相關性考慮。
基于以上兩點,特征選擇 的常用方法有移除低方差的特征,卡方(Chi2)檢驗,Pearson相關系數,互信息和最大信息系數,距離相關系數,Wrapper,Embedded。
因為特征量較大,選擇Embedded中基于懲罰項的特征選擇法。Embedded主要思想是:使用某些機器學習的算法和模型進行訓練,得到各個特征的權值系數,根據系數從大到小選擇特征。類似于Filter方法,但是是通過訓練來確定特征的優劣。其實是講在確定模型的過程中,挑選出那些對模型的訓練有重要意義的屬性。考慮到LASSO回歸因為L1正則項同時具有特征選擇和降維的作用,特別適合稀疏樣本,因為前面進行編碼后造成特征膨脹,樣本變得稀疏,因此選擇LASSO回歸來篩選特征。對訓練集應用LASSO回歸,輸出所有特征的特征重要性如下
接著篩選出特征重要性不為0的特征,如下圖所示。
特征創造
基于特征重要性,可以創造一些新的特征,比如顧客可能關心的是房屋的總面積,因此可以組合新的特征。
X["TotalArea"]=X["TotalBsmtSF"]+X["1stFlrSF"]+X["2ndFlrSF"]+X["GarageArea"],同理根據原有特征描述以及實際意義,可以組合出以下新的特征。
X["TotalHouse"] = X["TotalBsmtSF"] + X["1stFlrSF"] + X["2ndFlrSF"]
X["TotalHouse"]=X["TotalBsmtSF"]+X["1stFlrSF"]+X["2ndFlrSF"]
X["TotalArea"]=X["TotalBsmtSF"]+X["1stFlrSF"]+X["2ndFlrSF"]+X["GarageArea"]
X["+_TotalHouse_OverallQual"]=X["TotalHouse"]*X["OverallQual"]
X["+_GrLivArea_OverallQual"]=X["GrLivArea"]*X["OverallQual"]
X["+_oMSZoning_TotalHouse"]=X["oMSZoning"]*X["TotalHouse"]
X["+_oMSZoning_OverallQual"]=X["oMSZoning"]+X["OverallQual"]
X["+_oMSZoning_YearBuilt"]=X["oMSZoning"]+X["YearBuilt"]
X["+_oNeighborhood_TotalHouse"]=X["oNeighborhood"]*X["TotalHouse"]
X["+_oNeighborhood_OverallQual"]=X["oNeighborhood"]+X["OverallQual"]
X["+_oNeighborhood_YearBuilt"]=X["oNeighborhood"]+X["YearBuilt"]
X["+_BsmtFinSF1_OverallQual"]=X["BsmtFinSF1"]*X["OverallQual"]
X["-_oFunctional_TotalHouse"]=X["oFunctional"]*X["TotalHouse"]
X["-_oFunctional_OverallQual"]=X["oFunctional"]+X["OverallQual"]
X["-_LotArea_OverallQual"]=X["LotArea"]*X["OverallQual"]
X["-_TotalHouse_LotArea"]=X["TotalHouse"]+X["LotArea"]
X["-_oCondition1_TotalHouse"]=X["oCondition1"]*X["TotalHouse"]
X["-_oCondition1_OverallQual"]=X["oCondition1"]+X["OverallQual"]
X["Bsmt"]=X["BsmtFinSF1"]+X["BsmtFinSF2"]+X["BsmtUnfSF"]
X["Rooms"] = X["FullBath"]+X["TotRmsAbvGrd"]
X["PorchArea"]=X["OpenPorchSF"]+X["EnclosedPorch"]+X["3SsnPorch"]+X["ScreenPorch"]
X["TotalPlace"]=X["TotalBsmtSF"]+X["1stFlrSF"]+X["2ndFlrSF"]+X["GarageArea"]+["OpenPorchSF"]+X["EnclosedPorch"]+X["3SsnPorch"]+X["ScreenPorch"]
降維
前面進行了編碼和特征創造后,特征矩陣過大,導致計算量大,訓練時間長的問題,因此降低特征矩陣維度也是必不可少的。但在該案例中采用PCA技術降維選擇40個主成份效果差于采用400個主成份,400接近特征維度,表明模型過擬合程度不大。
模型融合和尋找高級特征是提升機器學習性能的兩個重要手段。模型融合的方法很多,比如bagging,stacking,boosting,average weight,voting等。本文選擇average weight和stacking這兩種方法。用于融合的模型有LinearRegression,Ridge,Lasso,Random Forrest,Gradient Boosting Tree,Support Vector Regression,Linear Support Vector Regression,ElasticNet,Stochastic Gradient Descent,BayesianRidge,KernelRidge,ExtraTreesRegressor共12個基礎模型。
評估函數
因為該案例是典型的回歸問題,對于回歸問題最適合采用基于距離的的評估函數,本文采用均方誤差,調用庫scikit-learn中cross_val_score函數評估模型效果。cross_val_score函數采用K折交叉驗證,將訓練樣本分割成K份,一份被保留作為驗證模型的數據(test set),其他K-1份用來訓練(train set)。交叉驗證重復K次,每份驗證一次,平均K次的結果或者使用其它結合方式,最終得到一個單一估測,這個方法的優勢在于,同時重復運用隨機產生的子樣本進行訓練和驗證,運用同樣的樣本可以訓練模型制定的次數,在樣本量不足的環境下有用,交叉驗證用于評估模型的預測性能,尤其是訓練好的模型在新數據上的表現,可以在一定程度上減小過擬合,還可以從有限的數據中獲取盡可能多的有效信息。應用cross_val_score計算出各模型的得分情況如下
超參數調優
超參數是在開始學習過程之前設置值的參數,而不是通過訓練得到的參數數據。通常情況下,需要對超參數進行優化,給學習機選擇一組最優超參數,以提高學習的性能和效果。對于所選擇的12個備用模型,很多都有需要自己設置的超參數,一十不知道如何設置。我們采用網格搜索最優參數。搜索前,先給每個參數準備一個參數網,然后調用scikit-learn庫中的GridSearchCV搜索最有或者次優參數。以Kernel Ridge(核嶺回歸)為例,KernelRidge()有四個超參數,alpha,kernel,degree,coef0。根據經驗,設置參數網param_grid={'alpha':[0.2,0.3,0.4],'kernel':["polynomial"],'degree':[3],'coef0':[0.8,1.0]}。結果如下
由此此網格中的最優參數是alpha:0.2,coef:1,degree:3,kernel:polynomial。注意采用網格搜索無法求出全局的最優參數,只能求出指定網格中的最優參數表,因而是次優的。可以依次求出各個模型的最佳超參數如下。
Lasso |
Alpha:0.005 |
max_iter:10000 |
|
|
Ridge |
Alpha:60 |
|
|
|
SVR |
C:13 |
Epsilon:0.009 |
Gamma:0.0004 |
Kernel:rbf |
ElasticNet |
Alpha:0.005 |
l1_ratio:0.08 |
max_iter:10000 |
|
接下來進行模型融合,先使用加權平均的方法,根據備選模型選擇得分最佳的6個模型來進行融合,并且根據得分情況分配他們的權重。模型分別是
模型 |
權重 |
lasso=Lasso(alpha=0.0005,max_iter=10000) |
0.02 |
ridge = Ridge(alpha=60) |
0.2 |
svr=SVR(gamma=0.0004,kernel='rbf',C=13,epsilon=0.009) |
0.25 |
ker=KernelRidge(alpha=0.2 ,kernel='polynomial',degree=3 ,coe8) |
0.3 |
ela = ElasticNet(alpha=0.005,l1_ratio=0.08,max_iter=10000) |
0.03 |
bay = BayesianRidge() |
0.2 |
模型融合后的最終得分為0.1077,好于單個模型的得分情況。
下面采用Stacking的模型集成方法,Stacking過程可以分為三步:
1、單個模型分別進行學習。首先,采用交叉驗證+網格搜索,得到子模型最優超參數;然后,在此最優超參數下,每次進行交叉驗證時,都會訓練得到一個模型。用此模型對驗證集和測試集分別預測,共進行K次預測,得到一個完整的訓練集預測值和K個測試集預測值,對K個測試集預測值取平均,從而得到一個完整的訓練集預測值和一個測試集預測值。
2、確定新的訓練集合測試集。首先,對n個子模型分別學習,得到n個訓練集預測值(不取平均值),作為n維特征作為第二層模型的輸入;同樣,n個子模型也得到n個測試集預測值,作為第二層模型的輸入。
3、第二層模型學習。用新的特征構成的訓練集和測試集進行預測。
采用Stacking集成上訴6個子模型后的得分為0.1066,效果好于加權平均的方法。
Stacking集成后會得到一個(1458, 6)大小的預測矩陣,這個預測矩陣對于我們對整個test-set的預測是有幫助的,將其加入訓練集中擴大了特征量,運用擴充后的模型訓練我們的Stacking集成模型,訓練后的模型得分為0.1018,顯然再次訓練后的模型性能更好,于是采用其作為最終的預測模型。測試集上的預測結果為0.1178,預測結果提交后在kaggle上該項目成功擠進前3%。
慧都大數據分析平臺,將學習、推理、思考、預測、規劃等能力賦予企業數據,讓數據驅動決策,創造最高業務價值。
歡迎撥打慧都熱線023-68661681或咨詢,我們將幫您轉接大數據專業團隊,并發送相關資料給您!
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn