對數轉換 是什麼?
Log Transformation:對數轉換 的完整解釋
將數值特徵取對數以壓縮偏態分布、縮小量級差距,使數據更接近常態分布的前處理技術。
對數轉換(Log Transformation)是資料科學與統計分析中歷史悠久且效果顯著的前處理技術,其數學基礎簡單,但對後續建模的影響往往深遠。
為什麼需要對數轉換
許多真實世界的數值數據呈現右偏態(Right-skewed)分布,即大部分值集中在低端,少數極端大值拉長右尾。常見例子:
- 房屋價格:大多數房子價格適中,少數豪宅價格極高
- 個人收入:多數人收入有限,極少數高收入者拉高均值
- 網路流量、社群媒體互動:絕大多數貼文互動量低,少數病毒式傳播貼文互動量極高
- 生物學測量:細胞計數、RNA 表達量等
右偏態數據對許多演算法造成問題:
- 線性模型:假設特徵的線性關係,極端值可能主導回歸係數
- 距離型演算法(KNN、K-means):量級差距大的特徵會主導距離計算
- 統計假設:t 檢定、ANOVA 等假設常態性,偏態數據違反此假設
數學原理
對數函數的核心性質:
- log(x × y) = log(x) + log(y):乘法關係轉換為加法關係
- 對於等比例增長(x × c),轉換後的差距恆定(log(x) + log(c))
這意味著,原始數據中「從 1 到 10」和「從 100 到 1000」的增長幅度(都是 10 倍),在對數轉換後的距離相同(都是 log(10)),達到壓縮量級差距的效果。
常見對數函數選擇
- 自然對數 ln(底數 e ≈ 2.718):數學推導最常用,特別在統計建模與微積分相關推導中。
- 以 10 為底的對數 log₁₀:直觀易解釋(log₁₀(1000) = 3 表示 3 個數量級),適合展示數量級。
- log(x + 1) 或 log1p:當數據中包含 0 值時(log(0) = -∞),使用 log(x + 1) 避免無限值問題。Python 的
numpy.log1p()提供數值穩定的計算。
應用前提條件
- 數據必須全部為正數(對數函數定義域為正實數)
- 若含 0 值:使用 log(x + 1)
- 若含負值:可能需要先整體平移(加最小值絕對值 + 1),或考慮其他轉換方法(Box-Cox、Yeo-Johnson)
Box-Cox 與 Yeo-Johnson 轉換
對數轉換是廣義 Box-Cox 轉換(λ=0 時的特例)。Box-Cox 轉換透過最大似然估計自動選擇最佳的 λ 值,使轉換後的分布最接近常態。Yeo-Johnson 是 Box-Cox 的擴展,支援含零與負值的數據。在 scikit-learn 中,PowerTransformer 提供這兩種轉換。
實務操作步驟
- 分析分布:用直方圖或 Q-Q Plot 確認數據是否偏態
- 選擇轉換:純正數用 log;含 0 用 log1p;需要自動最佳化用 Box-Cox/Yeo-Johnson
- 轉換特徵:
np.log1p(X['feature'])或使用 sklearn 的PowerTransformer - 驗證效果:轉換後再次繪製分布圖,確認偏態改善
- 套用於預測時:測試集與線上推論時必須使用相同的轉換參數(不能重新擬合)
結果解釋的注意事項
若對目標變數(Y)也進行對數轉換,模型輸出的是 log(Y),使用時必須反轉換(取指數 exp)得回原始量級。在線性回歸中,對目標取對數後,係數的解釋變為「X 增加 1 單位,Y 的預測值乘以 exp(係數)」,而非直接加減。
適用與不適用情境
適用:右偏態連續正值特徵、金融數據(價格、交易量)、生物統計(濃度、計數)。
不適用:已近似常態分布的特徵(轉換後反而惡化)、有業務意義需要保留原始量級的場景、分類特徵或二元變數。