머신러닝에서 시간 같이 순환하는 숫자를 인코딩하는 방법이다.

 

시간을 예를 들어 설명하면 

 

00시와 23시는 숫자 적으로 본다면 23의 차이를 가진다 하지만 실제의 개념으로 본다면 1시간의 차이가 나는 것이다,

 

이를 해결하려고 보통의 머신러닝을 할떄는 시간을 범주형변수라고 전재하고 원핫 인코딩이나 카테고리컬형으로 처리하곤한다. 

 

하지만 이의 경우 시간의 거리를 무시하는 결과를 가지고 오게된다.

 

범주형 변수로 볼경우 23시와 0시의 차이와  12시와 0시의 차이를 같은 것으로 보게 된다.

 

이때 사용하는 인코딩 방법이 cycling encoding이다.

 

 

 

import numpy as np
time_list = list(range(0,24))
sin_list = list(map(lambda x : round(np.sin(2 * np.pi* x/24),4) ,time_list))
cos_list = list(map(lambda x : round(np.cos(2 * np.pi* x/24),4) ,time_list))

for i in time_list:
    print(f'{i}시의 좌표는 ({sin_list[i]},{cos_list[i]}) 입니다.')
    
    
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.scatter(sin_list, cos_list)

for i, txt in enumerate(time_list):
    ax.annotate(txt, (sin_list[i], cos_list[i]))
0시의 좌표는 (0.0,1.0) 입니다.
1시의 좌표는 (0.2588,0.9659) 입니다.
2시의 좌표는 (0.5,0.866) 입니다.
3시의 좌표는 (0.7071,0.7071) 입니다.
4시의 좌표는 (0.866,0.5) 입니다.
5시의 좌표는 (0.9659,0.2588) 입니다.
6시의 좌표는 (1.0,0.0) 입니다.
7시의 좌표는 (0.9659,-0.2588) 입니다.
8시의 좌표는 (0.866,-0.5) 입니다.
9시의 좌표는 (0.7071,-0.7071) 입니다.
10시의 좌표는 (0.5,-0.866) 입니다.
11시의 좌표는 (0.2588,-0.9659) 입니다.
12시의 좌표는 (0.0,-1.0) 입니다.
13시의 좌표는 (-0.2588,-0.9659) 입니다.
14시의 좌표는 (-0.5,-0.866) 입니다.
15시의 좌표는 (-0.7071,-0.7071) 입니다.
16시의 좌표는 (-0.866,-0.5) 입니다.
17시의 좌표는 (-0.9659,-0.2588) 입니다.
18시의 좌표는 (-1.0,-0.0) 입니다.
19시의 좌표는 (-0.9659,0.2588) 입니다.
20시의 좌표는 (-0.866,0.5) 입니다.
21시의 좌표는 (-0.7071,0.7071) 입니다.
22시의 좌표는 (-0.5,0.866) 입니다.
23시의 좌표는 (-0.2588,0.9659) 입니다.

이런식으로 하나의 변수였던 시간변수를 두가지의 변수로 쪼개어 순환하는 특성을 만드는 것이다.

 

시계바늘이나 풍향의 모습이라고 이해한다면 이해하기 쉬울 것이다.

 

나는 이런 특성과 다르게 트리기반 모델에 적용했을 때에도 스코어의 상승을 겪었다 하지만 수리적으로는 옳지 않다 

 

단 두가지의 변수를 만들기 때문에 분기시에 한가지의 변수를 이용하는 트리기반모델에는 적합치 않고 두변수의 관계를 한 번에 고려할 수 있는 신경망 모델에 적합한 인코딩 방법일 것이다.

 

 

'ML' 카테고리의 다른 글

[ML] 인공신경망 학습  (0) 2022.02.17
[ ML ] 인공신경망 기본  (0) 2022.02.16
[ML] XGBoost - Classification  (0) 2022.01.18
[ML] XGBoost - Regression  (0) 2022.01.04
[ML] Gradient Boost - Classification  (0) 2022.01.03

+ Recent posts