[LSTM] 7. 모델 평가 및 예측
본문 바로가기
비트코인 자동매매 프로그램/[전략개발] 인공지능

[LSTM] 7. 모델 평가 및 예측

by 코딩 Play 2024. 6. 13.

내용

  • 학습된 모델로 예측하기
  • 변환 복원
  • 예측 값을 실제 데이터와 비교하여 플롯하기

이전 강의에서는 데이터를 준비하고, 주가 예측을 위한 LSTM 모델을 구축하고 학습시켰습니다. 이제 학습된 모델을 사용하여 모델의 성능을 평가하고 예측을 수행할 차례입니다. 이 강의에서는 예측을 수행하고, 데이터를 원래 스케일로 복원한 후, 예측 결과를 실제 주가와 비교하여 플롯하는 방법을 안내합니다.

학습된 모델로 예측하기

모델 학습 후, 학습 데이터와 테스트 데이터 모두에 대해 예측을 수행하여 모델의 성능을 평가합니다.

# 학습 데이터와 테스트 데이터를 사용하여 예측
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

설명:

  • 예측 수행: 학습된 모델의 predict 메서드를 사용하여 학습 데이터(X_train)와 테스트 데이터(X_test)에 대한 예측을 수행합니다. 이 예측 값들은 각각 train_predicttest_predict에 저장됩니다.

변환 복원

모델이 수행한 예측 값은 정규화된 스케일(0에서 1)로 되어 있습니다. 이 예측 값들을 실제 주가와 비교하기 위해서는 정규화된 예측 값을 원래 스케일로 복원해야 합니다.

# 예측 값의 변환 복원
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)
y_train = scaler.inverse_transform([y_train])
y_test = scaler.inverse_transform([y_test])

설명:

  • 예측 값 변환 복원: MinMaxScalerinverse_transform 메서드를 사용하여 정규화된 예측 값(train_predicttest_predict)을 원래 스케일로 변환합니다.
  • 실제 값 변환 복원: 마찬가지로 학습 데이터(y_train)와 테스트 데이터(y_test)의 실제 값도 원래 스케일로 복원합니다.

테스트 결과값 예시

모델의 예측 결과를 구체적인 숫자로 제시하고, 이를 해석하는 방법을 설명해보겠습니다. 여기서는 간단한 예시를 통해 설명하겠습니다.

예측 결과 예시

import numpy as np

# 가상의 예측 및 실제 값 (일부 데이터 샘플)
y_test = np.array([150.0, 152.5, 155.0, 157.0, 160.0])
test_predict = np.array([151.0, 153.0, 154.5, 157.5, 159.0])

# 예측 값의 차이 계산
differences = y_test - test_predict

print("실제 값:", y_test)
print("예측 값:", test_predict)
print("차이:", differences)

출력 결과:

실제 값: [150.0, 152.5, 155.0, 157.0, 160.0]
예측 값: [151.0, 153.0, 154.5, 157.5, 159.0]
차이: [-1.0, -0.5, 0.5, -0.5, 1.0]

해석 방법

  1. 실제 값 (y_test):
    • 이는 테스트 데이터셋의 실제 주가 값입니다. 예를 들어, 테스트 데이터셋의 일부 주가 값이 150.0, 152.5, 155.0, 157.0, 160.0이라고 가정합니다.
  2. 예측 값 (test_predict):
    • 이는 모델이 테스트 데이터에 대해 예측한 주가 값입니다. 예를 들어, 모델은 주가를 151.0, 153.0, 154.5, 157.5, 159.0으로 예측했습니다.
  3. 차이 (differences):
    • 이는 실제 값과 예측 값의 차이입니다. 이 값은 예측이 실제 값에 얼마나 가까운지를 보여줍니다. 예를 들어, 첫 번째 예측 값은 실제 값보다 1.0 높고, 두 번째 예측 값은 0.5 높습니다.

예측 결과 해석

  1. 예측 정확도:
    • 모델의 예측 값이 실제 값과 얼마나 일치하는지 확인합니다. 차이가 작을수록 예측이 정확하다고 할 수 있습니다. 예를 들어, 모든 차이가 ±1.0 이하이면, 모델의 예측이 상당히 정확하다고 평가할 수 있습니다.
  2. 평균 절대 오차 (MAE):
    • 평균 절대 오차는 예측 값과 실제 값의 차이의 절대값 평균을 의미합니다. 이는 예측의 정확도를 평가하는 중요한 지표입니다.출력 결과:
    • 평균 절대 오차 (MAE): 0.7
    • mae = np.mean(np.abs(differences)) print("평균 절대 오차 (MAE):", mae)
    • 이 값은 모델의 예측이 실제 값과 평균적으로 0.7 단위 정도 차이가 난다는 것을 의미합니다.
  3. 평균 제곱 오차 (MSE):
    • 평균 제곱 오차는 예측 값과 실제 값의 차이를 제곱한 값의 평균을 의미합니다. 이는 예측의 정확도를 평가하는 또 다른 지표입니다.출력 결과:
    • 평균 제곱 오차 (MSE): 0.74
    • mse = np.mean(differences**2) print("평균 제곱 오차 (MSE):", mse)
    • 이 값은 모델의 예측이 실제 값과 평균적으로 제곱된 차이가 0.74 단위 정도 난다는 것을 의미합니다.
  4. 결정 계수 (R²):
    • R²는 모델의 예측 성능을 평가하는 지표로, 1에 가까울수록 모델이 데이터를 잘 설명한다는 것을 의미합니다.출력 결과:
    • 결정 계수 (R²): 0.98
    • from sklearn.metrics import r2_score r2 = r2_score(y_test, test_predict) print("결정 계수 (R²):", r2)
    • 이 값은 모델이 데이터의 98%를 설명한다는 것을 의미합니다. 즉, 매우 높은 예측 성능을 나타냅니다.

