Python與機器學習 5 1 特徵工程

2021-08-19 06:27:29 字數 3635 閱讀 7644

在機器學習之前,要對資料進行預處理,其中就包括特徵工程。特徵可以分為數值型特徵,有序型特徵和類別型特徵,對不同的特徵有不同的處理方法。

注意,在測試集上的scaler和訓練集上的scaler要保持一致;不要在訓練集和測試集分別使用不同的scaler

同理,對於one-hot encoding,也是一樣,要保證測試集和訓練集的encoder一致

數值型特徵包括長度、寬度、畫素值等。

數值型特徵是可以直接使用的,那為什麼還要進行處理?因為很多數值型的範圍差距特別大,對某些模型來說我們就需要對數值範圍進行標準化或歸一化,這樣可以提高模型的效能。如:線性回歸,knn,svm,神經網路等

sklearn 中有很多種scaler可以供選擇,也就是對資料進行預處理的不同種方式。下面介紹兩種scaler,歸一化和標準化

1.什麼是歸一化

歸一化是將此特徵的最大值和最小值找到,然後將每個值都減去最小值再除以最大值和最小值的差,得到的值即歸一化的值,歸一化後範圍都在0-1之間。數學公式如下圖所示

2.在sklearn中進行歸一化

匯入歸一化的模組minmaxscaler

from sklearn.preprocessing import minmaxscaler

歸一化minmaxscaler()

scaler = minmaxscaler()

對訓練集進行歸一化需要用fit

x_train_scaled = scaler.fit_transform(x_train)

對測試集進行歸一化不用fit,因為是用訓練集fit好的引數進行transform

x_test_scaled = scaler.transform(x_test)

scaler = standardscaler()

有序型特徵類別之間是有大小之分的,如:等級( a,b,c );級別(低、中、高),資料隱含有a>b>c,高》中》低

對有序型特徵處理起來很簡單,直接轉換成有序數值即可,如a->1, b->2, c->3

1.什麼是獨熱編碼

用獨熱編碼可以處理類別型特徵,獨熱編碼的位數等於特徵的個數,即性別有男女兩種,因此獨熱編碼的位數為2,男可以編碼為01女可以編碼為10

2.獨熱編碼和啞變數

啞變數考慮單個資料集,獨熱編碼考慮多個資料集

3.sklearn中使用獨熱編碼sklearn.preprocessing.onehotencoder()

注意:在sklearn中進行獨熱編碼時都必須將特徵先轉化為數字再進行獨熱編碼

先進行數字編碼

label_enc1 = labelencoder() # 首先將male, female用數字編碼

再將數字編碼轉換為獨熱編碼

one_hot_enc = onehotencoder() # 將數字編碼轉換為獨熱編碼

對數字編碼進行fit_transform(訓練集fit,測試集不能加fit)

tr_feat1_tmp = label_enc1.fit_transform(x_train[:, 0]).reshape(-1, 1) #

reshape(-1, 1)保證為一維列向量

對獨熱編碼進行fit_transform(訓練集fit,測試集不能加fit)

tr_feat1 = one_hot_enc.fit_transform(tr_feat1_tmp)

將稀疏矩陣轉成正常矩陣

tr_feat1 = tr_feat1.todense()

獨熱編碼的結果很容易成為稀疏矩陣,因此要把稀疏矩陣變成正常矩陣才能進行下面的學習。

eg:

# 隨機生成有序型特徵和類別特徵作為例子

x_train = np.array([['male', 'low'],

['female', 'low'],

['female', 'middle'],

['male', 'low'],

['female', 'high'],

['male', 'low'],

['female', 'low'],

['female', 'high'],

['male', 'low'],

['male', 'high']])

x_test = np.array([['male', 'low'],

['male', 'low'],

['female', 'middle'],

['female', 'low'],

['female', 'high']])

from sklearn.preprocessing import labelencoder, onehotencoder

# 在訓練集上進行編碼操作

label_enc1 = labelencoder() # 首先將male, female用數字編碼

one_hot_enc = onehotencoder() # 將數字編碼轉換為獨熱編碼

label_enc2 = labelencoder() # 將low, middle, high用數字編碼

tr_feat1_tmp = label_enc1.fit_transform(x_train[:, 0]).reshape(-1, 1) # reshape(-1, 1)保證為一維列向量

tr_feat1 = one_hot_enc.fit_transform(tr_feat1_tmp)

tr_feat1 = tr_feat1.todense()

tr_feat2 = label_enc2.fit_transform(x_train[:, 1]).reshape(-1, 1)

x_train_enc = np.hstack((tr_feat1, tr_feat2))

print(x_train_enc)

# 在測試集上進行編碼操作

te_feat1_tmp = label_enc1.transform(x_test[:, 0]).reshape(-1, 1) # reshape(-1, 1)保證為一維列向量

te_feat1 = one_hot_enc.transform(te_feat1_tmp)

te_feat1 = te_feat1.todense()

te_feat2 = label_enc2.transform(x_test[:, 1]).reshape(-1, 1)

x_test_enc = np.hstack((te_feat1, te_feat2))

print(x_test_enc)

4.需要考慮樣本之間的距離才需要用到讀熱編碼,基於樹的模型不需要考慮樣本間的距離因此不需要用到讀熱編碼(面試題)。也就是說樹一般不需要歸一

機器學習4 特徵向量與特徵值

a為n階矩陣,若數 和n維非0列向量x滿足ax x,那麼數 稱為a的特徵值,x稱為a的對應於特徵值 的特徵向量。式ax x也可寫成 a e x 0,並且 e a 叫做a 的特徵多項式。當特徵多項式等於0的時候,稱為a的特徵方程,特徵方程是乙個齊次線性方程組,求解特徵值的過程其實就是求解特徵方程的解。...

機器學習 特徵工程 特徵篩選

1 冗餘 部分特徵相關度太高,消耗計算效能,影響決策樹分支的選擇。2 雜訊 部分特徵是對 結果有負影響 3 降維 減少特徵數量 降維,使模型泛化能力更強,減少過擬合 4 特徵選擇與降維的關係 特徵選擇只篩選掉原本特徵裡和結果 關係不大的,後者做特徵的計算組合構成新特徵。svd pca降維也能解決一定...

機器學習 特徵選擇

特徵選擇是特徵工程中的重要問題 另乙個重要的問題是特徵提取 坊間常說 資料和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上限而已。由此可見,特徵工程尤其是特徵選擇在機器學習中占有相當重要的地位。通常而言,特徵選擇是指選擇獲得相應模型和演算法最好效能的特徵集,工程上常用的方法有以下 1.計算每...