數據挖掘——特征工程


特征工程(Feature Engineering)

  特征工程其本質上是一項工程活動,它的目的是最大限度地從原始數據中提取特征以供算法和模型使用。

  特征工程的重要性:

  • 特征越好,靈活性越強
  • 特征越好,模型越簡單
  • 特征越好,性能越出色

數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限。特征工程的最終目的就是提升模型的性能。

特征工程包括:數據處理、特征選擇、維度壓縮三大方面的內容。

1、數據處理:量綱不一、虛擬變量、缺失值填充

1.1、量綱不一

量綱就是單位,特征的單位不一致就不能放在一起比較,可以使用數據標准化的方法來達到量綱一致的要求。

常用的數據標准化方法:0-1標准化、Z標准化、歸一化

1.1.1  0-1標准化

  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.2、 虛擬變量

虛擬變量也叫啞變量或離散特征編碼,可用來表示分類變量、非數量因素可能產生的影響。

 python中主要通過pandas包中的get_dummies方法進行特征變量的虛擬化。

 

1.3、缺失值

  缺失值產生的原因:有些信息暫時無法獲取(單身人士的配偶、未成年人的收入等);有些信息被遺漏或錯誤的處理了

  缺失值處理方法:數據補齊;刪除缺失值;不處理

from sklearn.preprocessing import Imputer
# mean, median, most_frequent 三種處理參數
imputer = Imputer(strategy='mean')
imputer.fit_transform(data2[['累計票房']])

 

2、 特征選擇:

如何選擇特征:考慮特征是否發散;考慮特征與目標相關性

以以下格式的數據為例,用不同方法得到特征

 

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.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.3、 遞歸特征消除法

使用一個基模型來進行多輪訓練,經過多輪訓練后,保留指定的特征數

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.4、 模型選擇法

將建好的模型對象傳入選擇器,然后它會根據這個建好的模型,自動選擇最好的特征值

from sklearn.feature_selection import SelectFromModel

lrmodel = LinearRegression()  #先創建一個線性回歸對象
selectmodel = SelectFromModel(lrmodel)

selectmodel.fit_transform(feature,data1['銷售額'])
feature.columns[selectmodel.get_support()]

 

3、 維度壓縮

特征選擇完成后,可以直接訓練模型,但可能由於特征矩陣過大,導致計算量和計算時間大,因此需要降低矩陣維度。

主成分分析(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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM