對數轉換 是什麼?

Log Transformation:對數轉換 的完整解釋

將數值特徵取對數以壓縮偏態分布、縮小量級差距,使數據更接近常態分布的前處理技術。

對數轉換(Log Transformation)是資料科學與統計分析中歷史悠久且效果顯著的前處理技術,其數學基礎簡單,但對後續建模的影響往往深遠。

為什麼需要對數轉換

許多真實世界的數值數據呈現右偏態(Right-skewed)分布,即大部分值集中在低端,少數極端大值拉長右尾。常見例子:

  • 房屋價格:大多數房子價格適中,少數豪宅價格極高
  • 個人收入:多數人收入有限,極少數高收入者拉高均值
  • 網路流量、社群媒體互動:絕大多數貼文互動量低,少數病毒式傳播貼文互動量極高
  • 生物學測量:細胞計數、RNA 表達量等

右偏態數據對許多演算法造成問題:

  1. 線性模型:假設特徵的線性關係,極端值可能主導回歸係數
  2. 距離型演算法(KNN、K-means):量級差距大的特徵會主導距離計算
  3. 統計假設: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 提供這兩種轉換。

實務操作步驟

  1. 分析分布:用直方圖或 Q-Q Plot 確認數據是否偏態
  2. 選擇轉換:純正數用 log;含 0 用 log1p;需要自動最佳化用 Box-Cox/Yeo-Johnson
  3. 轉換特徵:np.log1p(X['feature']) 或使用 sklearn 的 PowerTransformer
  4. 驗證效果:轉換後再次繪製分布圖,確認偏態改善
  5. 套用於預測時:測試集與線上推論時必須使用相同的轉換參數(不能重新擬合)

結果解釋的注意事項

若對目標變數(Y)也進行對數轉換,模型輸出的是 log(Y),使用時必須反轉換(取指數 exp)得回原始量級。在線性回歸中,對目標取對數後,係數的解釋變為「X 增加 1 單位,Y 的預測值乘以 exp(係數)」,而非直接加減。

適用與不適用情境

適用:右偏態連續正值特徵、金融數據(價格、交易量)、生物統計(濃度、計數)。

不適用:已近似常態分布的特徵(轉換後反而惡化)、有業務意義需要保留原始量級的場景、分類特徵或二元變數。

常見問題