본문 바로가기
  • "Backtest, backtest, backtest." - Martin Schwartz
[시스템개발] 트레이딩뷰, 웹, 앱

Prophet 모델을 사용하기 위한 데이터 준비 방법 - 학습-테스트 분할 (Train-Test Split)

by Eirene 2023. 3. 28.
반응형

Prophet 모델을 사용하기 위한 데이터 준비 방법 - 학습-테스트 분할 (Train-Test Split)
Prophet 모델을 사용하기 위한 데이터 준비 방법 - 학습-테스트 분할 (Train-Test Split)

Prophet 모델을 사용하기 위한 데이터 준비 방법 중에서 학습-테스트 분할 (Train-Test Split)을 배우고 예측의 정확성을 높이세요.

 

Prophet 모델을 포함한 모든 예측 모델을 구축할 때 데이터 준비는 중요한 단계입니다. Prophet 모델은 Facebook에서 개발한 인기 있는 오픈 소스 도구로, 시계열 데이터를 예측하는 데 사용됩니다. 여기에서는 정확하고 신뢰할 수 있는 Prophet 모델을 구축하기 위해 사용할 수 있는 다양한 데이터 준비 기술에 대해 논의로 여기에서는 학습-테스트 분할 (Train-Test Split)을 알아 보도록 하겠습니다.

 

  1. 데이터 정제 (Data Cleaning)
  2. 시계열 분해 (Time Series Decomposition)
  3. 시계열 정상성 (Time Series Stationarity)
  4. 특성 선택 (Feature Selection)
  5. 학습-테스트 분할 (Train-Test Split)
  6. 하이퍼파라미터 튜닝 (Hyperparameter Tuning)

 

정확하고 신뢰할 수 있는 Prophet 모델을 구축하기 위한 중요한 단계 중 하나는 학습-테스트 분할입니다. 학습-테스트 분할은 사용 가능한 데이터를 훈련 세트와 테스트 세트로 분할하는 것을 의미합니다. 학습 세트는 모델을 훈련하는 데 사용되고, 테스트 세트는 모델의 성능을 평가하는 데 사용됩니다.

 

Prophet 모델의 학습-테스트 분할의 중요성

학습-테스트 분할은 Prophet 모델의 성능을 평가하는 데 중요합니다. 이를 통해 모델이 이전에 보지 못한 새로운 데이터에 대해 일반화할 수 있는 능력을 평가할 수 있습니다. 학습-테스트 분할 없이 모델은 훈련 데이터에 과적합되어 새로운 데이터에서 성능이 저하될 수 있습니다.

 

데이터를 분할하는 기술

시계열 데이터를 훈련 및 테스트 세트로 분할하는 기술에는 다음과 같은 것들이 있습니다.

랜덤 분할

이 기술에서는 데이터를 무작위로 훈련 및 테스트 세트로 나눕니다. 이 기술은 간단하고 쉽게 구현할 수 있지만, 데이터에 추세나 계절성이 있는 경우 적합하지 않을 수 있습니다.

다음은 sklearn 라이브러리의 train_test_split() 함수를 사용하여 무작위로 학습-테스트 분할을 수행하는 예시 코드입니다:

# Import necessary libraries
from sklearn.model_selection import train_test_split

# Load data into DataFrame
df = pd.read_csv('time_series_data.csv', index_col=0, parse_dates=True)

# Perform train-test split with 80% of data for training and 20% for testing
train_data, test_data = train_test_split(df, test_size=0.2, shuffle=True)

# Verify the shape of the train and test data
print("Train data shape: ", train_data.shape)
print("Test data shape: ", test_data.shape)
이 예시에서는 sklearn 라이브러리의 train_test_split() 함수를 사용하여 무작위로 학습용 데이터와 테스트용 데이터를 분할합니다. shuffle=True 인자는 분할 전에 데이터가 섞이도록 하여 어떤 편향도 방지합니다. 마지막으로, shape 속성을 사용하여 학습 데이터와 테스트 데이터의 크기를 확인합니다.

 

시간 기반 분할

