python-054Đọc toàn bộ đề miễn phí

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ể…

PythonNâng cao35 phút

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ủ đề

feature engineeringtime serieslag featuresrolling statisticsregression metrics

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ém ValueError.
  • 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ằng dropna().
  • 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.ndarray 1D float64. Nếu kích thước không khớp nhau hoặc rỗng, ném ValueError.
  • 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ằng pandas và 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.0

Giả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.5

Giả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ế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.