在做特徵工程時,什麼時候需要對連續型的特徵做取對數操作?


我取對數的時候最常見的兩種情形:

1、數據是或者近似是log正態分布的,這時候取對數可以使數據變成正態的,滿足許多模型的假設;

2、數據中有許多分布在0-1之間的,例如fold change,取對數可以放大0-1之間的數的絕對值,壓縮大於1的數,使某些可能的模式顯現出來。


有些演算法如線性回歸(Y=Xeta+varepsilon, varepsilon sim N(0, sigma^2I) )對特徵的分布有要求,有偏度的分布往往會影響殘差,破壞方差齊性(Var(varepsilon_1)=Var(varepsilon_2)=...=Var(varepsilon_n)=sigma^2 ),因此需要做一些變換,去除分布的偏度。可以取對數,平方根,倒數。。。

通用的辦法是做Box-Cox變換,你說的取對數就是取lambda=0 的情形

[x^*=egin{cases} {x^lambda-1 over lambda}lambda 
eq 0,\ log(x)  lambda=0. end{cases}]

lambda 是通過最大似然估計求到的,其實你也可以自己手動試一下,看看那個偏度小就選那個lambda

這東西很常用的,python里有scipy.stats.boxcox, R的caret包里有BoxCoxTrans函數,都會自動幫你用最大似然估計出來的lambda去變換


特徵工程是一個非常重要的課題,是機器學習中不可缺少的一部分,但是它幾乎很少出現於機器學習書本裡面的某一章。在機器學習方面的成功很大程度上在於如果使用特徵工程。

(I)特徵工程可以解決什麼樣的問題?

在機器學習中,經常是用一個預測模型(線性回歸,邏輯回歸,SVD等)和一堆原始數據來得到一些預測的結果,人們需要做的是從這堆原始數據中去提煉較優的結果,然後做到最優的預測。這個就包括兩個方面,第一就是如何選擇和使用各種模型,第二就是怎麼樣去使用這些原始的數據才能達到最優的效果。那麼怎麼樣才能夠獲得最優的結果呢?貼上一句經典的話就是:

Actually the sucess of all Machine Learning algorithms depends on how you present the data.

------ Mohammad Pezeshki

直接翻譯過來便是:事實上所有機器學習演算法上面的成功都在於你怎麼樣去展示這些數據。由此可見特徵工程在實際的機器學習中的重要性,從數據裡面提取出來的特徵好壞與否就會直接影響模型的效果。從某些層面上來說,所使用的特徵越好,得到的效果就會越好。所需要的特徵就是可以藉此來描述已知數據的內在關係。總結一下就是:

Better feature means flexibility. Better feature means simpler models. Better feature means better results.

有的時候,可以使用一些不是最優的模型來訓練數據,如果特徵選擇得好的話,依然可以得到一個不錯的結果。很多機器學習的模型都能夠從數據中選擇出不錯的結構,從而進行良好的預測。一個優秀的特徵具有極強的靈活性,可以使用不那麼複雜的,運算速度快,容易理解和維護的模型來得到不錯的結果。

(II)什麼才是特徵工程?

Feature Engineering is the process of transforming raw data into features that better represent the underlying problem to the predictive models, resulting in improved model accuracy on unseen data.

------ Jason Brownlee

Feature Engineering is manually designing what the input x"s should be.

------ Tomasz Malisiewicz

從這個概念可以看出,特徵工程其實是一個如何展示和表現數據的問題,在實際工作中需要把數據以一種「良好」的方式展示出來,使得能夠使用各種各樣的機器學習模型來得到更好的效果。如何從原始數據中去除不佳的數據,展示合適的數據就成為了特徵工程的關鍵問題。

(III)特徵有用性的預估

每次構造了一個特徵,都需要從各個方面去證明該特徵的有效性。一個特徵是否重要主要在於該特徵與要預測的東西是否是高度相關的,如果是高度相關,那麼該特徵就是十分重要的。比如常用的工具就是統計學裡面的相關係數。

(IV)特徵的構造過程

在實際工作中首先肯定要確定具體的問題,然後就是數據的選擇和準備過程,再就是模型的準備和計算工作,最後才是展示數據的預測結果。構造特徵的一般步驟:

[1]任務的確定:根據具體的業務確定需要解決的問題;

[2]數據的選擇:整合數據,收集數據;

[3]預處理數據:設計數據展現的格式,清洗數據,選擇合適的樣本使得機器學習模型能夠使用它。比方說一些年齡特徵是空值或者負數或者大於200等,或者說某個頁面的播放數據大於曝光數據,這些就是數據的不合理,需要在使用之前把這一批數據排除掉。

[4]特徵的構造:轉化數據,使之成為有效的特徵。常用的方法是標準化,歸一化,特徵的離散化等。

(4.1)標準化(Standardization):比方說有一些數字的單位是千克,有一些數字的單位是克,這個時候需要統一單位。如果沒有標準化,兩個變數混在一起搞,那麼肯定就會不合適。

(4.2)歸一化(Normalization):歸一化是因為在特徵會在不同的尺度下有不同的表現形式,歸一化會使得各個特徵能夠同時以恰當的方式表現。比方說某個專輯的點擊播放率一般不會超過0.2,但是專輯的播放次數可能會達到幾千次,所以說為了能夠在模型裡面得到更合適結果,需要先把一些特徵在尺度上進行歸一化,然後進行模型訓練。

(4.3)特徵的離散化(Discretization):離散化是指把特徵進行必要的離散處理,比方說年齡特徵是一個連續的特徵,但是把年齡層分成5-18歲(中小學生),19-23歲(大學生),24-29歲(工作前幾年),30-40歲(成家立業),40-60歲(中年人)從某些層面來說比連續的年齡數據(比如說某人年齡是20歲1月3日之類的)更容易理解不同年齡層人的特性。典型的離散化步驟:對特徵做排序-&> 選擇合適的分割點-&> 作出區間的分割 -&> 作出區間分割-&> 查看是否能夠達到停止條件。

[5]模型的使用:創造模型,選擇合適的模型,用合適的模型來進行預測,用各種統計指標來判斷該特徵是否合適;

[6]上線的效果:通過在線測試來看效果。

數據的轉換(Transforming Data)就是把數據從原始的數據狀態轉換成適合模型計算的狀態,從某些層面上來說,「數據轉換「和」特徵構造「的過程幾乎是一致的。

(V)特徵工程的迭代過程

特徵工程的迭代步驟:

[1]選擇特徵:需要進行頭腦風暴(brainstorm)。通過具體的問題分析,查看大量的數據,從數據中查看出可以提取出數據的關鍵;

[2]設計特徵:這個需要具體問題具體分析,可以自動進行特徵提取工作,也可以進行手工進行特徵的構造工作,甚至混合兩種方法;

[3]選擇特徵:使用不同的特徵構造方法,來從多個層面來判斷這個特徵的選擇是否合適;

[4]計算模型:通過模型計算得到模型在該特徵上所提升的準確率。

[5]上線測試:通過在線測試的效果來判斷特徵是否有效。


一個對數處理就變線性了,豈不美哉?


去看l1,l2的正則推導思想就明白了。本身是在做訓練集的擬合和測試集的預測,當然不希望有過擬合的情況,同時又可以篩選出比較明顯的特徵出來。對數處理是一種方式。


推薦閱讀:

在Kaggle比賽中獲得好成績甚至拿到獎金的data scientist都經歷了什麼?

TAG:數據挖掘 | 機器學習 | 數據科學家 |