Hồi quy KNN cho chuỗi thời gian với sktime trong python

K-Nearest Neighbors Time Series Regressor là một thuật toán học máy mạnh mẽ, tận dụng khái niệm về sự gần gũi giữa các điểm dữ liệu để dự đoán các giá trị tương lai dựa trên dữ liệu lịch sử. Bằng cách xem xét ‘k’ ví dụ huấn luyện gần nhất trong không gian đặc trưng, thuật toán này xác định hiểu quả các mẫu và xu hướng theo thời gian. Cách tiếp cận này đặc biệt hữu ích trong các trường hợp dữ liệu có sự tương quan theo thời gian, cho phép dự báo chính xác trong các ứng dụng khác nhau như tài chính, dự báo thời tiết, và quản lý tồn kho. Là một phương pháp phi tham số, KNN không giả định bất kỳ phân phối nào, nhờ đó cung cấp sự linh hoạt trong việc mô hình hóa các tập dữ liệu phức tạp mà vẫn dễ dàng triển khai và hiểu. Khi điều chỉnh tham số ‘k’ một cách phù hợp, người dùng có thể đạt được sự cân bằng giữa độ nhạy với nhiễu và độ thiên lệch trong dự đoán, từ đó cải thiện hiệu suất tổng thể của mô hình hồi quy.

Thuật toán hồi quy K-Nearest Neighbors (KNN) được biết đến hiệu quả trong các tình huống mà mối quan hệ giữa các đặc trưng và biến mục tiêu là phi tuyến tính và phức tạp. Nó hoạt động tốt khi dữ liệu mang tính cạnh bậc cao, nghĩa là các điểm dữ liệu tương tự thường có giá trị mục tiêu tương tự. Điều này làm cho KNN trở nên phù hợp với các tập dữ liệu mà giá trị mục tiêu có thể được xếp hạng bằng cách lấy trung bình giá trị của các điểm lân cận gần nhất.

Ngoài ra, KNN rất hữu ích khi bạn làm việc với tập dữ liệu có kích thước nhỏ đến trung bình, vì nó không yêu cầu thời gian huấn luyện lớn như một số thuật toán khác. Đây cũng là lựa chọn phù hợp khi bạn cần một mô hình đơn giản và dễ hiểu, vì nó không đòi hỏi các phép biến đổi phức tạp hoặc dự đoán về phân phối dữ liệu.

Tuy nhiên, KNN có thể gặp khó khăn với dữ liệu có số chiều cao do “lời nguyên số chiều” (curse of dimensionality), và nó có thể hoạt động kém nếu dữ liệu có nhiều thuộc tính không liên quan. Bên cạnh đó, KNN cũng tiêu tốn nhiều tài nguyên tính toán cho các tập dữ liệu lớn vì nó cần tính toán khoảng cách giữa các điểm dữ liệu.

Hồi quy KNN với sktime trong python

Chúng ta sẽ sử dụng bộ dữ liệu arrow head. Tập dữ liệu ArrowHead là một tập dữ liệu phân loại chuỗi thời gian bao gồm các biến thể của hình dạng đầu mũi tên. Các hình dạng của những mũi tên này được chuyển đổi thành dữ liệu chuỗi thời gian bằng phương pháp dựa trên góc.

1. Import các thư viện cần thiết

from sktime.datasets import load_arrow_head
from sktime.regression.distance_based import KNeighborsTimeSeriesRegressor
from sklearn.metrics import mean_squared_error
  • load_arrow_head: Hàm để tải tập dữ liệu ArrowHead từ thư viện sktime. Đây là một tập dữ liệu phân loại chuỗi thời gian được sử dụng trong các tác vụ liên quan đến dữ liệu chuỗi thời gian.
  • KNeighborsTimeSeriesRegressor: Bộ hồi quy (regressor) sử dụng phương pháp hàng xóm gần nhất (k-nearest neighbors), được thiết kế dành riêng cho dữ liệu chuỗi thời gian.
  • mean_squared_error: Hàm từ thư viện sklearn để tính MSE (Mean Squared Error) – một thước đo đánh giá mức độ chênh lệch giữa giá trị thực (y_test) và giá trị dự đoán (y_pred).

