特徵工程與特徵選擇
一、特徵工程的定義
特徵工程是機器學習中的重要環節,包括缺失值補全、特徵選擇、維度壓縮、到對輸入數據的範圍進行變換-k近鄰演算法(歸一化與標準化)
二、數據預處理
1、數據導入
直接使用sklearn中的iris 數據集,包括四個特徵:正浮點數類型
- 花萼長度 Sepal.Length
- 花萼寬度 Sepal.Width
- 花瓣長度 Petal.Length
- 花瓣寬度 Petal.Width
三個目標值分類:
- Lris Setosa 山鳶尾
- Lris Versicolor 雜色鳶尾
- Lris Virginica 維吉尼亞鳶尾
#調用模塊
from sklearn.datasets import load_iris
#導入IRIS數據集
data = load_iris()
#導入數據和標籤
#特徵矩陣
data_X = data.data
#目標向量
data_y = data.target
#導入模塊
from sklearn.model_selection import train_test_split
from sklearn import datasets
#k近鄰函數
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
#導入數據和標籤
iris_X = iris.data
iris_y = iris.target
#劃分為訓練集和測試集數據
X_train, X_test, y_train, y_test = train_test_split(iris_X, iris_y, test_size=0.3)
#print(y_train)
#設置knn分類器
knn = KNeighborsClassifier()
#進行訓練
knn.fit(X_train,y_train)
#使用訓練好的knn進行數據預測
print(knn.predict(X_test))
print(y_test)
2、數據預處理
由於未經處理的特徵,可能會存在不屬於同一量綱、定性特徵、存在缺失值、信息利用率低等問題,所以使用sklearn的proprecessing庫進行數據預處理,解決這些問題
2.1無量綱化
使不同規格的數據轉換到同一規格,標準化前提是特徵值服從正態分佈,標準化後,將其轉化為正態分佈,區間縮放法縮放到邊界值範圍之內。
2.1.1標準化
需要計算特徵值的均值與標準差
from sklearn.preprocessing import StandardScaler
#標準化,返回值為標準化後的數據
StandardScaler().fit_transform(data.data)
2.1.2 區間縮放法
常見為兩個最值進行縮放
from sklearn.preprocessing import MinMaxScaler
#區間縮放,返回值為縮放到【0,1】區間的數據
MinMaxScaler().fit_transform(data.data)
2.1.3 標準化與歸一化的區別
標準化依照矩陣的列,通過求z-score的方法。歸一化依照特徵矩陣的行處理數據,樣本向量在點乘運算或者其他函數計算相似性時,擁有統一的標準,轉化為「單位向量」。規則為l2的歸一化公式如下:
使用preprocessing庫的Normalizer類對資料庫進行歸一化的代碼如下:
from sklearn.preprocessing import Normalizer
#歸一化,返回值為歸一化後的數據
Normalizer().fit_transform(data.data)
2.2 對定量特徵進行二值化
核心在於設定一個閾值,大於閾值為1,小於等於閾值為0
使用preprocessing庫的Binarizer類對資料庫進行歸一化的代碼如下:
from sklearn.preprocessing import Binarizer
#二值化,閾值設置為3,返回值為二值化後的數據
Binarizer(threshold=3).fit_transform(data.data)
2.3 對定性特徵進行啞編碼
為了試驗,使用目標值進行啞編碼,實際不需要對目標值進行編碼。
使用preprocessing庫的OneHotEncoder類對資料庫進行歸一化的代碼如下:
from sklearn.preprocessing import OneHotEncoder
#啞編碼,對IRIS數據集的目標值,返回值為啞編碼後的數據
OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))
2.4 缺失值計算
由於現在數據集沒有缺失值,故對數據集新增一個樣本,4個特徵均賦值Nan,表示數據缺失。
使用preprocessing庫的Imputer類對資料庫進行歸一化的代碼如下:
from numpy import vstack,array,nan
from sklearn.preprocessing import Imputer
#缺失值計算,返回為計算缺失值後的數據
#參數missing_value為缺失值的表達形式,默認為NaN
#參數strategy為缺失值填充方式,默認為mean(均值)
Imputer().fit_transform(vstack((array([nan,nan,nan,nan]),data.data)))
2.5 數據變換
常見的數據變換有基於多項式、指數函數、對數函數的,4個特徵,度為2的多項式轉換公式如下: