1. 程式人生 > >數據挖掘——特征工程

數據挖掘——特征工程

info .data pandas 回歸 marker ase 最好的 離散 median

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

技術分享圖片

數據挖掘——特征工程