이 기술에서는 특정 시간 기준으로 데이터를 분할합니다. 훈련 세트에는 시간 기준 이전의 데이터가 포함되고, 테스트 세트에는 시간 기준 이후의 데이터가 포함됩니다. 이 기술은 추세나 계절성이 명확한 시계열 데이터에 적합합니다.

# Import necessary libraries
import pandas as pd
from datetime import datetime

# Load data into DataFrame
df = pd.read_csv('time_series_data.csv', index_col=0, parse_dates=True)

# Split data into training and test sets
split_date = datetime(2021, 1, 1)
train = df.loc[df.index <= split_date]
test = df.loc[df.index > split_date]

이 예제에서는 시계열 데이터를 DataFrame에 로드하고, 2021년 1월 1일을 기준으로 데이터를 분할하는 방법을 보여줍니다. 이후, 분할된 데이터를 학습 데이터와 테스트 데이터로 나눕니다.

이는 시계열 데이터에 대한 간단한 시간 기반 분할 예제이며, 데이터 및 모델의 구체적인 요구사항에 따라 사용자 정의가 가능합니다.

 

슬라이딩 윈도우 분할

이 기술에서는 고정된 크기의 윈도우를 사용하여 데이터를 훈련 및 테스트 세트로 분할합니다. 윈도우를 시계열 상에서 이동시키고, 각 윈도우에서 분할을 반복합니다. 이 기술은 변화하는 추세나 계절성이 있는 시계열 데이터에 적합합니다.

import pandas as pd
from sklearn.model_selection import TimeSeriesSplit

# Load time series data into DataFrame
df = pd.read_csv('time_series_data.csv', index_col=0, parse_dates=True)

# Define sliding window size and step
window_size = 12  # 12 months
step = 1  # 1 month

