1. 예측 모델 선정
가. HuggingFace에서 오픈 소스 모델 찾기

해당 사이트에서 개발자들이 올려놓은 다양한 모델을 활용할 수 있는데, 우리는 다양한 함수식으로
이루어진 모델을 편하게 가져다 사용할 수 있다.

예측 모델 중에서 가장 다운로드 수가 많은 모델은 Amazon 사에서 개발한 모델이 제일 인기가 좋다.

위 사진은 Amazon사에서 개발한 Chronos의 기본 원리이다. 하지만 우리는 원리는 뒤로하고 사용해보자.
나. Colab으로 모델 가져오기
pip install git+https://github.com/amazon-science/chronos-forecasting.git
모델은 pip 명령어로 불러올 수 있으며, github에서 가져왔다.
사실 밑에 코드 처럼 HuggingFace에서 불러오는 방법도 있다.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
tokenizer = AutoTokenizer.from_pretrained("amazon/chronos-t5-tiny")
model = AutoModelForSeq2SeqLM.from_pretrained("amazon/chronos-t5-tiny")
모델을 불러 왔으면, 기본적인 설정을 해야한다.
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import torch
from chronos import ChronosPipeline
pipeline = ChronosPipeline.from_pretrained(
"amazon/chronos-t5-base",
device_map="cuda",
torch_dtype=torch.bfloat16,
)
import는 기본적으로 파이썬을 사용한 사람이라면 아는 라이브러리 호출 함수이다.
여기서 필요한 라이브러리를 호출하여 사용할 수 있다.
device_map은 어떤 자원을 사용해서 모델을 실행할 것인지 정하는 것이다.
Cuda는 GPU자원을 말하는 것이다.
torch_dtype은 Pytorch에서 텐서의 데이터유형을 정하는 부분으로 총 7가지가 있다.
1. torch.float32 (또는 torch.float)
- 32비트 부동 소수점 숫자입니다.
- 대부분의 딥러닝 모델에서 기본적으로 사용하는 데이터 유형입니다.
- 높은 정밀도를 제공하지만, 메모리 사용량이 큽니다.
2. torch.float64 (또는 torch.double)
- 64비트 부동 소수점 숫자입니다.
- 매우 높은 정밀도를 제공하지만, 메모리 사용량과 계산 속도 면에서 비효율적입니다.
주로 과학 계산이나 높은 정밀도가 필요한 상황에서 사용됩니다.
3. torch.float16 (또는 torch.half)
- 16비트 부동 소수점 숫자입니다.
- 메모리 사용량이 절반으로 줄고, 최신 GPU에서 연산 속도를 크게 향상시킬 수 있습니다. 하지만 낮은 정밀도로 인해 수치적 불안정성이 발생할 수 있습니다.
4. torch.bfloat16
- 16비트 부동 소수점의 변형입니다.
메모리 사용량을 줄이면서도 더 나은 수치적 안정성을 제공합니다.
5. torch.int32
- 32비트 정수형입니다. 정수 데이터를 다룰 때 사용됩니다.
6. torch.int64 (또는 torch.long)
- 64비트 정수형입니다. 큰 범위의 정수를 처리할 때 사용됩니다.
7. torch.bool
- 불리언(True/False) 데이터를 저장하는 데 사용됩니다.
다. 교통사고 예측하기
우선 데이터를 확보해야 합니다. 저는 주로 공공데이터포털을 사용합니다.

