Trong quy trình phát triển một mô hình học máy chuyên nghiệp, việc xây dựng một pipeline hoàn chỉnh từ dữ liệu gốc (raw data) đến mô hình cuối cùng là điều cực kỳ quan trọng. Không chỉ giúp tái sử dụng mã nguồn, pipeline còn giúp đảm bảo quy trình huấn luyện nhất quán, dễ dàng mở rộng, kiểm thử và triển khai thực tế.
Nếu bạn đã từng thực hiện phân tích cảm xúc như Phân tích cảm xúc Facebook bằng Python hay đã nắm được cách đánh giá mô hình qua Confusion Matrix, thì việc tự động hóa toàn bộ quy trình với pipeline sẽ giúp bạn nâng cấp kỹ năng đáng kể.
Chuẩn bị dữ liệu mẫu
Để minh họa, chúng ta sẽ sử dụng bộ dữ liệu nổi tiếng về bệnh tiểu đường: Pima Indians Diabetes Dataset. Dữ liệu này có thể tải từ nguồn công khai và rất phù hợp cho bài toán phân loại nhị phân.
Chúng ta sẽ tải dữ liệu bằng Pandas và kiểm tra các đặc trưng cơ bản trước khi xây dựng pipeline.
import pandas as pd
import numpy as np
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv'
columns = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome']
data = pd.read_csv(url, names=columns)
data.head()
Xử lý dữ liệu và tạo tập train/test
Trong dữ liệu y tế, một số giá trị bằng 0 như Glucose hoặc BMI có thể là dữ liệu bị thiếu. Ta sẽ thay thế chúng bằng giá trị trung vị. Sau đó, chia dữ liệu thành tập huấn luyện và kiểm thử.
from sklearn.model_selection import train_test_split
X = data.drop("Outcome", axis=1)
y = data["Outcome"]
# Cột có giá trị 0 bất hợp lý
zero_cols = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI']
for col in zero_cols:
X[col] = X[col].replace(0, np.nan)
X[col] = X[col].fillna(X[col].median())
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
Xây dựng pipeline học máy hoàn chỉnh
Pipeline là chuỗi các bước xử lý dữ liệu và huấn luyện mô hình. Trong sklearn, bạn có thể dùng Pipeline để gói gọn toàn bộ quy trình vào một đối tượng duy nhất.
Ở đây, ta sẽ dùng pipeline gồm: chuẩn hóa dữ liệu (StandardScaler) + mô hình Logistic Regression.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
pipeline = Pipeline([
('scaler', StandardScaler()),
('clf', LogisticRegression(max_iter=1000))
])
pipeline.fit(X_train, y_train)
Đánh giá mô hình từ pipeline
Sau khi pipeline đã được huấn luyện, bạn có thể sử dụng chính pipeline để dự đoán và đánh giá mô hình một cách đơn giản, thay vì phải xử lý từng bước riêng lẻ.
from sklearn.metrics import classification_report, accuracy_score
y_pred = pipeline.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
Bạn cũng có thể lưu pipeline bằng joblib để phục vụ triển khai thực tế.
import joblib joblib.dump(pipeline, 'diabetes_pipeline.pkl')
Mở rộng pipeline với ColumnTransformer
Khi bạn có nhiều loại dữ liệu khác nhau (số, phân loại, boolean), bạn cần xử lý riêng từng loại. ColumnTransformer giúp bạn áp dụng nhiều pipeline con cho từng cột khác nhau.
Ví dụ dưới đây sẽ phân biệt giữa cột số và cột phân loại, rồi áp dụng chuẩn hóa và one-hot encoding tương ứng.
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
# Ví dụ đơn giản (giả sử có cột phân loại 'Gender')
X['Gender'] = np.random.choice(['Male', 'Female'], size=len(X))
numeric_features = X.select_dtypes(include=['int64', 'float64']).columns.tolist()
categorical_features = ['Gender']
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), numeric_features),
('cat', OneHotEncoder(), categorical_features)
])
full_pipeline = Pipeline([
('preprocess', preprocessor),
('classifier', RandomForestClassifier())
])
full_pipeline.fit(X_train.assign(Gender=X['Gender']), y_train)
Kết luận
Pipeline là một phần thiết yếu để triển khai hệ thống học máy thực tế. Nó giúp chuẩn hóa toàn bộ quy trình xử lý dữ liệu và mô hình hóa thành một khối thống nhất, dễ quản lý và tối ưu.
Với Pipeline và ColumnTransformer, bạn có thể dễ dàng xử lý dữ liệu số, phân loại, đưa vào huấn luyện, đánh giá, lưu mô hình, và mở rộng hệ thống về sau mà không cần viết lại logic thủ công cho từng bước. Nếu bạn cần triển khai mô hình này thành REST API hoặc dùng trong ứng dụng thực tế, mình có thể viết tiếp phần tiếp theo ngay.