# Create TimeSeriesSplit object for sliding window split
tscv = TimeSeriesSplit(n_splits=len(df)//step-window_size+1)

# Iterate over sliding windows and split data
for train_index, test_index in tscv.split(df):
    train_data = df.iloc[train_index]
    test_data = df.iloc[test_index]

    # Train and evaluate Prophet model on each split
    ...

이 예제에서는 sklearn.model_selection 모듈의 TimeSeriesSplit 함수를 사용하여 시계열 데이터를 여러 슬라이딩 윈도우로 분할합니다. 슬라이딩 윈도우의 크기와 스텝을 정의한 후 적절한 매개변수를 사용하여 TimeSeriesSplit 객체를 만듭니다.

그런 다음 TimeSeriesSplit 객체의 split 함수를 사용하여 슬라이딩 윈도우를 반복합니다. 각 분할에서 원본 DataFrame에서 해당하는 학습 및 테스트 데이터를 추출 한 다음 분할 된 데이터를 사용하여 Prophet 모델을 학습하고 평가합니다.

학습 및 평가를 위한 Prophet 모델의 코드는 특정 데이터와 모델링 요구 사항에 따라 다르므로이 예제에서는 보여주지 않습니다.

 

Prophet 모델의 평가 메트릭

데이터가 학습 및 테스트 세트로 분할되면, Prophet 모델의 성능을 평가하기 위해 평가 지표를 사용할 수 있습니다. 시계열 데이터에 대한 일반적인 평가 지표는 다음과 같습니다.

  1. 평균 절대 오차 (MAE) : MAE는 실제 값과 예측 값의 평균 절대 차이를 측정합니다.
  2. 평균 제곱 오차 (MSE) : MSE는 실제 값과 예측 값의 평균 제곱 차이를 측정합니다.
  3. 평균 제곱근 오차 (RMSE) : RMSE는 실제 값과 예측 값의 평균 제곱근 차이를 측정합니다.
  4. 평균 절대 백분율 오차 (MAPE) : MAPE는 실제 값과 예측 값의 평균 백분율 차이를 측정합니다.

Prophet 모델의 train-test split 예시 코드입니다.

# Import necessary libraries
import pandas as pd
from sklearn.model_selection import train_test_split

# Load data into DataFrame
df = pd.read_csv('time_series_data.csv', index_col=0, parse_dates=True)

# Split data into training and testing sets
train, test = train_test_split(df, test_size=0.2, shuffle=False)

# Train Prophet model on training set
# ...

# Evaluate performance of Prophet model on testing set
# ...

이 코드 예제에서는 먼저 필요한 라이브러리들을 불러오고, pandas를 이용하여 시계열 데이터를 불러오고, scikit-learn을 이용하여 데이터를 학습용과 테스트용으로 분할하는 과정을 포함하고 있습니다. 우선 데이터를 DataFrame으로 불러오고, train_test_split 함수를 사용하여 데이터를 학습용과 테스트용으로 분할합니다. 이 예제에서는 데이터 세트를 80% 학습 세트와 20% 테스트 세트로 분할하고, shuffle 매개변수를 False로 설정하여 데이터의 시간 순서를 유지합니다. test_size 매개변수는 테스트 세트에서 차지하는 데이터의 비율을 지정하고, shuffle 매개변수는 데이터의 순서를 유지하기 위해 False로 설정합니다.

데이터를 분할한 후에는 학습 데이터를 사용하여 Prophet 모델을 학습하고, 이전에 설명한 평가 지표를 사용하여 모델의 성능을 테스트 데이터에서 평가할 수 있습니다. 

 

다음은 Prophet 모델을 사용하여 이러한 평가 지표를 계산하는 방법의 예시입니다:

# Import necessary libraries
import pandas as pd
from fbprophet import Prophet
from sklearn.metrics import mean_absolute_error, mean_squared_error

# Load data into DataFrame
df = pd.read_csv('time_series_data.csv', index_col=0, parse_dates=True)

# Split data into training and testing sets
train, test = train_test_split(df, test_size=0.2, shuffle=False)

# Fit Prophet model
model = Prophet()
model.fit(train)

# Make predictions on test set
future = model.make_future_dataframe(periods=len(test), freq='D')
forecast = model.predict(future)
predictions = forecast[-len(test):]['yhat']

# Calculate evaluation metrics
mae = mean_absolute_error(test['y'], predictions)
mse = mean_squared_error(test['y'], predictions)
rmse = mse ** 0.5
mape = (abs(test['y'] - predictions) / test['y']).mean() * 100

print('MAE:', mae)
print('MSE:', mse)
print('RMSE:', rmse)
print('MAPE:', mape)

이 예시에서는 훈련 데이터를 사용하여 Prophet 모델을 피팅하고, 테스트 데이터에 대한 예측을 수행합니다. 그런 다음 예측 값과 실제 값 간의 MAE, MSE, RMSE 및 MAPE를 계산합니다. 이러한 평가 지표는 Prophet 모델의 정확성과 신뢰성을 평가하는 데 도움이 될 수 있습니다.

 

Prophet 모델을 사용하여 시계열 데이터를 분석하려면, 먼저 데이터를 훈련 세트와 테스트 세트로 나누는 학습-테스트 분할 과정을 거쳐야 합니다. 이를 통해 모델의 성능을 평가하고, 새로운 데이터에 대한 일반화 능력을 파악할 수 있습니다.

데이터를 나누는 기법으로는 무작위 분할, 시간 기반 분할, 슬라이딩 윈도우 분할 등이 있으며, 적절한 기법을 선택하여 사용해야 합니다. 또한, 분할 후에는 MAE, MSE, RMSE, MAPE 등의 평가 지표를 사용하여 모델의 예측 정확도를 평가할 수 있습니다.

 

학습-테스트 분할은 Prophet 모델을 활용한 시계열 데이터 분석에서 매우 중요한 단계이며, 적절한 분할 방법을 선택하고, 평가 지표를 사용하여 모델의 성능을 평가하는 것이 모델의 정확성과 신뢰성을 향상시키는 데 도움이 됩니다.

 

다음에는 마지막으로 하이퍼파라미터 튜닝 (Hyperparameter Tuning)에 대해서 알아 보도록 하겠습니다.

 

Prophet 모델을 사용하기 위한 데이터 준비 방법 - 하이퍼파라미터 튜닝 (Hyperparameter Tuning)

Prophet 모델을 사용하기 위한 데이터 준비 방법 중에서 하이퍼파라미터 튜닝 (Hyperparameter Tuning)을 배우고 예측의 정확성을 높이세요. Prophet 모델을 포함한 모든 예측 모델을 구축할 때 데이터 준

backtesting.tistory.com

 

728x90
반응형

댓글