df = pd.read_csv("/content/교통사고 통계.csv", encoding="cp949")
1. 필요한 모듈 및 데이터 설정
import matplotlib.ticker as mticker
context = torch.tensor(df["사망"])
context2 = torch.tensor(df["부상"])
- matplotlib.ticker는 그래프의 축을 포맷팅하는 데 사용됩니다. 축에 표시되는 값의 형식을 조정하기 위한 모듈입니다.
- torch.tensor(df["사망"]): df["사망"]과 df["부상"]의 데이터가 텐서로 변환됩니다. 이 데이터는 예측을 위한 입력 데이터로 사용됩니다. 여기서 df는 데이터프레임으로, "사망"과 "부상"이라는 두 열을 가지고 있습니다.
2. 예측 수행
prediction_length = 10
forecast = pipeline.predict(context, prediction_length)
forecast2 = pipeline.predict(context2, prediction_length)
- prediction_length = 10: 예측할 미래 데이터의 길이를 10으로 설정합니다. 즉, 향후 10개의 데이터 포인트를 예측합니다.
- pipeline.predict(context, prediction_length): context 데이터를 기반으로 예측을 수행합니다. pipeline은 학습된 예측 모델이고, 그 모델이 context라는 입력 데이터를 바탕으로 prediction_length만큼의 미래 데이터를 예측합니다. 예측 결과는 다차원 배열로, num_series (시계열 개수), num_samples (샘플 수), prediction_length로 구성된 3차원 배열입니다.
- 동일하게, context2 데이터에 대해서도 같은 방식으로 예측이 수행됩니다.
3. 예측 결과 처리
forecast_index = range(len(df), len(df) + prediction_length)
low, median, high = np.quantile(forecast[0].numpy(), [0.1, 0.5, 0.9], axis=0)
forecast2_index = range(len(df), len(df) + prediction_length)
low2, median2, high2 = np.quantile(forecast2[0].numpy(), [0.1, 0.5, 0.9], axis=0)
- forecast_index 및 forecast2_index는 예측 결과가 시작될 인덱스를 정의합니다. 예측은 기존 데이터의 길이 이후에 시작되므로 range(len(df), len(df) + prediction_length)로 설정됩니다.
- np.quantile(forecast[0].numpy(), [0.1, 0.5, 0.9], axis=0)는 예측된 데이터에서 10%, 50%, 90%에 해당하는 분위수를 계산합니다. 즉, 예측 불확실성 범위(낮음, 중간, 높음)를 계산하여 시각화할 때 사용됩니다.
- low: 10% 분위수
- median: 50% 분위수 (중앙값)
- high: 90% 분위수
- 동일한 방식으로 forecast2에 대해서도 low2, median2, high2를 계산합니다.
4. 그래프 시각화
plt.figure(figsize=(10, 4))
plt.gca().yaxis.set_major_formatter(mticker.FormatStrFormatter('%.0f people'))
plt.gca().xaxis.set_major_formatter(mticker.FormatStrFormatter('%.0f year'))
plt.plot(df["사망"], color="royalblue", label="death data")
plt.plot(df["부상"], color="green", label="injure data")
plt.plot(forecast_index, median, color="tomato", label="predict death")
plt.plot(forecast2_index, median2, color="orange", label="predict injure")
plt.fill_between(forecast_index, low, high, color="tomato", alpha=0.3)
plt.fill_between(forecast2_index, low2, high2, color="orange", alpha=0.3)
plt.legend()
plt.grid()
plt.show()
- plt.figure(figsize=(10, 4)): 그래프의 크기를 설정합니다. 가로 10인치, 세로 4인치로 설정되었습니다.
- yaxis.set_major_formatter(mticker.FormatStrFormatter('%.0f people')): y축 값을 정수로 포맷팅하며, "people" 단위를 추가합니다.
- xaxis.set_major_formatter(mticker.FormatStrFormatter('%.0f year')): x축 값을 정수로 포맷팅하며, "year" 단위를 추가합니다.
- plt.plot(df["사망"], color="royalblue", label="death data"): 기존 "사망" 데이터를 파란색 선으로 그래프에 표시합니다.
- plt.plot(df["부상"], color="green", label="injure data"): 기존 "부상" 데이터를 초록색 선으로 그래프에 표시합니다.
- plt.plot(forecast_index, median, color="tomato", label="predict death"): 예측된 "사망" 데이터의 중앙값을 빨간색 선으로 표시합니다.
- plt.plot(forecast2_index, median2, color="orange", label="predict injure"): 예측된 "부상" 데이터의 중앙값을 주황색 선으로 표시합니다.
- plt.fill_between(forecast_index, low, high, color="tomato", alpha=0.3): 예측된 "사망" 데이터의 불확실성 범위(10%~90%)를 빨간색으로 채웁니다.
- plt.fill_between(forecast2_index, low2, high2, color="orange", alpha=0.3): 예측된 "부상" 데이터의 불확실성 범위(10%~90%)를 주황색으로 채웁니다.
- plt.legend(): 범례를 표시합니다.
- plt.grid(): 그리드를 추가합니다.
- plt.show(): 그래프를 화면에 표시합니다.

실제 결과와 대조하여 예측 모델의 성과를 비교하는 작업을 거쳐서,
모델의 성능이 좋지 않다면 학습을 해야합니다.
다음은 학습을 하는 과정을 포스팅하겠습니다.
댓글