로그(Logarithm)


Fig 1. 로그함수 그래프


로그는 수학 함수의 일종으로, 어떤 수를 나타내기 위해 고정된 밑을 몇 번 곱하여야 하는지를 나타내는 함수입니다.
로그 함수는 x가 (0, 1) 사이의 값을 가질 때, y는 (-∞, 0) 값을 가집니다.
즉, x가 0이면 y는 -∞ 값을 가집니다.


np.log()가 아닌 np.log1p()를 사용하는 이유

로그 함수의 경우, np.log(0) 은 음의 무한대 값을 가집니다.
즉, 음의 무한대 값을 피하기 위해 np.log(x+1) 와 같이 x에 1을 더해줍니다.
np.log1p(x)np.log(x+1)와 동일한 역할을 합니다.

import pandas as pd
import numpy as np

x = {"x": np.random.randint(1, 100, 10)}
df = pd.DataFrame(x)

df["log(x+1)"] = np.log(df["x"] + 1)
df["log1p(x)"] = np.log1p(df["x"])
Fig 2. x, log(x+1), log1p(x) 비교


np.log1p(x)np.log(x+1)은 같은 기능을 하는데 왜 np.log1p()를 쓸까요? 🤔
아래 예시로 이해해 봅시다.

# 전자 또는 양성자 하나의 전하량 : 1.6021773349e-19
x = 1.6021773349e-19
log_x1 = np.log(1.6021773349e-19+1) 
log1p_x = np.log1p(1.6021773349e-19)

print(log_x1) # 결과 : 0.0
print(log1p_x) # 결과 : 1.6021773349e-19
  • np.log(x+1) 보다 np.log1p(x) 가 식이 더 깔끔해 보입니다.
  • x 값을 로그로 취할 때, np.log(x+1)로 하면 x 값이 무시됩니다.
  • 반면, np.log1p(x)는 x가 아무리 작은 값이라도 무시되지 않습니다.
  • 위와 같은 이유로 np.log(x+1)을 사용하는 것 보다 np.log1p(x)를 사용하는 것을 권장합니다.


np.expm1()로 복원하기

만약 머신러닝 모델을 만들 때, 정답값(label)을 로그 변환했다면 제출할 때 이전 값으로 복원시켜야합니다.
np.expm1()로 복원과정을 생략한다면 제출 시, 점수가 이상할 수 있습니다.
np.exp()np.expm1() 로 로그로 변환한 값을 다시 복원할 수 있다.

df["exp(log1p(x))-1"] = np.exp(df["log1p(x)"])-1
df["expm1(loglp(x))"] = np.expm1(df["log1p(x)"])

df[["x", "exp(log1p(x))-1", "expm1(loglp(x))"]]
Fig 3. x, exp(log1p(x))-1, expm1(log1p(x)) 비교


정리

로그 변환 시, np.log(x+1)np.log1p(x)를 사용할 수 있습니다
로그를 취한 값을 복원할 때, np.exp()np.expm1()를 사용할 수 있습니다.
머신러닝 모델을 만들 때, 로그변환 과정을 거친다면 np.log1p()np.expm1()을 사용합시다.


Fig 4. 전 과정 정리


Reference


개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다 :)

댓글남기기