2. Nhập arrow_head

X_train, y_train = load_arrow_head(split="train", return_X_y=True)
X_test, y_test = load_arrow_head(split="test", return_X_y=True)
  • load_arrow_head: Chia t?p d? li?u thành ph?n hu?n luy?n (train) và ki?m tra (test).
    • X_trainX_test: T?p h?p các chu?i th?i gian.
    • y_trainy_test: Nhãn m?c tiêu t??ng ?ng.
  • return_X_y=True: Tr? v? d? li?u và nhãn d??i d?ng hai bi?n riêng bi?t.

3. Chuyển đổi nhãn thành số thực

y_train = y_train.astype("float")
y_test = y_test.astype("float")
  • Chuyển đổi các nhãn trong tập dữ liệu thành kiểu float. Điều này cần thiết cho các mô hình hồi quy vì chúng yêu cầu nhãn mục tiêu là số thực thay vì phân loại.

4. Kh?i t?o và hu?n luy?n mô hình

regressor = KNeighborsTimeSeriesRegressor()
regressor.fit(X_train, y_train)
  • KNeighborsTimeSeriesRegressor(): Khởi tạo bộ hồi quy K-Nearest Neighbors dành cho dữ liệu chuỗi thời gian.
  • fit(X_train, y_train): Huấn luyện mô hình trên dữ liệu huấn luyện.

5. Dự đoán và đánh giá

y_pred = regressor.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
  • predict(X_test): Sử dụng mô hình đã huấn luyện để dự đoán các giá trị nhãn mục tiêu trên tập kiểm tra.
  • mean_squared_error(y_test, y_pred): Tính toán lỗi trung bình bình phương giữa giá trị thực (y_test) và giá trị dự đoán (y_pred).
  • Kết quả: In ra MSE – một chỉ số đo lường độ chính xác của mô hình.

Ý nghĩa chính của hồi quy KNN cho chuỗi thời gian

Mô hình KNeighborsTimeSeriesRegressor là một phương pháp hữu ích để xây dựng dự báo dựa trên dữ liệu chuỗi thời gian. Các bước chính để triển khai bao gồm:

  1. Tải dữ liệu – sử dụng tập dữ liệu ArrowHead, một tập dữ liệu chuỗi thời gian giúp phân loại hình dạng mũi tên.
  2. Huấn luyện mô hình – áp dụng thuật toán KNN hồi quy để học từ các mẫu dữ liệu quá khứ.
  3. Dự đoán trên tập kiểm tra – sử dụng mô hình đã huấn luyện để đưa ra dự báo cho dữ liệu mới.
  4. Đánh giá hiệu suất – đo lường độ chính xác bằng chỉ số Mean Squared Error (MSE), giúp hiểu mức độ sai số trong dự báo.

📝 Mô hình này đặc biệt phù hợp với dữ liệu chuỗi thời gian do khả năng tận dụng khoảng cách giữa các chuỗi làm thước đo tương tự. Khi điều chỉnh số lượng hàng xóm ( k ), có thể tối ưu hóa độ chính xác, cân bằng giữa nhiễu và độ lệch trong dự báo.

toàn bộ code (click để tải):

from sktime.datasets import load_arrow_head
from sktime.regression.distance_based import KNeighborsTimeSeriesRegressor
from sklearn.metrics import mean_squared_error
# T?i t?p d? li?u arrow head
X_train, y_train = load_arrow_head(split="train", return_X_y=True)
X_test, y_test = load_arrow_head(split="test", return_X_y=True)
# ??m b?o các bi?n m?c tiêu là s? th?c (n?u c?n)
y_train = y_train.astype("float")
y_test = y_test.astype("float")
# Kh?i t?o và hu?n luy?n KNeighborsTimeSeriesRegressor
regressor = KNeighborsTimeSeriesRegressor()
regressor.fit(X_train, y_train)
# D? ?oán và ?ánh giá
y_pred = regressor.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")


Discover more from Science Comics

Subscribe to get the latest posts sent to your email.

Leave a Reply

error: Content is protected !!