這篇文章主要從以下三個問題出發來理解特征工程:
- 特征工程是什么?
- 為什么要做特征工程?
- 應該如何做特征工程?
對於第一個問題,我會通過特征工程的目的來解釋什么是特征工程。對於第二個問題,主要從特征工程的重要性來闡述。對於第三個問題,我會從特征工程的子問題以及簡單的處理方法來進一步說明。下面來看看詳細內容!
1、特征工程是什么
首先來解釋下什么是特征工程?
當你想要你的預測模型性能達到最佳時,你要做的不僅是要選取最好的算法,還要盡可能的從原始數據中獲取更多的信息。那么問題來了,你應該如何為你的預測模型得到更好的數據呢?
想必到了這里你也應該猜到了,是的,這就是特征工程要做的事,它的目的就是獲取更好的訓練數據。
關於特征工程的定義,Wikipedia上是這樣說的:
Feature engineering is the process of using domain knowledge of the data to create features that make machine learning algorithms work. ”
我的理解:
特征工程是利用數據領域的相關知識來創建能夠使機器學習算法達到最佳性能的特征的過程。
簡而言之,特征工程就是一個把原始數據轉變成特征的過程,這些特征可以很好的描述這些數據,並且利用它們建立的模型在未知數據上的表現性能可以達到最優(或者接近最佳性能)。從數學的角度來看,特征工程就是人工地去設計輸入變量X。
特征工程更是一門藝術,跟編程一樣。導致許多機器學習項目成功和失敗的主要因素就是使用了不同的特征。說了這么多,想必你也大概知道了為什么要做特征工程,下面來說說特征工程的重要性。
2、特征工程的重要性
OK!知道了特征工程是什么,那么我們必須要來了解下特征工程的重要性,為什么在實際工作中都要有特征工程這個過程,下面不同的角度來分析一下。
首先,我們大家都知道,數據特征會直接影響我們模型的預測性能。你可以這么說:“選擇的特征越好,最終得到的性能也就越好”。這句話說得沒錯,但也會給我們造成誤解。事實上,你得到的實驗結果取決於你選擇的模型、獲取的數據以及使用的特征,甚至你問題的形式和你用來評估精度的客觀方法也扮演了一部分。此外,你的實驗結果還受到許多相互依賴的屬性的影響,你需要的是能夠很好地描述你數據內部結構的好特征。
(1)特征越好,靈活性越強
只要特征選得好,即使是一般的模型(或算法)也能獲得很好的性能,因為大多數模型(或算法)在好的數據特征下表現的性能都還不錯。好特征的靈活性在於它允許你選擇不復雜的模型,同時運行速度也更快,也更容易理解和維護。
(2)特征越好,構建的模型越簡單
有了好的特征,即便你的參數不是最優的,你的模型性能也能仍然會表現的很nice,所以你就不需要花太多的時間去尋找最有參數,這大大的降低了模型的復雜度,使模型趨於簡單。
(3)特征越好,模型的性能越出色
顯然,這一點是毫無爭議的,我們進行特征工程的最終目的就是提升模型的性能。
下面從特征的子問題來分析下特征工程。
3、特征工程子問題
大家通常會把特征工程看做是一個問題。事實上,在特征工程下面,還有許多的子問題,主要包括:Feature Selection(特征選擇)、Feature Extraction(特征提取)和Feature construction(特征構造).下面從這三個子問題來詳細介紹。
3.1 特征選擇Feature Selection
首先,從特征開始說起,假設你現在有一個標准的Excel表格數據,它的每一行表示的是一個觀測樣本數據,表格數據中的每一列就是一個特征。在這些特征中,有的特征攜帶的信息量豐富,有的(或許很少)則屬於無關數據(irrelevant data),我們可以通過特征項和類別項之間的相關性(特征重要性)來衡量。比如,在實際應用中,常用的方法就是使用一些評價指標單獨地計算出單個特征跟類別變量之間的關系。如Pearson相關系數,Gini-index(基尼指數),IG(信息增益)等,下面舉Pearson指數為例,它的計算方式如下:
其中,x屬於X,X表一個特征的多個觀測值,y表示這個特征觀測值對應的類別列表。
Pearson相關系數的取值在0到1之間,如果你使用這個評價指標來計算所有特征和類別標號的相關性,那么得到這些相關性之后,你可以將它們從高到低進行排名,然后選擇一個子集作為特征子集(比如top 10%),接着用這些特征進行訓練,看看性能如何。此外,你還可以畫出不同子集的一個精度圖,根據繪制的圖形來找出性能最好的一組特征。
這就是特征工程的子問題之一——特征選擇,它的目的是從特征集合中挑選一組最具統計意義的特征子集,從而達到降維的效果。
做特征選擇的原因是因為這些特征對於目標類別的作用並不是相等的,一些無關的數據需要刪掉。做特征選擇的方法有多種,上面提到的這種特征子集選擇的方法屬於filter(刷選器)方法,它主要側重於單個特征跟目標變量的相關性。優點是計算時間上較高效,對於過擬合問題也具有較高的魯棒性。缺點就是傾向於選擇冗余的特征,因為他們不考慮特征之間的相關性,有可能某一個特征的分類能力很差,但是它和某些其它特征組合起來會得到不錯的效果。另外做特征子集選取的方法還有wrapper(封裝器)和Embeded(集成方法)。wrapper方法實質上是一個分類器,封裝器用選取的特征子集對樣本集進行分類,分類的精度作為衡量特征子集好壞的標准,經過比較選出最好的特征子集。常用的有逐步回歸(Stepwise regression)、向前選擇(Forward selection)和向后選擇(Backward selection)。它的優點是考慮了特征與特征之間的關聯性,缺點是:當觀測數據較少時容易過擬合,而當特征數量較多時,計算時間又會增長。對於Embeded集成方法,它是學習器自身自主選擇特征,如使用Regularization做特征選擇,或者使用決策樹思想,細節這里就不做介紹了。這里還提一下,在做實驗的時候,我們有時候會用Random Forest和Gradient boosting做特征選擇,本質上都是基於決策樹來做的特征選擇,只是細節上有些區別。
綜上所述,特征選擇過程一般包括產生過程,評價函數,停止准則,驗證過程,這4個部分。如下圖所示:

