Data cleaning và preprocessing

Quy trình phát triển mô hình ML - Thu thập và chuẩn bị dữ liệu - Data cleaning và preprocessing

ML - Data cleaning & preprocessing

Giới thiệu

Trong hành trình phát triển các giải pháp trí tuệ nhân tạo, bước đầu tiên và có lẽ là quan trọng nhất chính là quá trình thu thập và chuẩn bị dữ liệu. Câu nói "Garbage In, Garbage Out" (tạm dịch: "Đầu vào rác, đầu ra rác") đặc biệt đúng trong lĩnh vực học máy. Không quan trọng thuật toán của bạn phức tạp đến đâu, nếu dữ liệu đầu vào không đạt chất lượng, kết quả cuối cùng cũng sẽ không như mong đợi.

Bài viết này sẽ đi sâu vào quy trình thu thập dữ liệu, làm sạch và tiền xử lý dữ liệu - các bước cơ bản nhưng đòi hỏi sự cẩn trọng và kiên nhẫn trong quá trình phát triển mô hình học máy.

1. Thu thập dữ liệu

1.1. Xác định mục tiêu

Trước khi bắt đầu thu thập dữ liệu, cần xác định rõ mục tiêu của dự án:

  • Chúng ta đang cố gắng giải quyết vấn đề gì?

  • Loại mô hình nào sẽ được sử dụng?

  • Dữ liệu nào là cần thiết để huấn luyện mô hình này?

Việc trả lời những câu hỏi này sẽ giúp định hướng quá trình thu thập dữ liệu và tiết kiệm thời gian, công sức.

1.2. Các nguồn dữ liệu

Dữ liệu có thể đến từ nhiều nguồn khác nhau:

Nguồn nội bộ:

  • Cơ sở dữ liệu doanh nghiệp

  • Nhật ký hoạt động (logs)

  • Dữ liệu giao dịch

  • Thông tin khách hàng

Nguồn bên ngoài:

  • Dataset công khai (Kaggle, UCI ML Repository, Google Dataset Search)

  • APIs (Twitter, Facebook, Google Maps...)

  • Web scraping

  • Khảo sát và nghiên cứu thị trường

  • Dữ liệu mua từ nhà cung cấp thứ ba

1.3. Đảm bảo chất lượng ban đầu

Ngay từ giai đoạn thu thập, cần đảm bảo:

  • Tính toàn vẹn: Dữ liệu không bị thiếu hoặc hỏng

  • Tính đại diện: Dữ liệu phản ánh đúng bài toán thực tế

  • Độ đa dạng: Bao gồm nhiều trường hợp khác nhau

  • Quy mô phù hợp: Đủ lớn để mô hình học hiệu quả

2. Data Cleaning - Làm sạch dữ liệu

2.1. Xử lý dữ liệu thiếu (Missing Values)

Dữ liệu thiếu là vấn đề phổ biến và có thể được xử lý bằng nhiều cách:

  • Loại bỏ:

    • Loại bỏ các dòng có giá trị thiếu (nếu số lượng ít)

    • Loại bỏ các cột có quá nhiều giá trị thiếu

  • Thay thế:

    • Giá trị thống kê: trung bình, trung vị, mode

    • Nội suy: tuyến tính, spline

    • Dự đoán: sử dụng thuật toán ML để dự đoán giá trị thiếu

    • Hằng số: thay thế bằng một giá trị cố định (0, -1, etc.)

# Ví dụ với pandas
# Loại bỏ các dòng có giá trị thiếu
df_cleaned = df.dropna()

# Thay thế bằng giá trị trung bình
df['feature'] = df['feature'].fillna(df['feature'].mean())

# Sử dụng phương pháp nội suy
df['feature'] = df['feature'].interpolate(method='linear')

2.2. Xử lý dữ liệu ngoại lai (Outliers)

Dữ liệu ngoại lai có thể ảnh hưởng đáng kể đến mô hình:

  • Phát hiện:

    • Phương pháp thống kê: Z-score, IQR (Interquartile Range)

    • Phương pháp đồ họa: Box plot, Scatter plot

    • Thuật toán: Isolation Forest, DBSCAN

  • Xử lý:

    • Loại bỏ: khi chắc chắn đó là lỗi dữ liệu

    • Biến đổi: log transform, winsorizing

    • Phân tích riêng: đôi khi outliers chứa thông tin quan trọng

# Phát hiện outliers bằng IQR
Q1 = df['feature'].quantile(0.25)
Q3 = df['feature'].quantile(0.75)
IQR = Q3 - Q1
df_filtered = df[~((df['feature'] < (Q1 - 1.5 * IQR)) | (df['feature'] > (Q3 + 1.5 * IQR)))]

2.3. Loại bỏ dữ liệu trùng lặp

Dữ liệu trùng lặp có thể gây ra hiện tượng overfitting và làm lệch mô hình:

# Kiểm tra và loại bỏ dữ liệu trùng lặp
duplicate_count = df.duplicated().sum()
print(f"Số lượng dòng trùng lặp: {duplicate_count}")
df_unique = df.drop_duplicates()

2.4. Sửa lỗi cấu trúc và nhất quán

  • Kiểm tra và chuẩn hóa định dạng (ngày tháng, số điện thoại...)

  • Sửa lỗi chính tả trong dữ liệu văn bản

  • Chuẩn hóa đơn vị đo

  • Xác nhận tính nhất quán giữa các trường liên quan

# Chuẩn hóa định dạng ngày tháng
df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y')

# Chuyển đổi đơn vị
df['height_cm'] = df['height_inch'] * 2.54

