數據挖掘——特徵工程

特徵工程(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)

相關文章
相關標籤/搜索