[ML] 로그 변환 시 np.log()가 아닌 np.log1p()를 사용하는 이유
로그(Logarithm)
로그는 수학 함수의 일종으로, 어떤 수를 나타내기 위해 고정된 밑을 몇 번 곱하여야 하는지를 나타내는 함수입니다.
로그 함수는 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"])
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))"]]
정리
로그 변환 시, np.log(x+1)
와 np.log1p(x)
를 사용할 수 있습니다
로그를 취한 값을 복원할 때, np.exp()
와 np.expm1()
를 사용할 수 있습니다.
머신러닝 모델을 만들 때, 로그변환 과정을 거친다면 np.log1p()
와 np.expm1()
을 사용합시다.
Reference
- 📷 이미지 출처 : 나무위키 - 로그함수
- suppppppp - 로그변환과 np.log()가 아닌 np.log1p()를 하는 이유
- 티스토리 by 퐁스 - 왜 machine learning에서는 Normal Distributions를 사용할까?
- 티스토리 by DA Hun - [Python] 로그함수(logarithmic function) np.log1p(z)
개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다 :)
댓글남기기