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

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

by Eirene 2023. 3. 28.
반응형

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

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

 

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

 

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

하이퍼파라미터 튜닝은 기계 학습 모델의 최적 성능을 얻기 위해 최상의 하이퍼파라미터를 선택하는 과정입니다. 이번 섹션에서는 Prophet 모델의 하이퍼파라미터 튜닝의 중요성, 최상의 하이퍼파라미터 선택 기술 및 파이썬에서 하이퍼파라미터 튜닝 구현 방법에 대해 논의하겠습니다.

 

하이퍼파라미터란 무엇인가요?

하이퍼파라미터는 모델이 학습하는 동안 배우지 않는 매개변수이지만, 학습 전에 사용자에 의해 설정되는 매개변수입니다. 이러한 매개변수는 모델의 동작 및 성능을 제어합니다. Prophet 모델에서 중요한 하이퍼파라미터 중 일부는 changepoint prior scale, seasonality prior scale 및 regularization parameter 등이 있습니다.

 

하이퍼파라미터 튜닝 기술

Prophet 모델의 최상의 하이퍼파라미터 선택 방법 Prophet 모델의 최상의 하이퍼파라미터를 선택하는 여러 기술이 있습니다.

 

그리드 탐색(Grid search)

그리드 탐색은 하이퍼파라미터 튜닝을 위한 무차별 대입 기법입니다. 일련의 하이퍼파라미터를 테스트하고 최상의 성능을 발휘하는 조합을 선택하는 것입니다.

from prophet import Prophet
from sklearn.model_selection import GridSearchCV
import pandas as pd

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

# Split data into train and test sets
train_size = int(len(df) * 0.8)
train_data, test_data = df[:train_size], df[train_size:]

# Define parameter grid for grid search
param_grid = {
    'growth': ['linear', 'logistic'],
    'changepoint_prior_scale': [0.01, 0.1, 1.0],
    'seasonality_prior_scale': [0.01, 0.1, 1.0],
    'seasonality_mode': ['additive', 'multiplicative']
}

# Instantiate Prophet model
prophet_model = Prophet()

# Define grid search object
grid_search = GridSearchCV(
    prophet_model,
    param_grid,
    scoring='neg_mean_squared_error',
    cv=5
)

# Fit grid search to training data
grid_search.fit(train_data)

# Print best hyperparameters
print('Best hyperparameters:', grid_search.best_params_)

# Generate forecast with best hyperparameters on test data
prophet_model = Prophet(**grid_search.best_params_)
prophet_model.fit(train_data)
future = prophet_model.make_future_dataframe(periods=len(test_data))
forecast = prophet_model.predict(future)

이 예제에서는 먼저 시계열 데이터를 로드하고 학습 및 검증 데이터셋으로 분할합니다. 그 후 성장률(growth), changepoint_prior_scale, seasonality_prior_scale 및 seasonality_mode와 같은 최적화할 하이퍼파라미터 범위를 정의하는 매개변수 그리드를 정의합니다.

우리는 Prophet 모델과 그리드 탐색 객체를 매개변수 그리드, 평가 지표 및 교차 검증(fold) 횟수와 함께 인스턴스화합니다. 그 다음 그리드 서치 객체를 학습 데이터에 맞춥니다.

그리드 탐색가 완료되면, 우리는 서치에서 식별된 최적 하이퍼파라미터를 출력합니다. 마지막으로 우리는 Prophet 모델 생성자를 ** 구문을 사용하여 최적의 하이퍼파라미터를 키워드 인수로 전달하여 테스트 데이터에 대한 최적 하이퍼파라미터로 예측을 생성합니다.

이는 그리드 탐색를 사용한 하이퍼파라미터 튜닝의 하나의 예시일 뿐이며, 다른 기술과 방법을 사용할 수 있습니다.

 

랜덤 탐색(Random search)

랜덤 탐색은 그리드 탐색보다 더 효율적인 하이퍼파라미터 튜닝 기술입니다. 일련의 하이퍼파라미터를 무작위로 샘플링하고 최상의 성능을 발휘하는 조합을 선택하는 것입니다. 랜덤 서치(Random search)는 일정한 범위 내에서 하이퍼파라미터를 무작위로 선택하여 모델의 성능을 평가하고, 최적의 하이퍼파라미터 조합을 선택하는 방법입니다. 그리드 서치보다 더 효율적이며, 모든 하이퍼파라미터 조합을 시도하지 않고도 좋은 결과를 얻을 수 있습니다.

from prophet import Prophet
from sklearn.model_selection import RandomizedSearchCV
import pandas as pd

# Load data
df = pd.read_csv('data.csv')

# Define the parameter grid to search over
param_grid = {
    'growth': ['linear', 'logistic'],
    'changepoint_prior_scale': [0.001, 0.01, 0.1, 1, 5, 10],
    'seasonality_prior_scale': [0.01, 0.1, 1, 5, 10],
    'changepoint_range': [0.8, 0.85, 0.9, 0.95],
    'yearly_seasonality': [True, False],
    'weekly_seasonality': [True, False],
    'daily_seasonality': [True, False],
    'holidays_prior_scale': [0.1, 1, 5],
}

# Create a Prophet model
model = Prophet()

# Random search for hyperparameter tuning
random_search = RandomizedSearchCV(
    estimator=model,
    param_distributions=param_grid,
    n_iter=100,
    cv=5,
    scoring='neg_mean_squared_error',
    n_jobs=-1,
    random_state=42,
)

# Split data into train and test sets
train_size = int(len(df) * 0.8)
train_df = df[:train_size]
test_df = df[train_size:]

# Fit the random search model on the train data
random_search.fit(train_df)

