데이터 과학 Data Science/시계열 데이터

[시계열] 일반 머신러닝 모델로 시계열 데이터 돌리는 법

허니비 honeybee 2023. 5. 24. 00:09

다들 알고 계셨나요? 주니어인 저는 이번 프로젝트 하면서 생판 처음 알게 된 사실이랍니다... 

 

말그대로 일반 머신러닝 예측, 분류 문제를 시계열 데이터에 활용하면 된다는건데요. 딥러닝을 그닥 좋아하지 않는 저로서는 이 소식이 정말 반갑고.. 놀라워 같이 작업하신 데사분께 배워온 내용들을 기록해 두려고 합니다 

 

우선 기본 원리는 다음과 같습니다

 

1. 시계열 데이터의 형태를 일반 모델에 들어갈 수 있는 수치 형태로 바꿔준다 (이때 인덱스가 날짜일 필요는 없어지며 순서만 잘 유지해주면 되는 듯 하다)

 

2. 하지만 그렇게 되면 시계열 모델이 가지는 장점인 (시간 순서에 따른 패턴 등을 잘 학습한다는 점) 은 사라지게되니 이를 상쇠할만한 다른 컬럼들을 생성해 주거나, (이동평균이라던지, 푸리에변환이라던지) 공휴일 이벤트 컬럼을 추가해 나름의 보완을 해주도록 하자

 

3. 하지만 이런 시계열적 특성까지 잘 학습할 수 있는건 사실 LSTM 기반의 딥러닝 모델들이다.. 뭐 크기가 너무 커서 혹은 모델 내부를 뜯어낼만한 설명력이 부족해서 등등등 여러가지 이유로 우리는 머신러닝을 선택했으나 오로지 성능만을 생각하는 모델링을 하고자 한다면 저걸 채택할 수도 있겠다 

 

 

그래서 그렇게 변환하는 코드 

내가 며칠의 데이터를 학습시켜 며칠을 학습시킬건지에 따라서.. 작동 방식은 달라짐 

X_data = make_array(data)
Y_data = make_array(data[col_true])
    
X = []
y = []
    
for i in range(X_data.shape[0]):

     for j in range(X_data.shape[1] - time_steps - forecast +1):
     
         X.append(X_data[i][j:j+time_steps])
         y.append(int(Y_data[i][j+time_steps:j+time_steps+forecast].sum() != 0))
    
X = np.array(X)
y = np.array(y)

 

이 코드를 이용하면 입력 데이터가 어레이 형태로 

 

ex) 

날짜         가격
2021-01-01  10
2021-01-02  15
2021-01-03  20
2021-01-04  18
2021-01-05  25


#time_step 을 3이라고 가정한 경우
#forecast=1 이라고 가정한 경우

입력 데이터(X)       출력 데이터(y)
[10, 15, 20]        [18]
[15, 20, 18]        [25]

이런식으로 반환되게된다. 저걸 모델에 넣어주면 됩니다

 

모델에 넣을때는 2차원으로 각각 reshape해서 넣어주면 됨. 만약 딥러닝에 넣을거라면 3차원으로 바꾸라고 한다

 

그럼 이만 뾰로롱 

728x90