Pipeline Trích xuất Đặc trưng Chuỗi Thời gian & Đánh giá Hồi quy
Trong dự báo chuỗi thời gian (như nhu cầu tiêu thụ điện, doanh số bán hàng, lưu lượng truy cập), các mô hình học máy bảng (như Gradient Boosting hoặc Hồi quy) không thể tự động hiể…
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: shift mechanics, rolling statistics no lookahead, cyclical encoding, regression loss formulas.
Nội dung đề bài
Mục tiêu kiến thức
- Xây dựng Pipeline kỹ nghệ đặc trưng chuỗi thời gian (Feature Engineering) cho bài toán dự báo hồi quy Machine Learning.
- Triển khai các biến trễ (Lag Features) yt-k và thống kê trượt (Rolling Statistics) có cơ chế dịch chuyển
shift(1)triệt để nhằm ngăn chặn rò rỉ thông tin tương lai (Lookahead Bias). - Mã hóa chu kỳ lịch biểu (Cyclical Encoding) cho ngày trong tuần và tháng bằng phép biến đổi sin / cos.
- Tự cài đặt trọn vẹn bộ chỉ số đánh giá mô hình hồi quy: MAE, MSE, RMSE, MAPE và hệ số xác định R2.
Mô tả bài toán
Trong dự báo chuỗi thời gian (như nhu cầu tiêu thụ điện, doanh số bán hàng, lưu lượng truy cập), các mô hình học máy bảng (như Gradient Boosting hoặc Hồi quy) không thể tự động hiểu được thứ tự thời gian nếu không được cung cấp các đặc trưng trễ và xu hướng di động. Sai lầm phổ biến nhất của kỹ sư dữ liệu là tính rolling(w).mean() mà quên shift(1), khiến mô hình vô tình nhìn thấy trước đáp án của thời điểm hiện tại.
Hãy xây dựng lớp và hàm:
class TimeSeriesFeaturePipeline:
def __init__(self, lags: list[int], windows: list[int]):
...
def transform(self, df: pd.DataFrame, target_col: str, datetime_col: str = None) -> pd.DataFrame:
...
def evaluate_regression_metrics(y_true: np.ndarray, y_pred: np.ndarray) -> dict[str, float]:
...Yêu cầu chi tiết:
- Lớp
TimeSeriesFeaturePipeline: - Khởi tạo với danh sách các bước trễ
lags: list[int](lagsi ≥ 1) và các kích thước cửa sổwindows: list[int](windowsi ≥ 2). Nếu không thỏa mãn, némValueError. - Phương thức
transform(df, target_col, datetime_col): - Tạo bản sao độc lập của
df. - Với mỗi k ∈ lags: Tạo cột
f"{target_col}_lag_{k}" = df[target_col].shift(k). - Với mỗi w ∈ windows:
f"{target_col}_roll_mean_{w}" = df[target_col].shift(1).rolling(w).mean()f"{target_col}_roll_std_{w}" = df[target_col].shift(1).rolling(w).std(ddof=1)- Nếu
datetime_colđược cung cấp (chuỗi hoặc datetime): - Chuyển sang
pd.to_datetime. - Lấy ngày trong tuần
dow = dt.dayofweek(0..6): dow_sin = np.sin(2 * np.pi * dow / 7.0)dow_cos = np.cos(2 * np.pi * dow / 7.0)- Lấy tháng
month = dt.month(1..12): month_sin = np.sin(2 * np.pi * (month - 1) / 12.0)month_cos = np.cos(2 * np.pi * (month - 1) / 12.0)- Loại bỏ toàn bộ các dòng chứa
NaN(do quá trình shift và rolling sinh ra) bằngdropna(). - Reset index tuần tự (
drop=True) và trả về DataFrame đặc trưng. - Hàm
evaluate_regression_metrics(y_true, y_pred): - Ép kiểu về
np.ndarray1D float64. Nếu kích thước không khớp nhau hoặc rỗng, némValueError. - Tính toán các chỉ số:
- MAE = 1N ∑ |yi - yi|
- MSE = 1N ∑ (yi - yi)2
- RMSE = √(MSE)
- MAPE = 100N ∑ | yi - yiyi | (với các điểm yi ≠ 0)
- R2 = 1 - ∑ (yi - yi)2∑ (yi - y)2 (nếu ∑ (yi - y)2 == 0, gán R2 = 0.0).
- Trả về dictionary:
{"mae": round(mae, 4), "mse": round(mse, 4), "rmse": round(rmse, 4), "mape": round(mape, 4), "r2": round(r2, 4)}.
Input
- Các tham số truyền vào hàm/lớp TimeSeriesFeaturePipeline hoặc dữ liệu đầu vào theo định dạng mô tả.
Output
- Kết quả trả về của hàm/lớp TimeSeriesFeaturePipeline hoặc dữ liệu in ra màn hình theo đúng đặc tả.
Ràng buộc
- Số dòng dữ liệu: 10 ≤ N ≤ 50,000.
- Tuyệt đối không dùng
scikit-learn. Toàn bộ tính bằngpandasvànumpy.
Ví dụ 1
Input
TimeSeriesFeaturePipeline(data={'sales': [10.0, 20.0, 30.0, 40.0, 50.0, 60.0]}, target_col='sales', lags=[1, 2], windows=[2], y_true=[10.0, 20.0, 30.0], y_pred=[10.0, 20.0, 30.0])Output
15.0Giải thích
Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.
Ví dụ 2
Input
TimeSeriesFeaturePipeline(data={'metric': [1.0, 2.0, 3.0, 4.0, 5.0]}, target_col='metric', lags=[1], windows=[2], y_true=[10.0, 20.0, 30.0], y_pred=[11.0, 19.0, 31.0])Output
1.5Giải thích
Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
