在機器學習之前,要對資料進行預處理,其中就包括特徵工程。特徵可以分為數值型特徵,有序型特徵和類別型特徵,對不同的特徵有不同的處理方法。
注意,在測試集上的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) #對獨熱編碼進行fit_transform(訓練集fit,測試集不能加fit)reshape(-1, 1)保證為一維列向量
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.計算每...