(1) 產生過程( Generation Procedure ):產生過程是搜索特征子集的過程,負責為評價函數提供特征子集。搜索特征子集的過程有多種,將在2.2小節展開介紹。
(2) 評價函數( Evaluation Function ):評價函數是評價一個特征子集好壞程度的一個准則。評價函數將在2.3小節展開介紹。
(3) 停止准則( Stopping Criterion ):停止准則是與評價函數相關的,一般是一個閾值,當評價函數值達到這個閾值后就可停止搜索。
(4) 驗證過程( Validation Procedure ) :在驗證數據集上驗證選出來的特征子集的有效性。
3.2 特征提取
特征提取的子問題之二——特征提取。
原則上來講,特征提取應該在特征選擇之前。特征提取的對象是原始數據(raw data),它的目的是自動地構建新的特征,將原始特征轉換為一組具有明顯物理意義(Gabor、幾何特征[角點、不變量]、紋理[LBP HOG])或者統計意義或核的特征。比如通過變換特征取值來減少原始數據中某個特征的取值個數等。對於表格數據,你可以在你設計的特征矩陣上使用主要成分分析(Principal Component Analysis,PCA)來進行特征提取從而創建新的特征。對於圖像數據,可能還包括了線或邊緣檢測。
常用的方法有:
- PCA (Principal component analysis,主成分分析)
- ICA (Independent component analysis,獨立成分分析)
- LDA (Linear Discriminant Analysis,線性判別分析)
對於圖像識別中,還有SIFT方法。
3.3 特征構建 Feature Construction
特征提取的子問題之二——特征構建。
在上面的特征選擇部分,我們提到了對特征重要性進行排名。那么,這些特征是如何得到的呢?在實際應用中,顯然是不可能憑空而來的,需要我們手工去構建特征。關於特征構建的定義,可以這么說:特征構建指的是從原始數據中人工的構建新的特征。我們需要人工的創建它們。這需要我們花大量的時間去研究真實的數據樣本,思考問題的潛在形式和數據結構,同時能夠更好地應用到預測模型中。
特征構建需要很強的洞察力和分析能力,要求我們能夠從原始數據中找出一些具有物理意義的特征。假設原始數據是表格數據,一般你可以使用混合屬性或者組合屬性來創建新的特征,或是分解或切分原有的特征來創建新的特征。
4、特征工程處理過程
那么問題來了,特征工程具體是在哪個步驟做呢?
具體的機器學習過程是這樣的一個過程:
- 1.(Task before here)
- 2.選擇數據(Select Data): 整合數據,將數據規范化成一個數據集,收集起來.
- 3.數據預處理(Preprocess Data): 數據格式化,數據清理,采樣等.
- 4.數據轉換(Transform Data): 這個階段做特征工程.
- 5.數據建模(Model Data): 建立模型,評估模型並逐步優化.
- (Tasks after here…)
我們發現,特征工程和數據轉換其實是等價的。事實上,特征工程是一個迭代過程,我們需要不斷的設計特征、選擇特征、建立模型、評估模型,然后才能得到最終的model。下面是特征工程的一個迭代過程:
- 1.頭腦風暴式特征:意思就是進你可能的從原始數據中提取特征,暫時不考慮其重要性,對應於特征構建;
- 2.設計特征:根據你的問題,你可以使用自動地特征提取,或者是手工構造特征,或者兩者混合使用;
- 3.選擇特征:使用不同的特征重要性評分和特征選擇方法進行特征選擇;
- 4.評估模型:使用你選擇的特征進行建模,同時使用未知的數據來評估你的模型精度。
By the way, 在做feature selection的時候,會涉及到特征學習(Feature Learning),這里說下特征學習的概念,一般而言,特征學習(Feature Learning)是指學習輸入特征和一個訓練實例真是類別之間的關系。
下面舉個例子來簡單了解下特征工程的處理。
首先是來說下特征提取,假設你的數據里現在有一個顏色類別的屬性,比如是“item_Color”,它的取值有三個,分別是:red,blue,unknown。從特征提取的角度來看,你可以將其轉化成一個二值特征“has_color”,取值為1或0。其中1表示有顏色,0表示沒顏色。你還可以將其轉換成三個二值屬性:Is_Red, Is_Blue and Is_Unknown。這樣構建特征之后,你就可以使用簡單的線性模型進行訓練了。
另外再舉一個例子,假設你有一個日期時間 (i.e. 2014-09-20T20:45:40Z),這個該如何轉換呢?
對於這種時間的數據,我們可以根據需求提取出多種屬性。比如,如果你想知道某一天的時間段跟其它屬性的關系,你可以創建一個數字特征“Hour_Of_Day”來幫你建立一個回歸模型,或者你可以建立一個序數特征,“Part_Of_Day”,取值“Morning,Midday,Afternoon,Night”來關聯你的數據。
此外,你還可以按星期或季度來構建屬性,等等等等……
關於特征構建,主要是盡可能的從原始數據中構建特征,而特征選擇,經過上面的分析,想必大家也知道了,其實就是達到一個降維的效果。
只要分析能力和實踐能力夠強,那么特征構建和特征提取對你而言就會顯得相對比較簡單,所以抓緊時間好好實踐吧!
Conclusion
恩。說了這么多,大家可能對特征工程、特征選擇、特征提取和特征構建有點混亂了,下面來簡單的做個總結:
首先來說說這幾個術語:
- 特征工程:利用數據領域的相關知識來創建能夠使機器學習算法達到最佳性能的特征的過程。
- 特征構建:是原始數據中人工的構建新的特征。
- 特征提取:自動地構建新的特征,將原始特征轉換為一組具有明顯物理意義或者統計意義或核的特征。
- 特征選擇:從特征集合中挑選一組最具統計意義的特征子集,從而達到降維的效果
了解這幾個術語的意思后,我們來看看他們之間的關系。
在Quora中有人這么說:
Feature engineering is a super-set of activities which include feature extraction, feature construction and feature selection. Each of the three are important steps and none should be ignored. We could make a generalization of the importance though, from my experience the relative importance of the steps would be feature construction > feature extraction > feature selection.
用中文來說就是:特征工程是一個超集,它包括特征提取、特征構建和特征選擇這三個子模塊。在實踐當中,每一個子模塊都非常重要,忽略不得。根據答主的經驗,他將這三個子模塊的重要性進行了一個排名,即:特征構建>特征提取>特征選擇。
事實上,真的是這樣,如果特征構建做的不好,那么它會直接影響特征提取,進而影響了特征選擇,最終影響模型的性能。
OK!關於特征工程就到此為止吧,如果有紕漏的地方,還望多多指導!作為一枚行走在ML界的程序員,就讓我們快樂的建模,快樂的做特征工程吧^_^!Happy coding, happy modeling!