1. 程式人生 > >關於特征工程

關於特征工程

lis asc 一點 如果 得到 pytho pan 分開 AS

在數據的預處理中經常會遇到特征工程,這裏做一下筆記。

數據的拼接

特征工程最好針對所有數據,也就是訓練集和測試集都要進行特征工程的處理,因此第一步可以是將兩個數據集拼接,註意要處理好index的關系。
可以使用pandas的concat函數,如

all_data=pd.concat((train,test)).reset_index(drop=True)#如果沒有reset_index(),那麽兩個數據集的index無法串行下去

拼接完後去掉train數據集中的標簽值,因為這一項我們不做處理,用drop()即可

缺失值處理

首先計算缺失值的占比,可以用數字表示,也可以進一步用柱狀圖等表示
這時可以使用熱圖對數據的相關性進行查看
查到有缺失的特征後,就要對其進行編輯
在這裏,有的特征需要用0或者其他數據(如中位數、眾數等)進行填充,有的就需要用None等進行填充,這一般取決於特征原有數據的類型。
處理完後要在檢驗一下缺失值占比,確保已經沒有缺失值了。

數據類型轉換

有的數據需要進行類型的轉換,比如表示樓層的數字是數值型變量或者房子售出的時間(年份、月份),但是我們有時候需要將它置為字符型,這需要具體分析
另外,有的文本型數據需要轉換為數值型數據,作為標簽標註,比如,街區特征裏由五個項,那麽我們就可以用1~5表示,在這裏我們可以這樣操作:

from sklearn.preprocessing import LableEncoder
lbl=LabelEncoder()
lbl.fit(list(all_data[‘Streets‘].values))
all_data[‘streets‘]=lbl.transform(list(all_data[‘streets‘
].values))

組合構建一些新的特征

有時候一些特征組合起來是一個不錯的選擇,比如,將每一層的面積加起來作為新的特征‘總面積’

偏度和峰度的計算

我們一般都期望數據的分布 符合正態,但是有時候實際得到的數據不是這樣的。
首先我們檢查數值型特征數據的偏度(skewness),但是要註意,object類型的數據無法計算skewness,因此計算的時候要過濾掉object數據。
對於偏度過大的特征數據利用sklearn的box-cox轉換函數,以降低數據的偏度,如下:

numerical_feats=all_data.dtypes[all_data.dtype !=‘object‘].index#排除object類型的特征
skewed_feats=all_data[numerical_feats].apply(lambda x: skew(x.dropna())).sort_values(ascending=False)#解算偏度 skewness=pd.DataFrame({‘Skew‘ :skewed_feats})#數據類型轉換 skewness =skewness[abs(skewness)>0.75]#選擇偏度大於0.75的特征 print(‘there are {} skewed numerical features to box cox transform‘.format(skewness.shape[0])) from scipy.special import boxcox1p skewed_features=skewness.index lam=0.15 for feat in skewed_features: all_data[feat]=boxcox1p(all_data[feat],lam)#boxcox1p對數據進行轉化

註意一點:一定註意all_data的有效index,隨時明確是在對哪些數據進行操作。

one-hot編碼

離散的特征數據一般無法直接在算法中使用,因此要對其進行編碼,通常使用one-hot編碼。假設出生地這個特征有三個取值,北京、天津、上海,那麽經過one-hot編碼後,出生地這個特征會被三個新特征代替,出生地-北京、出生地-天津、出生地-上海,一行數據對應的這三個特征的取值是001或010或100.代碼如下:

all_data=pd.get_dummies(all_data)

註意,經過one-hot編碼後,會多出許多列數據,這時重新編碼後的新的特征。

新的數據集

最後,不要忘記將訓練集和測試集從all_data裏分開。整個數據的處理過程不要打亂數據的順序。

關於特征工程