特徵工程(Feature Engineering)python
特徵工程其本質上是一項工程活動,它的目的是最大限度地從原始數據中提取特徵以供算法和模型使用。算法
特徵工程的重要性:機器學習
數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限。特徵工程的最終目的就是提高模型的性能。性能
特徵工程包括:數據處理、特徵選擇、維度壓縮三大方面的內容。學習
一、數據處理:量綱不1、虛擬變量、缺失值填充編碼
1.一、量綱不一spa
量綱就是單位,特徵的單位不一致就不能放在一塊兒比較,可使用數據標準化的方法來達到量綱一致的要求。3d
經常使用的數據標準化方法:0-1標準化、Z標準化、歸一化code
1.1.1 0-1標準化component
0-1標準化是對原始數據進行線性變化,將特徵值映射成區間爲[0,1]的標準值中。
標準化值 =
導入一份含電影票房和豆瓣評分的數據以下
基於sklearn包的0-1標準化:
scaler = MinMaxScaler() data['票房0-1標準化'] = scaler.fit_transform(np.array(data['累計票房']).reshape(5, -5)) data['評分0-1標準化'] = scaler.fit_transform(np.array(data['豆瓣評分']).reshape(5, -5))
1.1.2 Z標準化
Z標準化是基於特徵值的均值和標準差進行數據的標準化,標準化後的變量圍繞0上下波動,大於0說明高於平均水平,小於0說明低於平均水平。
標準化值 =
基於sklearn包的Z標準化:
from sklearn.preprocessing import scale data['票房z標準化'] = scale(data['累計票房']) data['評分z標準化'] = scale(data['豆瓣評分'])
1.二、 虛擬變量
虛擬變量也叫啞變量或離散特徵編碼,可用來表示分類變量、非數量因素可能產生的影響。
python中主要經過pandas包中的get_dummies方法進行特徵變量的虛擬化。
1.三、缺失值
缺失值產生的緣由:有些信息暫時沒法獲取(單身人士的配偶、未成年人的收入等);有些信息被遺漏或錯誤的處理了
缺失值處理方法:數據補齊;刪除缺失值;不處理
from sklearn.preprocessing import Imputer # mean, median, most_frequent 三種處理參數 imputer = Imputer(strategy='mean') imputer.fit_transform(data2[['累計票房']])
二、 特徵選擇:
如何選擇特徵:考慮特徵是否發散;考慮特徵與目標相關性
以如下格式的數據爲例,用不一樣方法獲得特徵
2.1 、方差選擇法
先計算各個特徵的方差,根據閾值,選擇方差大於閾值的特徵
基於sklearn包的方差選擇獲取特徵的方法
from sklearn.feature_selection import VarianceThreshold varianceThreshold = VarianceThreshold(threshold=10) #設置方差閾值,只選擇方差大於10的特徵 varianceThreshold.fit_transform(data[['累計票房', '豆瓣評分']]) data[['累計票房', '豆瓣評分']].std() #計算兩列各自的方差,其中豆瓣評分方差爲1.79,低於10 varianceThreshold.get_support() #獲得選擇特徵的列的序號
2.二、 相關係數法
先計算各個特徵對目標值的相關係數,選擇更加相關的特徵
from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import f_regression selectbest =SelectKBest(f_regression, k=2) #設置經過迴歸的方法, 選擇數量爲2個的特徵 feature = data1[['月份','季度','廣告費用','客流量']] #變量矩陣 bestfeature = selectbest.fit_transform(feature,data1['銷售額']) #獲得與銷售額相關度最高的2個變量 feature.columns[selectbest.get_support()] #得到特徵列的名稱
2.三、 遞歸特徵消除法
使用一個基模型來進行多輪訓練,通過多輪訓練後,保留指定的特徵數
from sklearn.feature_selection import RFE from sklearn.linear_model import LinearRegression #選擇線性迴歸模型, 保留2 個特徵 rfe = RFE(estimator= LinearRegression(), n_features_to_select=2) sFesture = rfe.fit_transform(feature, data1['銷售額']) rfe.get_support()
2.四、 模型選擇法
將建好的模型對象傳入選擇器,而後它會根據這個建好的模型,自動選擇最好的特徵值
from sklearn.feature_selection import SelectFromModel lrmodel = LinearRegression() #先建立一個線性迴歸對象 selectmodel = SelectFromModel(lrmodel) selectmodel.fit_transform(feature,data1['銷售額']) feature.columns[selectmodel.get_support()]
三、 維度壓縮
特徵選擇完成後,能夠直接訓練模型,但可能因爲特徵矩陣過大,致使計算量和計算時間大,所以須要下降矩陣維度。
主成分分析(PCA)就是最經常使用的數據降維方法:在減小數據維度的同時,保持對方差貢獻最大的特徵。
以iris數據集爲例,將四維數據轉化成三維、二維數據
from sklearn import datasets iris = datasets.load_iris() data_iris = iris.data target = iris.target from sklearn.decomposition import PCA pca_3 = PCA(n_components=3) #建立一個維度爲3維的PCA對象 data_pca_3 = pca_3.fit_transform(data_iris) #將iris數據集降至三維
將三維圖形繪製出來
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D colors = {0:'r', 1:'b', 2:'k'} markers = {0:'x', 1:'D', 2:'o'} fig = plt.figure(1, figsize=(8, 6)) ax = Axes3D(fig, elev=-150, azim=110) data_pca_gb = pd.DataFrame(data_pca_3).groupby(target) for g in data_pca_gb.groups: ax.scatter( data_pca_gb.get_group(g)[0], data_pca_gb.get_group(g)[1], data_pca_gb.get_group(g)[2], c=colors[g], marker=markers[g], cmap=plt.cm.Paired)
獲得以下的三維圖形
將數據降至二維同理
pca_2 = PCA(n_components=2) data_pca_2 = pca_2.fit_transform(data_iris) data_pca_gb = pd.DataFrame(data_pca_2).groupby(target)