3. Data Preprocessing - Tiền xử lý dữ liệu

3.1. Feature Scaling (Chuẩn hóa đặc trưng)

Nhiều thuật toán ML nhạy cảm với phạm vi giá trị của các đặc trưng:

  • Chuẩn hóa (Normalization): Đưa dữ liệu về khoảng [0,1]

    from sklearn.preprocessing import MinMaxScaler
    scaler = MinMaxScaler()
    X_normalized = scaler.fit_transform(X)
  • Standardization: Đưa dữ liệu về phân phối chuẩn (μ=0, σ=1)

    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    X_standardized = scaler.fit_transform(X)

3.2. Encoding Categorical Variables

Chuyển đổi biến phân loại thành dạng số:

  • Label Encoding: Cho biến thứ tự (ordinal)

    from sklearn.preprocessing import LabelEncoder
    encoder = LabelEncoder()
    y_encoded = encoder.fit_transform(y)
  • One-Hot Encoding: Cho biến danh định (nominal)

    from sklearn.preprocessing import OneHotEncoder
    encoder = OneHotEncoder(sparse=False)
    X_encoded = encoder.fit_transform(X[['category']])
  • Target Encoding: Thay thế bằng giá trị trung bình của biến mục tiêu

  • Feature Hashing: Cho số lượng category lớn

3.3. Feature Engineering (Kỹ thuật đặc trưng)

Tạo các đặc trưng mới từ dữ liệu hiện có:

  • Tạo đặc trưng tương tác: kết hợp các đặc trưng

    df['area'] = df['width'] * df['height']
  • Phân rã đặc trưng thời gian: tách ngày tháng thành các thành phần

    df['day_of_week'] = df['date'].dt.dayofweek
    df['month'] = df['date'].dt.month
    df['is_weekend'] = df['day_of_week'].apply(lambda x: 1 if x >= 5 else 0)
  • Binning: nhóm dữ liệu liên tục thành nhóm

    df['age_group'] = pd.cut(df['age'], bins=[0, 18, 35, 50, 100], 
                             labels=['Child', 'Young Adult', 'Adult', 'Senior'])
  • Polynomial Features: tạo đặc trưng bậc cao hơn

    from sklearn.preprocessing import PolynomialFeatures
    poly = PolynomialFeatures(degree=2)
    X_poly = poly.fit_transform(X)

3.4. Dimensionality Reduction (Giảm chiều dữ liệu)

Khi dữ liệu có quá nhiều đặc trưng:

  • PCA (Principal Component Analysis):

    from sklearn.decomposition import PCA
    pca = PCA(n_components=2)
    X_pca = pca.fit_transform(X_standardized)
  • t-SNE: Phù hợp với dữ liệu phức tạp, phi tuyến tính

  • LDA (Linear Discriminant Analysis): Giảm chiều có giám sát

  • Feature Selection: Chọn lọc đặc trưng quan trọng

3.5. Xử lý dữ liệu không cân bằng (Imbalanced Data)

Khi các lớp không phân bố đều:

  • Oversampling: Tăng số lượng mẫu của lớp thiểu số

    from imblearn.over_sampling import SMOTE
    smote = SMOTE()
    X_resampled, y_resampled = smote.fit_resample(X, y)
  • Undersampling: Giảm số lượng mẫu của lớp đa số

  • Ensemble methods: Kết hợp nhiều mô hình

  • Điều chỉnh ngưỡng phân loại

  • Thay đổi độ đo đánh giá: F1-score, AUC-ROC, Precision-Recall

4. Phân chia dữ liệu (Data Splitting)

Chia dữ liệu thành các tập khác nhau:

from sklearn.model_selection import train_test_split

# Chia thành tập huấn luyện (70%) và tập kiểm thử (30%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Nếu cần tập validation
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)

5. Lưu ý quan trọng

5.1. Data Leakage

Đây là hiện tượng thông tin từ tập kiểm thử "rò rỉ" vào quá trình huấn luyện mô hình:

  • Thực hiện tất cả các bước tiền xử lý sau khi chia dữ liệu

  • Sử dụng pipelines để đảm bảo quy trình nhất quán

  • Kiểm tra các biến có tính thời gian trong tương lai

5.2. Tài liệu hóa quy trình

Ghi lại đầy đủ:

  • Nguồn dữ liệu

  • Các bước làm sạch và tiền xử lý

  • Các quyết định và lý do

  • Các giả định đã đưa ra

5.3. Kiểm tra chất lượng dữ liệu

Sau khi tiền xử lý, cần kiểm tra lại:

  • Phân phối dữ liệu

  • Tương quan giữa các đặc trưng

  • Các giá trị thống kê cơ bản (min, max, mean, std)

Kết luận

Quá trình thu thập và chuẩn bị dữ liệu thường chiếm tới 70-80% thời gian trong dự án ML. Mặc dù có vẻ tốn thời gian và ít thú vị hơn so với việc xây dựng mô hình, nhưng đây là nền tảng quyết định thành công của dự án.

Các kỹ sư ML giỏi thường dành nhiều thời gian để hiểu sâu về dữ liệu, phát hiện các vấn đề tiềm ẩn và chuẩn bị dữ liệu kỹ lưỡng trước khi bắt đầu xây dựng mô hình. Điều này không chỉ giúp mô hình hoạt động tốt hơn mà còn tiết kiệm thời gian debug và cải thiện sau này.

Với quy trình thu thập và chuẩn bị dữ liệu chắc chắn, bạn đã có nền tảng vững chắc để phát triển các mô hình ML hiệu quả và đáng tin cậy.

Last updated