# Print the best hyperparameters and their associated mean squared error
print(f"Best hyperparameters: {random_search.best_params_}")
print(f"Mean squared error: {-1 * random_search.best_score_}")

# Evaluate the best model on the test data
best_model = random_search.best_estimator_
forecast = best_model.predict(test_df)
mse = mean_squared_error(test_df['y'], forecast['yhat'])
print(f"Test mean squared error: {mse}")

이 예제에서는 데이터를 로드하고, 탐색할 매개변수 그리드를 정의합니다. 그 다음 Prophet 모델을 만들고, scikit-learn의 RandomizedSearchCV 함수를 사용하여 무작위 검색을 수행합니다. 데이터를 학습 및 테스트 세트로 분할한 후, 무작위 검색 모델을 학습시키고 최상의 하이퍼파라미터와 해당하는 평균 제곱 오차를 출력합니다. 마지막으로, 최상의 모델을 테스트 데이터에서 평가하고 테스트 평균 제곱 오차를 출력합니다.

 

베이지안 최적화(Bayesian optimization)

베이지안 최적화는 확률 모델을 사용하여 최상의 하이퍼파라미터를 선택하는 고급 기술입니다. 그리드 탐색 및 랜덤 탐색보다 효율적인 경우가 많습니다. 베이지안 최적화는 베이지안 추론을 기반으로 하는 최적화 알고리즘으로, 수학적으로 복잡하지만 효율적인 하이퍼파라미터 튜닝 기법 중 하나입니다. 이 방법은 하이퍼파라미터 공간에서 함수 값을 최소화하는 하이퍼파라미터 조합을 찾는 것입니다. 이를 위해 모델의 성능을 평가하고 이전에 추적된 결과와 함께 확률 모델을 업데이트합니다. 베이지안 최적화는 Grid Search 및 Random Search보다 더 효율적으로 하이퍼파라미터를 탐색할 수 있습니다.

from prophet import Prophet
from prophet.diagnostics import performance_metrics
from skopt import BayesSearchCV
from skopt.space import Real, Integer, Categorical
from sklearn.model_selection import TimeSeriesSplit

# Load time series data
df = pd.read_csv('time_series_data.csv')

# Define parameter search space
param_space = {
    'changepoint_prior_scale': Real(0.001, 0.5, prior='log-uniform'),
    'seasonality_prior_scale': Real(0.001, 0.5, prior='log-uniform'),
    'n_changepoints': Integer(10, 25),
    'seasonality_mode': Categorical(['additive', 'multiplicative'])
}

# Define time series cross-validation strategy
tscv = TimeSeriesSplit(n_splits=3)

# Define Bayesian optimization algorithm
bayes_cv = BayesSearchCV(
    Prophet(),
    param_distributions=param_space,
    cv=tscv,
    n_iter=10,
    random_state=42
)

# Fit the model using Bayesian optimization
bayes_cv.fit(df)

# Print the best hyperparameters and corresponding score
print("Best hyperparameters: ", bayes_cv.best_params_)
print("Best score: ", -bayes_cv.best_score_) # negative because the optimization maximizes the negative MAE

# Evaluate the model using performance metrics
prophet_model = bayes_cv.best_estimator_
future = prophet_model.make_future_dataframe(periods=365)
forecast = prophet_model.predict(future)
df_cv = performance_metrics(df_cv)
print(df_cv.head())

이 코드에서는 skopt 라이브러리의 BayesSearchCV 함수를 사용하여 베이지안 최적화를 수행합니다. 우리는 매개변수 검색 공간과 시계열 교차 검증 전략을 정의하고, 이들을 Prophet 모델과 함께 BayesSearchCV 함수에 전달합니다. n_iter를 10으로 설정하여 알고리즘이 10개의 다른 하이퍼파라미터 조합을 평가하도록합니다. 최적화가 완료되면 최상의 하이퍼파라미터와 해당 점수를 인쇄하고 성능 지표를 사용하여 모델을 평가합니다.

 

수동 튜닝(Manual tuning)

수동 튜닝에서는 사용자가 자신의 지식과 경험에 따라 하이퍼파라미터를 수동으로 선택합니다.

from prophet import Prophet
import pandas as pd

# Load data
df = pd.read_csv('time_series_data.csv')

# Initialize Prophet model with default hyperparameters
model = Prophet()

# Set manually chosen hyperparameters
model.growth = 'logistic'
model.changepoint_prior_scale = 0.05
model.n_changepoints = 50

# Fit model to data
model.fit(df)

# Make predictions
future = model.make_future_dataframe(periods=365)
forecast = model.predict(future)

# Plot forecast
model.plot(forecast)

이 예제에서는 Pandas DataFrame으로 시계열 데이터를 로드합니다. 그 다음으로는 기본 하이퍼파라미터로 Prophet 모델을 초기화합니다. 그 다음으로는 growth, changepoint_prior_scale 및 n_changepoints와 같은 하이퍼파라미터를 수동으로 설정합니다. 이러한 하이퍼파라미터는 도메인 지식과 실험을 기반으로 선택되었습니다. 그런 다음 모델을 데이터에 맞추고 다음 365일의 예측을 수행합니다. 마지막으로, plot 메서드를 사용하여 예측 결과를 시각화합니다.

 

결론적으로, 하이퍼파라미터 튜닝은 정확하고 신뢰할 수 있는 Prophet 모델을 구축하는 중요한 단계입니다. 하이퍼파라미터 튜닝을 위한 여러 기법이 있으며, 수동 튜닝, 그리드 탐색, 랜덤 탐색 및 베이지안 최적화 등이 있습니다.

최적의 하이퍼파라미터를 선택함으로써 모델의 성능을 최적화하고 더 나은 예측을 할 수 있습니다.

 

 

728x90
반응형

댓글