Tối Ưu Hóa Mô Hình Machine Learning: Kỹ Thuật Tạo Biến (Feature Engineering) Nâng Cao Cho Dữ Liệu Bảng Và Thời Gian

lúc 17:03 2 tháng 9, 2026
12 views

Trong thế giới khoa học dữ liệu, thuật toán xuất sắc đến đâu cũng trở nên vô nghĩa nếu đầu vào là dữ liệu kém chất lượng. Quá trình Feature Engineering (tạo biến đặc trưng) chính là nghệ thuật biến dữ liệu thô thành những tín hiệu sắc bén, giúp các mô hình học máy đạt độ chính xác tối đa. Đối với dữ liệu dạng bảngchuỗi thời gian, việc khai thác sâu các mối quan hệ ẩn giấu sẽ quyết định sự thành bại của một hệ thống dự báo.

📊 Tầm quan trọng của Feature Engineering trong dữ liệu bảng

Dữ liệu bảng (Tabular data) thường bao gồm các cột số liệu và phân loại rời rạc. Việc sử dụng nguyên bản các cột này thường giới hạn khả năng học của mô hình. Các kỹ thuật nâng cao giúp tối ưu hóa bao gồm:

  • Tạo biến tương tác (Interaction Features): Kết hợp các thuộc tính lại với nhau thông qua phép toán nhân, chia để tạo ra các chiều thông tin mới (ví dụ: tính diện tích từ chiều dài và chiều rộng, hoặc tỷ lệ chuyển đổi).
  • Mã hóa thông minh (Advanced Encoding): Thay vì chỉ dùng One-Hot Encoding thông thường, các kỹ thuật như Target Encoding hoặc Frequency Encoding giúp xử lý hiệu quả các biến phân loại có độ biến động cao.
  • Chia nhóm dữ liệu (Binning & Discretization): Chuyển đổi các biến liên tục thành các khoảng giá trị rời rạc để mô hình dễ dàng phát hiện phi tuyến tính.

⏳ Khai thác chiều thời gian với Time-Series Feature Engineering

Dữ liệu chuỗi thời gian mang tính tuần tự và phụ thuộc mạnh mẽ vào quá khứ. Để mô hình dự báo học được xu hướng này, các kỹ thuật tạo biến chuyên sâu là bắt buộc:

  • Biến trễ (Lag Features): Đưa giá trị của các mốc thời gian trước đó (t-1, t-2) thành các cột đặc trưng mới để mô hình nhận diện độ trễ của xu hướng.
  • Biến cửa sổ trượt (Rolling Window Features): Tính toán các chỉ số thống kê động như trung bình động (rolling mean), độ lệch chuẩn (rolling std) trong một khoảng thời gian nhất định để làm mượt nhiễu.
  • Mã hóa thời gian tuần hoàn (Cyclical Encoding): Sử dụng hàm lượng giác (Sin/Cos) để biểu diễn các biến mang tính chu kỳ như giờ trong ngày, tháng trong năm, giúp mô hình hiểu rằng 23 giờ đêm rất gần với 0 giờ sáng.

💻 Code Demo Python: Tự động hóa tạo biến đặc trưng

Đoạn mã Python dưới đây minh họa cách xây dựng các biến đặc trưng nâng cao cho dữ liệu bán hàng bao gồm cả thuộc tính dạng bảng và chuỗi thời gian sử dụng thư viện Pandas:

Code
import numpy as np
import pandas as pd

# Khởi tạo hằng số cấu hình xử lý dữ liệu
ROLLING_WINDOW_SIZE = 3
DEFAULT_FILL_VALUE = 0

def create_tabular_features(df):
    """Tạo các biến tương tác và thống kê trên dữ liệu dạng bảng."""
    # Tạo biến tương tác giữa giá và số lượng
    df["Total_Value"] = df["Quantity"] * df["Unit_Price"]
    
    # Tạo biến phân khúc giá dựa trên giá trị trung bình
    mean_price = df["Unit_Price"].mean()
    df["Is_High_Value"] = (df["Unit_Price"] > mean_price).astype(int)
    
    return df

def create_time_series_features(df):
    """Tạo các biến trễ và cửa sổ trượt cho dữ liệu thời gian."""
    # Sắp xếp dữ liệu theo thời gian để đảm bảo tính tuần tự
    df = df.sort_values("Date").reset_index(drop=True)
    
    # Tạo biến trễ (Lag feature) cho doanh thu kỳ trước
    df["Revenue_Lag_1"] = df["Total_Value"].shift(1)
    
    # Tạo biến cửa sổ trượt tính trung bình động
    df["Revenue_Rolling_Mean"] = (
        df["Total_Value"]
        .rolling(window=ROLLING_WINDOW_SIZE)
        .mean()
    )
    
    # Điền giá trị thiếu phát sinh từ quá trình shift/rolling
    df.fillna(DEFAULT_FILL_VALUE, inplace=True)
    
    return df

if __name__ == "__main__":
    # Giả lập tập dữ liệu đầu vào
    raw_data = {
        "Date": pd.date_range(start="2026-05-01", periods=6, freq="D"),
        "Quantity": [10, 15, 8, 20, 25, 30],
        "Unit_Price": [100.0, 120.0, 110.0, 130.0, 125.0, 140.0]
    }
    
    base_df = pd.DataFrame(raw_data)
    
    # Thực thi quy trình Feature Engineering
    tabular_df = create_tabular_features(base_df)
    final_dataset = create_time_series_features(tabular_df)
    
    print(final_dataset[["Date", "Total_Value", "Revenue_Lag_1", "Revenue_Rolling_Mean"]])

