Ames房價預測特征工程


最近學人工智能,講到了Kaggle上的一個競賽任務,Ames房價預測 。本文將描述一下數據預處理和特征工程所進行的操作,具體代碼Click Me

原始數據集共有特征81個,數值型特征38個,非數值型特征43個。有很多缺失值。

1、離群點檢測

以GrLivArea(地上面積)和SalePrice(房價)為自變量和因變量,得到如下散點圖:

從上圖中可以看出有2個極端的離群點在圖的右下角(面積很大,但價格很低)。該數據集的提供者建議移除面積大於4000 square feet的數據點(這樣就去掉了4個點)。

當然也可以使用其他特征作為自變量,來繪制散點圖,檢查是否存在離群點。

2、缺失值處理

缺失值處理方法有:刪除、統計填充、統一填充、預測填充、具體分析。(可參考這里

 2.1、具體分析,填充缺失值

首先,在Kaggle提供的數據描述中,有說明部分缺省值意味着什么,例如:

BsmtQual: Evaluates the height of the basement

Ex   Excellent (100+ inches)
Gd   Good (90-99 inches)
TA   Typical (80-89 inches)
Fa   Fair (70-79 inches)
Po   Poor (<70 inches
NA   No Basement

也就是說,如果“地下室質量”的值缺失,說明沒有地下室。因此,如果BsmtQual值缺失,我們設置為一種新的取值:No(非數值型特征)。如果BsmtFullBath(地下室完整浴室的數量)的值確實,直接設置為0(數值型特征)。

其次,就要對特征進行具體分析了。比如,CentralAir(是否有中央空調)缺失,傾向於沒有(如果有的話,房東一般都會寫出來吧)。

2.2、其它缺失值填充

上一步未能填充的缺失值,這一步進行統一處理。數值型特征使用中位數填充,非數值型特征將缺失設置為一種新的類型。

3、數值型數據和非數值型數據的轉換

有些特征,雖然取值是數值型的,但這些數值是分類的意思,作為數值進行統計分析沒有意義,例如:

MSSubClass: Identifies the type of dwelling involved in the sale.

20   1-STORY 1946 & NEWER ALL STYLES
30   1-STORY 1945 & OLDER
40   1-STORY W/FINISHED ATTIC ALL AGES
45   1-1/2 STORY - UNFINISHED ALL AGES
50   1-1/2 STORY FINISHED ALL AGES
60   2-STORY 1946 & NEWER
70   2-STORY 1945 & OLDER
75   2-1/2 STORY ALL AGES
80   SPLIT OR MULTI-LEVEL
85   SPLIT FOYER
90   DUPLEX - ALL STYLES AND AGES
120   1-STORY PUD (Planned Unit Development) - 1946 & NEWER
150   1-1/2 STORY PUD - ALL AGES
160   2-STORY PUD - 1946 & NEWER
180   PUD - MULTILEVEL - INCL SPLIT LEV/FOYER
190   2 FAMILY CONVERSION - ALL STYLES AND AGES

這一特征是房屋風格。雖然取值是數值型的,但這些數值是對風格的分類,應該轉換為非數值型的特征。

 

還有一些特征雖然在類別型的,但存在明顯的數值等級,例如:

Alley: Type of alley access to property

Grvl    Gravel
Pave   Paved
NA      No alley access

這一特征是指通向房屋的道路類型。Grvl是碎石路,Paved是水泥路,NA是不通道路。顯然,Grvl、Pave、NA這三者存在的關系,分別設置為0、1、2。

4、創建新的特征

4.1、簡化已有特征

例如:

OverallQual: Rates the overall material and finish of the house

10  Very Excellent
9   Excellent
8   Very Good
7   Good
6   Above Average
5   Average
4   Below Average
3   Fair
2   Poor
1   Very Poor

該特征是房屋的使用材料和完成品級,從最好到最差,設置了10的檔次。我們相應的設置一個簡化的SimplOverallQual,將數據的1、2、3映射為1(低品級),4、5、6映射為2(中等水平),7、8、9、10映射為3(高品級)。

4.2、聯合已有特征

例如,設置一個新的特征PoolScore(游泳池得分),取值為PoolArea(游泳池面積)和PoolQC(游泳池質量)的乘積。

4.3、現有重要特征(top 10)的多項式

通過計算協方差,找到10個跟房價關聯性最強的特征,我們得到了AllSF,AllFlrsSF,GrLivArea,OverallQual,GarageCars,TotalBsmtSF,GarageArea,TotalBath,ExterQual,1stFlrSF這是個特征。

對於top10的每一個特征,都設置三個新的特征,分別是該特征的平方、立方、平方根。

5、數值型特征的數據標准化

數值型特征填充了缺失值之后,我們使用sklearn模塊里面的StandardScaler()函數,進行標准化。處理后的數據期望為0,方差為1。

6、非數值型特征處理

對非數值型特征進行one hot編碼。

7、遇到的問題

7.1、不要添加與某個屬性線性相關的屬性。

例如,YearBuilt這個屬性,表示的是房屋建造年費。我嘗試添加一個房齡屬性HouseAge = 2017 - YearBuilt。添加之后,模型的正確率反而下降了。無正則項的線性回歸,校驗集正確率出現了大幅下滑,LinearRegression.score是個很大的負數,說明模型特別差勁;嶺回歸校驗集正確率出現了小幅下滑。

實際上根本沒有必要添加HouseAge。我們看一下HouseAge和YearBuilt標准化之后(使用StandardScaler,轉化后均值為0,標准差為1),分別為Std_HouseAge和Std_YearBuilt。由方差與均值的計算規則可知,Std_HouseAge = -Std_YearBuilt。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM