天天看點

sklearn - 特征工程特征工程–基于sklearn

特征工程–基于sklearn

什麼是特征工程

Feature engineering is the process of using domain knowledge of the data to create features that make machine learning algorithms work. Feature engineering is fundamental to the application of machine learning, and is both difficult and expensive. The need for manual feature engineering can be obviated by automated feature learning.Feature engineering is an informal topic, but it is considered essential in applied machine learning.----------from wikipedia
“資料決定了機器學習的上限,而算法隻是盡可能逼近這個上限”,這裡的資料指的就是經過特征工程得到的資料。特征工程指的是把原始資料轉變為模型的訓練資料的過程,它的目的就是擷取更好的訓練資料特征,使得機器學習模型逼近這個上限。特征工程能使得模型的性能得到提升,有時甚至在簡單的模型上也能取得不錯的效果。特征工程在機器學習中占有非常重要的作用,一般認為括特征建構、特征提取、特征選擇三個部分。特征建構比較麻煩,需要一定的經驗。 特征提取與特征選擇都是為了從原始特征中找出最有效的特征。它們之間的差別是特征提取強調通過特征轉換的方式得到一組具有明顯實體或統計意義的特征;而特征選擇是從特征集合中挑選一組具有明顯實體或統計意義的特征子集。兩者都能幫助減少特征的次元、資料備援,特征提取有時能發現更有意義的特征屬性,特征選擇的過程經常能表示出每個特征的重要性對于模型建構的重要性。------from https://www.cnblogs.com/wxquare/p/5484636.html

簡單的說,原始資料有時候不能直接用來訓練模型,因為原始資料可能存在許多問題緻使訓練出的模型效果極差,比如,無關特征太多,存在關聯特征,甚至原始資料是假的等等。是以,為了更好地構模組化型,我們需要對原始資料進行處理,比如:選擇部分有用地特征,合并互相關聯地特征,删除假特征等等。

本文主要介紹sklearn下的幾種特征工程方法。(但是,由于時間關系,暫時隻介紹RFE,剩下的日後會更新)

1.1RFE(遞歸特征消除 Recursive feature elimination)

遞歸特征消除的主要思想是選擇一個模型之後,先在原始資料上進行訓練,求得各個特征的權重,删除權重最小的特征;然後重複訓練,删除最小權重特征,直到剩下的特征數目為你所指定的特征數。

RFE本質上是一種貪心算法,是以如果特征的數目非常多,而你電腦又不行,特征選擇的過程會十分漫長,部落客在處理一個有300個特征的資料集時,在筆記本上跑了十多分鐘仍然沒有結束,不過,在2080Ti顯示卡上幾秒鐘就結束了。

1.2例子

使用rfe選擇特征

# train_X,train_y 分别為訓練集的特征和标簽部分
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier()
rfe = RFE(rfc, n_features_to_select=50)
rfe.fit(train_X, train_y)
           

但是,我們還沒得到新的訓練集,我使用的是rfe的get_support方法

# get_support()傳回的是一個布爾型清單
p = rfe.get_support()

# 檢視一下p的内容
p
           
array([False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False,  True, False, False,
       False, False, False,  True, False, False, False,  True, False,
        True, False, False,  True, False, False,  True, False, False,
       False,  True,  True, False,  True, False, False, False, False,
       False, False,  True, False, False, False,  True,  True, False,
        True, False,  True, False, False, False, False, False,  True,
       False,  True, False, False, False, False, False, False, False,
        True, False,  True, False,  True, False, False, False, False,
       False, False,  True, False, False, False,  True, False, False,
        True, False, False, False, False, False, False, False, False,
        True, False,  True, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False,  True, False,  True,
       False, False, False,  True, False,  True, False, False,  True,
       False, False, False, False, False,  True,  True,  True, False,
        True, False, False, False, False,  True, False, False, False,
       False,  True,  True,  True, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False,  True, False, False, False, False, False, False, False,
       False, False,  True, False, False, False, False, False, False,
        True,  True, False, False, False, False, False, False,  True,
        True, False, False, False,  True, False, False, False,  True,
        True, False,  True, False,  True, False,  True, False, False,
        True, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False])
           

可以看出,p中每一個布爾值表示對應的特征是否被選擇了。既然如此,我們怎麼把這些被選中的特征提取出來組成新的訓練集呢?

# 特征因子
predictors = []
for i in range(len(p)):
    if p[i] == True:
        predictors.append(str(i))

test_new = test[predictors]
train_new = train[predictors] 
           

下面就可以使用新的訓練集和測試集來完成任務了。

1.3RFE主要參數介紹

參數名 可選性 含義
estimator 必選 所使用的模型,例如上面我所使用的随機森林
n_features_to_select 可預設(預設特征量的一半) 你所想要選擇的特征數目
step 可預設(預設為1) 每次删除的特征數目。如果使用0到1的小數,表示每次删除特征數的百分比

還有幾個參數由于對于初學者不太重要,是以不列出來。

1.4方法

方法名稱 含義
fit(X, y) Fit the RFE model and then the underlying estimator on the selected features.
fit_transform(X[, y]) Fit to data, then transform it.
get_params([deep]) Get parameters for this estimator.
get_support([indices]) Get a mask, or integer index, of the features selected
inverse_transform(X) Reverse the transformation operation
predict(X) Reduce X to the selected features and then predict using the underlying estimator.
score(X, y) Reduce X to the selected features and then return the score of the underlying estimator.
set_params(**params) Set the parameters of this estimator.
transform(X) Reduce X to the selected features.

to be continued…

繼續閱讀