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.
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
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
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())])
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.