Limio— Learn your way
🏆 Đấu trường
Đăng nhậpĐăng ký

Thiết kế và phát triển: @Limio team - Khoa Khoa học và Công nghệ Giáo dục, Đại học Bách Khoa Hà Nội

← Fundamental of Machine Learning

Bạn đang xem thử công khai

Đăng nhập để lưu tiến độ, làm bài tập, thảo luận và nhận phản hồi.

Đăng nhập
Module 1: Data Preparation and Model Foundations

Pipeline học máy trong Scikit-learn

In / Lưu PDF

Pipeline học máy trong Scikit-learn

Vấn đề mà Pipeline giải quyết

Khi làm thủ công, bạn phải nhớ đúng thứ tự và đúng quy tắc: fit scaler trên train, transform test, rồi mới huấn luyện. Chỉ cần một lần quên là dữ liệu rò rỉ mà không có lỗi nào báo — mô hình vẫn chạy, kết quả vẫn đẹp, chỉ là sai.

Pipeline gộp mọi bước thành một đối tượng. Gọi fit một lần, thư viện tự áp đúng quy tắc cho từng bước.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier

pipe = Pipeline([
    ("scaler", StandardScaler()),
    ("model",  RandomForestClassifier(random_state=100)),
])

pipe.fit(x_train, y_train)      # scaler.fit_transform + model.fit
y_pred = pipe.predict(x_test)   # scaler.transform + model.predict

Vì sao đây là cách an toàn hơn

Khi dùng chung với kiểm định chéo, Pipeline fit lại scaler riêng cho từng fold. Làm thủ công, người ta hay chuẩn hoá một lần trên toàn bộ tập train rồi mới chia fold — và thế là mỗi fold validation đã bị rò rỉ.

from sklearn.model_selection import cross_val_score
scores = cross_val_score(pipe, x_train, y_train, cv=5)  # an toàn

Xử lý cột số và cột hạng mục khác nhau

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

pre = ColumnTransformer([
    ("num", StandardScaler(), ["age", "income"]),
    ("cat", OneHotEncoder(handle_unknown="ignore"), ["city"]),
])
pipe = Pipeline([("pre", pre), ("model", RandomForestClassifier())])

Lỗi thường gặp nhất

Chuẩn hoá dữ liệu trước khi đưa vào cross-validation. Kết quả sẽ đẹp hơn thực tế và bạn sẽ không phát hiện ra, vì không có gì báo lỗi. Đưa scaler vào trong Pipeline là cách chắc chắn tránh được.