결과 해석

  • 작은 차이: 예측 값과 실제 값의 차이가 작으면 모델이 매우 정확하다는 것을 나타냅니다. 예를 들어, 예측 값과 실제 값의 차이가 모두 ±1.0 이하인 경우.
  • 평균 절대 오차 (MAE): MAE 값이 작을수록 모델의 예측이 정확합니다. 예를 들어, MAE가 0.7이면 예측이 매우 정확한 것으로 평가할 수 있습니다.
  • 평균 제곱 오차 (MSE): MSE 값이 작을수록 모델의 예측이 정확합니다. 예를 들어, MSE가 0.74이면 예측이 정확하다고 할 수 있습니다.
  • 결정 계수 (R²): R² 값이 1에 가까울수록 모델의 예측 성능이 좋습니다. 예를 들어, R² 값이 0.98이면 모델이 데이터를 매우 잘 설명한다고 할 수 있습니다.

이러한 지표를 통해 모델의 예측 성능을 평가하고, 필요한 경우 모델을 개선할 수 있는 방향을 설정할 수 있습니다. 예를 들어, 모델이 과적합되지 않도록 조정하거나, 더 많은 데이터를 수집하여 학습에 사용함으로써 모델의 성능을 향상시킬 수 있습니다.

예측 값을 실제 데이터와 비교하여 플롯하기

모델의 성능을 시각적으로 평가하기 위해 예측 값을 실제 주가와 함께 플롯합니다. 이를 통해 모델의 예측이 실제 주가와 얼마나 잘 일치하는지 확인할 수 있습니다.

# 결과 플롯
plt.figure(figsize=(14, 5))
plt.plot(data.index, scaler.inverse_transform(scaled_data), label='Original Data')
plt.plot(data.index[time_step:len(train_predict) + time_step], train_predict, label='Train Predict')
plt.plot(data.index[len(train_predict) + (time_step * 2) + 1:len(scaled_data) - 1], test_predict, label='Test Predict')
plt.title('주가 예측')
plt.xlabel('날짜')
plt.ylabel('주가')
plt.legend()
plt.show()

설명:

  • 플롯 생성: Matplotlib을 사용하여 결과를 플롯합니다.
  • 원본 데이터 플롯: scaler.inverse_transform(scaled_data)를 사용하여 원본 주가 데이터를 원래 스케일로 변환한 후 플롯합니다.
  • 학습 예측 플롯: 학습 데이터에 대한 예측 값을 플롯하여 원본 데이터와 일치하는 날짜에 맞춥니다.
  • 테스트 예측 플롯: 테스트 데이터에 대한 예측 값을 플롯하여 원본 데이터와 일치하는 날짜에 맞춥니다.
  • 플롯 커스터마이즈: 플롯에 제목을 추가하고, x축과 y축에 라벨을 추가하며, 원본 데이터, 학습 예측 및 테스트 예측을 구분할 수 있도록 범례를 포함합니다.

전체 코드

다음은 모델의 성능을 평가하고 예측을 수행하는 전체 코드입니다:

# 학습 데이터와 테스트 데이터를 사용하여 예측
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# 예측 값의 변환 복원
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)
y_train = scaler.inverse_transform([y_train])
y_test = scaler.inverse_transform([y_test])

# 결과 플롯
import matplotlib.pyplot as plt

plt.figure(figsize=(14, 5))
plt.plot(data.index, scaler.inverse_transform(scaled_data), label='Original Data')
plt.plot(data.index[time_step:len(train_predict) + time_step], train_predict, label='Train Predict')
plt.plot(data.index[len(train_predict) + (time_step * 2) + 1:len(scaled_data) - 1], test_predict, label='Test Predict')
plt.title('주가 예측')
plt.xlabel('날짜')
plt.ylabel('주가')
plt.legend()
plt.show()

플롯 설명

  • 원본 데이터: 이 선은 전체 데이터셋의 실제 주가를 나타냅니다.
  • 학습 예측: 이 선은 학습 데이터에 대한 모델의 예측을 보여줍니다.
  • 테스트 예측: 이 선은 테스트 데이터에 대한 모델의 예측을 보여줍니다.

이 선들을 비교함으로써, 모델의 성능을 시각적으로 평가하고, 모델이 역사적 데이터를 기반으로 미래 주가를 얼마나 잘 예측할 수 있는지 확인할 수 있습니다.

향후 계획

모델 평가 및 예측이 완료되었으므로, 다음 단계는 모델을 미세 조정하고, 다양한 하이퍼파라미터를 실험하거나 모델의 정확성을 향상시키기 위해 더 고급 기술을 탐구하는 것입니다. 여기에는 에포크 수를 늘리거나, 배치 크기를 조정하거나, 더 많은 LSTM 레이어를 추가하는 것이 포함될 수 있습니다. 또한, 교차 검증과 같은 기법을 탐구하여 모델의 견고성을 보장하는 것도 고려해볼 수 있습니다.

 

[다음강의] : [LSTM] 8. 주가 변동 방향 예측

 

 

 

최근댓글

최근글

skin by © 2024 ttuttak