最近學人工智能,講到了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。