🛡️ Lưu ý thực chiến để tránh rò rỉ dữ liệu (Data Leakage)

Khi triển khai Feature Engineering trên dữ liệu chuỗi thời gian, cạm bẫy lớn nhất là Data Leakage — tình trạng thông tin từ tương lai bị rò rỉ vào tập huấn luyện, khiến mô hình đạt độ chính xác ảo trên lý thuyết nhưng thất bại hoàn toàn khi đưa vào thực tế.

Để ngăn chặn điều này, mọi phép tính thống kê như tính giá trị trung bình, chuẩn hóa dữ liệu (scaling) hoặc điền khuyết (imputation) đều phải được thực hiện riêng biệt trên từng tập dữ liệu (train/test split), hoặc tính toán dựa trên dữ liệu quá khứ. Việc kết hợp chặt chẽ giữa tư duy thuật toán và thư viện mạnh mẽ như Python sẽ giúp các kỹ sư xây dựng hệ thống dự báo vững chắc, mang lại giá trị thực tiễn cao cho doanh nghiệp.

Bài tập thực hành:

Dưới đây là 2 bài tập thực hành nâng cao tiếp theo kèm mã nguồn Python và lời giải chi tiết giúp bạn làm chủ kỹ thuật tạo biến đặc trưng cho dữ liệu bảng và chuỗi thời gian:

🔄 Bài tập 1: Mã hóa thời gian tuần hoàn (Cyclical Encoding) cho dữ liệu chuỗi thời gian

Mô tả bài toán: Khi xử lý dữ liệu theo thời gian, các biến như tháng trong năm (1 đến 12) có tính chất tuần hoàn (tháng 12 rất gần với tháng 1). Việc sử dụng giá trị số nguyên thông thường khiến mô hình hiểu lầm khoảng cách. Hãy viết hàm Python sử dụng hàm lượng giác Sin/Cos để chuyển đổi biến tháng thành dạng tuần hoàn.

Mã nguồn và lời giải:

Code
import numpy as np
import pandas as pd

# Khởi tạo hằng số tổng số tháng trong một năm
MONTHS_IN_YEAR = 12

def create_cyclical_time_features(df):
    """Mã hóa tuần hoàn cho tháng bằng hàm lượng giác Sin và Cos."""
    # Chuyển đổi tháng sang hệ tọa độ lượng giác tuần hoàn
    df["Month_Sin"] = np.sin(2 * np.pi * df["Month"] / MONTHS_IN_YEAR)
    df["Month_Cos"] = np.cos(2 * np.pi * df["Month"] / MONTHS_IN_YEAR)
    
    return df

if __name__ == "__main__":
    # Giả lập dữ liệu có chứa thông tin tháng
    raw_data = {
        "Transaction_ID": [101, 102, 103, 104],
        "Month": [1, 6, 12, 1],  # Tháng 1 và 12 có giá trị lượng giác gần nhau
        "Amount": [500, 700, 1200, 450]
    }
    
    df_transactions = pd.DataFrame(raw_data)
    
    # Thực thi mã hóa tuần hoàn
    processed_df = create_cyclical_time_features(df_transactions)
    print(processed_df[["Month", "Month_Sin", "Month_Cos"]])

📦 Bài tập 2: Tạo biến cửa sổ trượt theo nhóm (Grouped Rolling Features)

Mô tả bài toán: Trong dữ liệu bán hàng thực tế, việc tính trung bình động (rolling mean) phải được thực hiện độc lập cho từng danh mục sản phẩm thay vì gộp chung toàn bộ bảng. Hãy viết script Python sử dụng kết hợp groupby và transform để tính doanh thu trung bình trượt theo từng danh mục.

Mã nguồn và lời giải:

Code
import pandas as pd

# Khởi tạo hằng số kích thước cửa sổ trượt theo nhóm
GROUP_WINDOW_SIZE = 2
DEFAULT_FILL_VALUE = 0.0

def create_category_rolling_features(df):
    """Tạo biến cửa sổ trượt doanh thu riêng biệt theo từng danh mục sản phẩm."""
    # Sắp xếp dữ liệu theo danh mục và thời gian để đảm bảo thứ tự
    df = df.sort_values(["Category", "Date"]).reset_index(drop=True)
    
    # Tính trung bình động doanh thu theo từng nhóm danh mục
    df["Category_Rolling_Sales"] = (
        df.groupby("Category")["Sales"]
        .transform(lambda x: x.rolling(window=GROUP_WINDOW_SIZE, min_periods=1).mean())
    )
    
    # Điền giá trị thiếu nếu có
    df.fillna(DEFAULT_FILL_VALUE, inplace=True)
    return df

if __name__ == "__main__":
    # Giả lập dữ liệu bán hàng đa danh mục
    sales_data = {
        "Date": pd.to_datetime(["2026-05-01", "2026-05-02", "2026-05-01", "2026-05-02"]),
        "Category": ["Electronics", "Electronics", "Clothing", "Clothing"],
        "Sales": [100, 200, 50, 80]
    }
    
    sales_df = pd.DataFrame(sales_data)
    
    # Thực thi tạo biến trượt theo nhóm
    grouped_df = create_category_rolling_features(sales_df)
    print(grouped_df[["Date", "Category", "Sales", "Category_Rolling_Sales"]])

Bình luận

Đăng nhập để để lại bình luận.
Chưa có bình luận nào cho bài viết này.

Bài viết liên quan