MACHINE LEARNING

Time series classification 데이터 전처리

24_bean 2024. 9. 1. 15:12

Introduction

이전 포스트에서 Time Series Classification (TSC), 즉 시계열 분류에 대해 정의한 바 있습니다.

 

자세한 내용은 아래 링크를 통해 확인할 수 있습니다:

https://24bean.tistory.com/entry/TSC-Time-series-classification-시계열-분류-정리

 

TSC / Time series classification 시계열 분류 정리

정의 (Definition) Time Series Classification (TSC) : 시간의 흐름에 따라 측정된 데이터를 분류하는 문제를 다루는 기술. 시계열 데이터(Time Series)는 시간에 따라 값이 변화하는 데이터를 일컫는 말이다. 일

24bean.tistory.com

 

Time Series Classification (TSC) : 시간의 흐름에 따라 측정된 데이터를 분류하는 문제를 다루는 기술.

 

시계열 데이터(Time Series)는 일반적으로 다음과 같은 특징을 갖는다.

  • 시간에 따라 측정된 값이 변화한다.
  • 값의 변화는 시간적인 관계에 따라서 발생한다.
  • 일반적으로 이전 시간에 측정된 값이 다음 시간에 측정된 값에 영향을 준다.
  • 시계열 데이터의 길이는 고정되어 있지 않을 수 있다.

따라서, 시계열 데이터의 가장 큰 특징은 시간적인 관계가 있다는 점입니다. 이러한 시간적 특성을 고려해 데이터를 적절한 Time Frame으로 나누어 전처리해야 의미 있는 인사이트를 도출하고, 효과적인 모델 학습이 가능합니다.


데이터

간단한 예제와 함께 이해해봅시다.

 

import pandas as pd
import numpy as np

# 클래스 A (6일 데이터)
date_range_A = pd.date_range(start='2024-01-01', periods=6, freq='D')
data_A = np.random.normal(loc=0, scale=1, size=(6, 1))
data_A_df = pd.DataFrame(data_A, columns=['Value'])
data_A_df['Class'] = 'A'
data_A_df['Date'] = date_range_A

# 클래스 B (5일 데이터)
date_range_B = pd.date_range(start='2024-01-01', periods=5, freq='D')
data_B = np.random.normal(loc=5, scale=1.5, size=(5, 1))
data_B_df = pd.DataFrame(data_B, columns=['Value'])
data_B_df['Class'] = 'B'
data_B_df['Date'] = date_range_B

# 클래스 C (7일 데이터)
date_range_C = pd.date_range(start='2024-01-01', periods=7, freq='D')
data_C = np.random.normal(loc=10, scale=2, size=(7, 1))
data_C_df = pd.DataFrame(data_C, columns=['Value'])
data_C_df['Class'] = 'C'
data_C_df['Date'] = date_range_C

# 세 개의 클래스 데이터프레임 병합
time_series_sampled_df_abc = pd.concat([data_A_df, data_B_df, data_C_df]).reset_index(drop=True)
print(time_series_sampled_df_abc)

 


데이터 전처리


앞서 언급한 것처럼, 각 클래스가 동일한 기간의 데이터를 가져야 모델 학습에 적합한 형태로 사용할 수 있습니다. 따라서, 가장 적은 날짜 수를 가진 Class B의 데이터 기간인 5일을 기준으로 모든 데이터를 동일하게 맞춰보겠습니다.

우선, 2024-01-01부터 2024-01-05까지의 데이터만을 필터링합니다:

# '2024-01-01'부터 '2024-01-05'까지의 데이터 필터링
filtered_df = time_series_sampled_df_abc[
    (time_series_sampled_df_abc['Date'] >= '2024-01-01') & 
    (time_series_sampled_df_abc['Date'] <= '2024-01-05')
].reset_index(drop=True)



그 후, 학습 가능한 형태인 Numpy 3D 배열로 변환합니다:

# 클래스별로 데이터를 그룹화하고, 각각의 Value와 Date를 추출하여 numpy array로 변환
classes = filtered_df['Class'].unique()
date_count = len(filtered_df['Date'].unique())

# 빈 numpy array 생성
data_3d_array = np.zeros((len(classes), date_count, 2), dtype=object)

# 클래스별로 데이터를 numpy 3D array에 할당
for i, cls in enumerate(classes):
    class_data = filtered_df[filtered_df['Class'] == cls][['Value', 'Date']].to_numpy()
    data_3d_array[i, :len(class_data), :] = class_data

data_3d_array


이제 3D 배열은 다음과 같은 형태를 가집니다:  
- 5 (Date; x) x 3 (Feature; y) x 3 (Class; z)

이와 같은 전처리를 통해, 모든 클래스의 데이터가 동일한 기간에 맞춰졌으며, 이를 통해 모델 학습을 위한 준비가 완료되었습니다.


마무리

 

지금까지 우리는 시계열 데이터 분류(Time Series Classification, TSC)에 대해 기본 개념을 다루고, 간단한 예제를 통해 데이터 전처리 과정을 실습해 보았습니다. 각 클래스별 데이터를 동일한 기간으로 맞추는 것이 중요하며, 이를 통해 모델 학습에 적합한 형태로 데이터를 준비할 수 있습니다.

 

이제 이렇게 전처리된 데이터를 사용해 다양한 머신러닝 또는 딥러닝 모델에 적용해 볼 수 있습니다. 예를 들어, LSTM (Long Short-Term Memory) 네트워크와 같은 딥러닝 모델을 사용하여 시계열 데이터를 분류하는 것이 가능합니다. 또한, 다양한 피처 엔지니어링 기법을 사용해 데이터를 더욱 정제하고 성능을 향상시킬 수 있습니다.

 

추후 포스트에서는 이러한 모델링 과정과 추가적인 시계열 데이터의 고급 처리 기법들에 대해 다루도록 하겠습니다. 관심 있는 분들은 다음 포스트도 기대해 주세요!

반응형