【特徵工程學習筆記】對數據取log有什麼好處
目標:
用較泛的角度解釋對非正態分佈的數據取log會有什麼好處以及原因
1.前言
2.為什麼會有取log這件事情
3.取log有什麼好處
4.結論
1. 前言
取log簡單說下,目的就是要解決下面的例子:
Q:12為2的幾次方?
核心目標就如上,幾個較不確定的中文詞會附註英文,有興趣可以用英文google結果會較準。
2.為什麼會有取log這件事情
將數據餵進去跑模型之前,通常我會簡單進行三個步驟處理:
* 預處理清洗數據內容
* 改變特徵類型(categorical or numerical data type transfer )
* 查看數據分佈(positive or negative skew in distribution)
對數據取log本身是再處理第三點,目的是要讓數據分佈的偏態(skew)盡量回到正態分佈(normal distribution)。
若假設要取log的欄位每項數據為a,則必須符合以下兩個條件:
1. a > 0
2. a != 1 (!= 不等於)
若不符合上述其中一項則無法使用log取對數。
但是實際上數據一定會有遇到欄位有負數或者等於1的值,這時候如果要取log會有兩種處理方式:
* 再值前面加上 i -》 log( a+i)
* 或者直接使用 box-cox transformer
上面並沒有哪個方式比較好,如果時間允許是建議兩個都試一試然後交叉驗證(Grid Search CV)
3. 取log有什麼好處
3.1 讓數據范圍變小
如果有一天搬家不考慮的質量的狀況下,有一個縮小燈先把東西都縮小然後帶著拿到目的地再用放大燈照,是不是就不用多跑幾趟去搬運。
所以取log目的在於要縮短數據絕對值的範圍
假如今天有組數據范圍介於10~1000,取log以後範圍就會變成1~100,數據范圍就會變小。
3.2 分佈形態會比較向正態分佈靠近
老前輩都說如果分佈(distribution)很偏就先取log說不定就會好一點。要解釋這原因就讓我想到有個日本清酒名叫獺祭,有兩款清酒:
* 三割線九分
* 二割三分
幾割幾分就是米的研磨精度,三割九分就是磨掉三分之一的米、二割三分就是磨掉三分之二的米。磨掉越多的米純度就越高口感就越順。取log再縮小數據的範圍同時也會再轉換的過程中將部分數據中的雜訊去除掉,減少一些會對模型有影響的數據
上面並沒有哪個方式比較好,如果時間允許是建議兩個都試一試然後交叉驗證(Grid Search CV)
3.3 乘法變加法,模型可以算更快
如果可以坐車就不想走路,如果可以加法就懶著用減法。舉個例子:
1. (2**5) * (2**14) = ?(2的5次方乘上2的14次方)
2. log(2**5)* log(2**14) = 5 +14 = ?
如果是電腦沒有取log就會直接把2乘19次,取log就會變成5 + 14 ,相較前者取log真滴快很多。
3.4 若使用回歸線性模型可以減少異方差(heteroscedasticity)
其實模型有時候跟人一樣,
例子1:
* 今天全家吃牛排花了5000元,然後加上1成服務費500。會覺得5500花出去心裡有一股莫名的痛被點燃
* 今天買了一台BMW 250萬,車廠說加5500升級椅子材質,就會覺得5500元尚可
例子2:
* 調查不同公司的毛利,可能會發現大公司利潤幅度會比小公司還小
* 調查不同公司的花費,可能會發現大公司的花費預算遠比小公司還要來得大很多
以上的例子如果在使用 y = ax + b 模型進行預估時,可能因為數據中數據的範圍太大而導致太多雜訊,進而導致模型不可解釋b的值過大或過小。
實際例子:
有兩組數據(1000,400) (1600,1000),倆組數據之間都差600(1000-400,1600-1000),但若對兩個數據取log
* log 1000 - log 100 = 3 - 2.6 = 0.4
* log 1600 - log 1000 = 3.2 - 3 = 0.2
可以發現數值範圍較大對差異較不敏感,若數值範圍縮小則對差異就較明顯。
4. 結論
取log除了可以縮小數據范圍、同時也可以修改整體數據分佈的形態。但現實中除了很難看到完美常態分佈的數據以外,甚至有可能取了一次log以後還是會看到一樣偏的很嚴重的數據。
這時候就不經想起馬前總統說過的經典名言:
便當吃不夠可以吃兩個,取一次log不行、那再log一次
但實際上有可能就算取了好幾次log數據一樣偏的很嚴重...會不會有人想問現實有沒有這樣的情況發生呢?
有,例如畫出全台灣打工仔的收入分佈圖...
留言
張貼留言