Giới Thiệu
Trong một thế giới nơi dữ liệu liên tục được tạo ra, phần lớn dữ liệu này đi kèm với dấu thời gian. Từ biến động của thị trường chứng khoán, số liệu bán hàng cho đến nhật ký máy chủ và dữ liệu khí hậu, những dòng thông tin này không chỉ đơn thuần là số liệu - chúng là một câu chuyện đang diễn ra theo thời gian. Dữ liệu loại này, được gọi là dữ liệu chuỗi thời gian, chứa đựng tiềm năng to lớn cho những ai biết cách lắng nghe câu chuyện của nó. Nhưng chuỗi thời gian thực chất là gì và tại sao phân tích nó lại quan trọng?
Phân tích chuỗi thời gian là quá trình xem xét và mô hình hóa dữ liệu chuỗi thời gian nhằm trích xuất các thống kê và đặc điểm có ý nghĩa. Khác với một bảng tính đơn giản, một chuỗi thời gian có thứ tự tự nhiên, nơi mỗi điểm dữ liệu phụ thuộc vào các điểm trước đó. Sự phụ thuộc này cho phép chúng ta không chỉ hiểu các mô hình trong quá khứ mà còn dự đoán các xu hướng trong tương lai. Bằng cách thành thạo nghệ thuật phân tích chuỗi thời gian, bạn có thể chuyển từ tư duy phản ứng sang tư duy chủ động, dự đoán điều gì sẽ xảy ra tiếp theo và đưa ra quyết định thông minh hơn.
Một sự phát triển quan trọng trong lĩnh vực phân tích chuỗi thời gian đến từ IBM, công ty này đang đề xuất sử dụng Mô Hình Chuỗi Thời Gian Cơ Sở (TSFM) dưới cái tên IBM Granite. Những mô hình được huấn luyện trước này được thiết kế để xử lý dữ liệu chuỗi thời gian đa dạng, và chúng sẵn sàng cách mạng hóa cách chúng ta tiếp cận việc dự đoán. Sức mạnh của những mô hình này nằm ở khả năng thực hiện dự đoán không cần huấn luyện (zero-shot) và ít huấn luyện (few-shot), có nghĩa là chúng có thể tạo ra những dự đoán ấn tượng trên các tập dữ liệu mới mà không cần hoặc chỉ cần rất ít huấn luyện bổ sung. Đây là một bước đột phá cho các doanh nghiệp thường có dữ liệu lịch sử hạn chế cho một sản phẩm hoặc sự kiện cụ thể. Để làm cho công nghệ này trở nên dễ tiếp cận, IBM đã cung cấp các sổ tay công cộng, tiện ích và các thành phần phục vụ để làm việc với các TSFM, cho phép các nhà khoa học dữ liệu và lập trình viên nhanh chóng tích hợp những công cụ mạnh mẽ này vào quy trình làm việc của họ. Cách tiếp cận mở này thúc đẩy đổi mới và giúp khả năng dự đoán tiên tiến trở nên dễ tiếp cận hơn với một lượng lớn đối tượng.
Các Bước Thử Nghiệm
Đây là giai đoạn thứ hai trong quá trình thử nghiệm với Mô Hình Chuỗi Thời Gian Cơ Sở (TSFM) của IBM Granite cho dự án hiện tại của tôi. Để chuẩn bị môi trường làm việc cục bộ, tôi đã tận dụng kho GitHub công khai mà IBM cung cấp. Dưới đây là các bước tôi đã thực hiện để cài đặt các tệp và thư viện cần thiết để bắt đầu thử nghiệm này.
bash
git clone "https://github.com/ibm-granite/granite-tsfm.git"
cd granite-tsfm
# chuẩn bị môi trường
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
# cài đặt các gói Granite
pip install ".[notebooks]"
pip install ".[demos]"
# cài đặt các gói Jupyter Notebook
pip install jupyter
pip install notebook
pip install jupyterlab
Khi đã sao chép kho GitHub, để thử nghiệm hoặc chạy một sổ tay (nếu bạn đã sao chép kho này);
bash
cd xxxx/granite-tsfm/notebooks/hfdemo
# khởi động jupyter
jupyter lab
Từ đây, bạn có thể chạy bất kỳ sổ tay mẫu nào mà đã được cung cấp.
python
# Bắt đầu với Dự Đoán Rolling của TinyTimeMixer (TTM)
Sổ tay này minh họa việc sử dụng mô hình `TinyTimeMixer` đã được huấn luyện trước hoặc tinh chỉnh để thực hiện dự đoán rolling.
Trong ví dụ này, chúng ta sẽ sử dụng mô hình TTM-512-96 đã được huấn luyện trước. Điều này có nghĩa là mô hình TTM có thể nhận đầu vào 512 điểm thời gian (`context_length`) và có thể dự đoán lên tới 96 điểm thời gian (`forecast_length`) trong tương lai. Chúng ta sau đó sẽ thực hiện các dự đoán rolling với mô hình này để tiếp tục dự đoán cho các độ dài dự đoán lâu hơn.
Các mô hình TTM đã được huấn luyện trước sẽ được lấy từ [Hugging Face TTM Model Repository](https://huggingface.co/ibm-granite/granite-timeseries-ttm-v1). Chúng ta cũng sẽ tinh chỉnh một mô hình và sử dụng mô hình đã tinh chỉnh cho cùng một dự đoán rolling.
import os
import tempfile
from transformers import Trainer, TrainingArguments, set_seed
from tsfm_public import TinyTimeMixerForPrediction, load_dataset
from tsfm_public.toolkit import RecursivePredictor, RecursivePredictorConfig
from tsfm_public.toolkit.visualization import plot_predictions
### Các tham số quan trọng
# Đặt seed cho khả năng tái lập
SEED = 42
set_seed(SEED)
# ĐƯỜNG DẪN DỮ LIỆU GỐC
# Đảm bảo tải dữ liệu mục tiêu (ở đây là ettm2) vào thư mục `DATA_ROOT_PATH`.
# ETT có sẵn tại: https://github.com/zhouhaoyi/ETDataset/tree/main
target_dataset = "etth1"
dataset_path = "https://raw.githubusercontent.com/zhouhaoyi/ETDataset/main/ETT-small/ETTh1.csv"
# DATA_ROOT_PATH = "/dccstor/tsfm23/datasets/"
# Thư mục kết quả
OUT_DIR = "ttm_finetuned_models/"
# Nhánh mô hình TTM
# Sử dụng main cho mô hình 512-96
# Sử dụng "1024_96_v1" cho mô hình 1024-96
TTM_MODEL_REVISION = "main"
ROLLING_PREDICTION_LENGTH = 192
TTM_MODEL_URL = (
"ibm-granite/granite-timeseries-ttm-v1" # CHỈ ĐỊNH MÔ HÌNH ZEROSHOT HOẶC MÔ HÌNH ĐÃ TINH CHỈNH ĐỂ THỰC HIỆN DỰ ĐOÁN ROLLING.
)
## TẢI MÔ HÌNH CƠ BẢN
base_model = TinyTimeMixerForPrediction.from_pretrained(TTM_MODEL_URL, revision=TTM_MODEL_REVISION)
base_model_context_length = base_model.config.context_length
base_model_prediction_length = base_model.config.prediction_length
print(base_model_context_length, base_model_prediction_length)
## TẢI DỮ LIỆU
_, _, dset_test = load_dataset(
dataset_name=target_dataset,
context_length=base_model_context_length,
forecast_length=ROLLING_PREDICTION_LENGTH,
fewshot_fraction=1.0,
dataset_path=dataset_path,
)
## DỰ ĐOÁN ROLLING
rec_config = RecursivePredictorConfig(
model=base_model,
requested_prediction_length=ROLLING_PREDICTION_LENGTH,
model_prediction_length=base_model_prediction_length,
loss=base_model.config.loss,
)
rolling_model = RecursivePredictor(rec_config)
temp_dir = tempfile.mkdtemp()
# huấn luyện zeroshot
zeroshot_trainer = Trainer(
model=rolling_model,
args=TrainingArguments(
output_dir=temp_dir,
per_device_eval_batch_size=32,
seed=SEED,
),
)
# đánh giá = hiệu suất zero-shot
print("+" * 20, "Test MSE zero-shot", "+" * 20)
zeroshot_output = zeroshot_trainer.evaluate(dset_test)
print(zeroshot_output)
plot_predictions(
model=zeroshot_trainer.model,
dset=dset_test,
plot_dir=os.path.join(OUT_DIR, target_dataset),
plot_prefix="test_rolling",
indices=[685, 118, 902, 1984, 894, 967, 304, 57, 265, 1015],
channel=0,
)
Kết Luận
Sự ra đời của các mô hình như Mô Hình Chuỗi Thời Gian Cơ Sở của IBM Granite đại diện cho một bước nhảy vọt khổng lồ trong cách chúng ta tiếp cận dự đoán. Đây không chỉ là những cải tiến dần dần; chúng là một sự thay đổi cơ bản, cho phép chúng ta chuyển từ việc mô hình hóa khó khăn, đặc thù cho từng tập dữ liệu sang việc tận dụng sức mạnh lớn từ các mô hình đã được huấn luyện với nỗ lực tối thiểu. Điều thú vị nhất là công nghệ này không bị khóa trong một phòng thí nghiệm. Với kho GitHub công cộng và cuốn Sổ Tay Thời Gian Granite, khả năng tiên tiến này giờ đây nằm trong tầm tay của các nhà phát triển và nhà khoa học dữ liệu khắp nơi, dân chủ hóa quyền truy cập vào một kỷ nguyên phân tích dự đoán mới.
Thực Hành Tốt Nhất
- Lên kế hoạch cho dữ liệu: Trước khi bắt đầu phân tích chuỗi thời gian, hãy đảm bảo dữ liệu của bạn sạch và có cấu trúc. Kiểm tra các giá trị khuyết, sai số trong dữ liệu.
- Chọn mô hình phù hợp: Sử dụng mô hình phù hợp với loại dữ liệu và mục tiêu dự đoán của bạn. Nếu dữ liệu ít, hãy thử các mô hình đơn giản trước.
Những Cạm Bẫy Thường Gặp
- Quá khớp (Overfitting): Khi mô hình học quá nhiều từ dữ liệu huấn luyện, dẫn đến hiệu suất kém trên dữ liệu mới. Để ngăn chặn, hãy sử dụng kĩ thuật như chia tách dữ liệu hoặc sử dụng regularization.
- Thiếu dữ liệu: Nếu dữ liệu không đầy đủ, dự đoán có thể không chính xác. Nên thu thập thêm dữ liệu nếu có thể.
Mẹo Tối Ưu Hiệu Suất
- Cải thiện tốc độ xử lý: Sử dụng các thư viện tối ưu hóa như NumPy hoặc Pandas để tăng tốc độ xử lý dữ liệu.
- Thực hiện dự đoán theo lô: Nếu có thể, hãy thực hiện dự đoán cho nhiều điểm dữ liệu cùng một lúc để tiết kiệm thời gian.
Giải Quyết Sự Cố
- Kiểm tra lỗi dữ liệu: Nếu mô hình không hoạt động như mong đợi, hãy kiểm tra xem có lỗi nào trong dữ liệu không. Ví dụ, các giá trị không hợp lệ có thể gây ra vấn đề trong dự đoán.
- Xem nhật ký: Sử dụng các công cụ theo dõi như TensorBoard để xem mô hình của bạn hoạt động như thế nào qua thời gian và điều chỉnh nếu cần.
Câu Hỏi Thường Gặp (FAQ)
1. Chuỗi thời gian là gì?
Chuỗi thời gian là một tập hợp các điểm dữ liệu được ghi lại theo thứ tự thời gian, thường được sử dụng để phân tích xu hướng và dự đoán tương lai.
2. Tại sao phân tích chuỗi thời gian lại quan trọng?
Nó giúp chúng ta hiểu rõ hơn về các mẫu trong dữ liệu và dự đoán các xu hướng trong tương lai, từ đó đưa ra quyết định thông minh hơn.
3. Tôi có thể sử dụng mô hình nào cho chuỗi thời gian?
Có nhiều mô hình khác nhau như ARIMA, LSTM, và các mô hình cơ sở như TSFM của IBM Granite, tùy thuộc vào loại dữ liệu và yêu cầu của bạn.