關於特徵工程

在數據的預處理中常常會遇到特徵工程,這裏作一下筆記。 ##數據的拼接 特徵工程最好針對全部數據,也就是訓練集和測試集都要進行特徵工程的處理,所以第一步能夠是將兩個數據集拼接,注意要處理好index的關係。 可使用pandas的concat函數,如python

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))

##組合構建一些新的特徵 有時候一些特徵組合起來是一個不錯的選擇,好比,將每一層的面積加起來做爲新的特徵‘總面積’app

##偏度和峯度的計算 咱們通常都指望數據的分佈 符合正態,可是有時候實際獲得的數據不是這樣的。 首先咱們檢查數值型特徵數據的偏度(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裏分開。整個數據的處理過程不要打亂數據的順序。code

相關文章
相關標籤/搜索