Phân Loại Và Phân Cụm Dữ Liệu Với Python: Từ Random Forest, XGBoost Đến K-Means Và DBSCAN

lúc 15:24 2 tháng 9, 2026
6 views

Trong kỷ nguyên dữ liệu lớn (Big Data), học máy (Machine Learning) là công cụ cốt lõi giúp doanh nghiệp tự động hóa việc ra quyết định. Trong đó, học có giám sát (Supervised Learning) với bài toán phân loại và học không giám sát (Unsupervised Learning) với bài toán phân cụm là hai trụ cột chính. Kết hợp sức mạnh của Python cùng các thư viện hàng đầu như scikit-learn và xgboost, việc khai thác tri thức từ dữ liệu trở nên mạnh mẽ và chính xác hơn bao giờ hết.

🌲 1. Tổng Quan Về Thuật Toán Phân Loại: Random Forest Và XGBoost

Bài toán phân loại nhằm dự đoán nhãn danh mục (categorical labels) cho dữ liệu mới dựa trên các đặc trưng lịch sử. Hai mô hình cây quyết định kết hợp (Ensemble Methods) đang thống trị các cuộc thi khoa học dữ liệu gồm:

  • Random Forest: Xây dựng hàng loạt cây quyết định độc lập (decision trees) dựa trên các tập con ngẫu nhiên của dữ liệu, sau đó lấy kết quả biểu quyết số đông (majority vote). Thuật toán này rất ổn định, ít bị hiện tượng quá khớp (overfitting) và xử lý tốt dữ liệu nhiễu.
  • XGBoost (Extreme Gradient Boosting): Hoạt động theo cơ chếboosting tuần tự, nơi cây sau sửa chữa sai số (residuals) của cây trước bằng cách tối ưu hóa hàm mất mát thông qua thuật toánGradient Descent. XGBoost nổi tiếng với tốc độ tính toán cực nhanh và độ chính xác vượt trội.

🎯 2. Khám Phá Thuật Toán Phân Cụm: K-Means Và DBSCAN

Khi dữ liệu chưa có nhãn sẵn, phân cụm giúp gom nhóm các đối tượng có cùng đặc tính lại với nhau để phục vụ các chiến dịch tiếp thị hoặc phân khúc khách hàng:

  • K-Means Clustering: Phân chia dữ liệu thành K cụm dựa trên khoảng cách đến tâm cụm (centroids). K-Means chạy rất nhanh và hiệu quả với các cụm có hình cầu, tuy nhiên đòi hỏi người dùng phải định nghĩa trước số lượng cụm K.
  • DBSCAN (Density-Based Spatial Clustering of Applications with Noise): Phân cụm dựa trên mật độ điểm dữ liệu. DBSCAN có khả năng phát hiện các cụm có hình dạng bất kỳ và tự động loại bỏ các điểm nhiễu (outliers) mà không cần phải biết trước số lượng cụm.

💻 3. Code Demo Python: Xây Dựng Mô Hình Phân Loại Và Phân Cụm

Đoạn mã nguồn Python dưới đây minh họa cách huấn luyện mô hình phân loại sử dụng RandomForestClassifier kết hợp kỹ thuật phân cụm dữ liệu với KMeans thông qua scikit-learn:

Code
import numpy as np
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.cluster import KMeans
from sklearn.metrics import accuracy_score, classification_report
from sklearn.model_selection import train_test_split

def execute_machine_learning_pipeline():
    """
    Thực hiện quy trình huấn luyện mô hình phân loại Random Forest và phân cụm K-Means.
    Tên biến và hàm hoàn toàn bằng tiếng Anh, comment bằng tiếng Việt.
    """
    # 1. Tạo tập dữ liệu giả lập cho bài toán phân loại
    feature_matrix, target_vector = make_classification(
        n_samples=1000, 
        n_features=20, 
        n_informative=15, 
        n_classes=2, 
        random_state=42
    )
    
    # Chia dữ liệu thành tập huấn luyện (Train) và kiểm thử (Test)
    X_train, X_test, y_train, y_test = train_test_split(
        feature_matrix, target_vector, test_size=0.25, random_state=42
    )
    
    # 2. Xây dựng và huấn luyện mô hình phân loại Random Forest
    random_forest_model = RandomForestClassifier(n_estimators=100, random_state=42)
    random_forest_model.fit(X_train, y_train)
    
    # Dự báo và đánh giá độ chính xác phân loại
    predictions = random_forest_model.predict(X_test)
    model_accuracy = accuracy_score(y_test, predictions)
    
    print(f"--- KẾT QUẢ PHÂN LOẠI RANDOM FOREST ---")
    print(f"Độ chính xác (Accuracy): {model_accuracy * 100:.2f}%")
    
    # 3. Thực hiện phân cụm không giám sát với K-Means (chia thành 3 cụm)
    kmeans_model = KMeans(n_clusters=3, n_init=10, random_state=42)
    cluster_labels = kmeans_model.fit_predict(feature_matrix)
    
    print(f"\n--- KẾT QUẢ PHÂN CỤM K-MEANS ---")
    print(f"Tổng số lượng điểm dữ liệu được phân cụm: {len(cluster_labels)}")
    print(f"Tọa độ tâm các cụm (Cluster Centers Shape): {kmeans_model.cluster_centers_.shape}")

# Chạy pipeline học máy thực tế
execute_machine_learning_pipeline()

📈 4. Định Hướng Lựa Chọn Thuật Toán Cho Từng Bài Toán Thực Tế

Việc lựa chọn đúng thuật toán học máy quyết định sự thành bại của dự án dữ liệu:

  • Nếu bài toán của bạn yêu cầu dự đoán chính xác trạng thái khách hàng rời bỏ (churn prediction) hoặc gian lận tài chính (fraud detection), hãy ưu tiên các mô hình mạnh mẽ như Random Forest hoặc XGBoost.
  • Nếu mục tiêu là thấu hiểu hành vi người dùng để chia tập khách hàng thành các phân khúc (segmentation) chạy quảng cáo riêng biệt mà không có nhãn mẫu, hãy bắt đầu với K-Means hoặc chuyển sang DBSCAN nếu dữ liệu có nhiều điểm bất thường phức tạp.

Làm chủ các thuật toán phân loại và phân cụm bằng Python giúp bạn mở rộng tầm nhìn, giải quyết triệt để các bài toán tối ưu kinh doanh từ nền tảng dữ liệu thực tế.

📝 5. Bài tập thực hành Phân loại và Phân cụm với Python

Để củng cố kỹ năng làm việc với các thuật toán Học máy mạnh mẽ nhất hiện nay, bạn hãy thực hiện 2 bài tập ứng dụng XGBoost và DBSCAN dưới đây nhằm giải quyết các bài toán phân tích dữ liệu thực tế.

Bài tập 1: Phân loại bằng XGBoost và Trích xuất mức độ quan trọng của đặc trưng (Feature Importance)

Trong các bài toán kinh doanh như chấm điểm tín dụng hay dự đoán khách hàng rời bỏ, việc biết "tại sao" mô hình đưa ra quyết định cũng quan trọng không kém độ chính xác. XGBoost cung cấp thuộc tính feature_importances_ rất trực quan. Hãy viết hàm huấn luyện mô hình XGBClassifier và in ra các đặc trưng có sức ảnh hưởng lớn nhất.

Code
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score

def evaluate_xgboost_feature_importance():
    """
    Huấn luyện mô hình XGBoost và trích xuất mức độ quan trọng của các đặc trưng.
    Tên biến bằng tiếng Anh, comment bằng tiếng Việt.
    """
    # 1. Tạo tập dữ liệu giả lập với 10 đặc trưng
    feature_matrix, target_vector = make_classification(
        n_samples=2000, 
        n_features=10, 
        n_informative=5, 
        random_state=42
    )
    
    # Chia dữ liệu huấn luyện và kiểm thử
    X_train, X_test, y_train, y_test = train_test_split(
        feature_matrix, target_vector, test_size=0.2, random_state=42
    )
    
    # 2. Khởi tạo và huấn luyện mô hình XGBoost Classification
    # Sử dụng use_label_encoder=False và eval_metric để tránh warning ở các phiên bản mới
    xgb_model = XGBClassifier(n_estimators=100, learning_rate=0.1, random_state=42, use_label_encoder=False, eval_metric='logloss')
    xgb_model.fit(X_train, y_train)
    
    # 3. Dự báo và đánh giá độ chính xác
    predictions = xgb_model.predict(X_test)
    model_accuracy = accuracy_score(y_test, predictions)
    
    # 4. Trích xuất mức độ quan trọng của đặc trưng (Feature Importance)
    feature_importances = xgb_model.feature_importances_
    
    # Sắp xếp các đặc trưng theo mức độ quan trọng giảm dần
    sorted_feature_indices = np.argsort(feature_importances)[::-1]
    
    print(f"--- KẾT QUẢ PHÂN LOẠI XGBOOST ---")
    print(f"Độ chính xác trên tập Test: {model_accuracy * 100:.2f}%\n")
    print("Top 3 đặc trưng quan trọng nhất:")
    
    for i in range(3):
        feature_index = sorted_feature_indices[i]
        importance_score = feature_importances[feature_index]
        print(f"Đặc trưng số {feature_index}: {importance_score:.4f} điểm ảnh hưởng")

# Chạy thử mô hình XGBoost
evaluate_xgboost_feature_importance()

Bài tập 2: Phân cụm phi tuyến tính và phát hiện điểm nhiễu (Outliers) bằng DBSCAN

Khác với K-Means thường gặp khó khăn với các cụm dữ liệu có hình dáng phức tạp hoặc chồng chéo, DBSCAN phân nhóm dựa trên mật độ. Điểm đặc biệt của DBSCAN là nó tự động gán nhãn -1 cho các điểm dữ liệu bất thường (noise). Hãy viết hàm sử dụng DBSCAN để phân cụm tập dữ liệu hình bán nguyệt (moons) có lẫn nhiễu.

Code
import numpy as np
from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN

def detect_clusters_and_noise_with_dbscan(epsilon_distance=0.2, minimum_samples=5):
    """
    Sử dụng thuật toán DBSCAN để phân cụm dữ liệu phi tuyến tính và đếm số lượng điểm nhiễu.
    Tên biến bằng tiếng Anh, comment bằng tiếng Việt.
    """
    # 1. Tạo tập dữ liệu hình bán nguyệt (moons) có độ nhiễu cao
    feature_matrix, true_labels = make_moons(n_samples=500, noise=0.1, random_state=42)
    
    # 2. Khởi tạo mô hình DBSCAN
    # eps: Khoảng cách tối đa giữa 2 mẫu để được coi là cùng một cụm
    # min_samples: Số lượng mẫu tối thiểu trong vùng lân cận để tạo thành một cụm lõi
    dbscan_model = DBSCAN(eps=epsilon_distance, min_samples=minimum_samples)
    
    # 3. Tiến hành phân cụm dữ liệu
    cluster_labels = dbscan_model.fit_predict(feature_matrix)
    
    # 4. Phân tích kết quả từ DBSCAN
    # Nhãn -1 đại diện cho các điểm nhiễu (noise/outliers)
    total_noise_points = list(cluster_labels).count(-1)
    
    # Số lượng cụm hợp lệ được tìm thấy (loại trừ nhãn -1)
    unique_clusters = set(cluster_labels) - {-1}
    total_valid_clusters = len(unique_clusters)
    
    print(f"--- KẾT QUẢ PHÂN CỤM DBSCAN ---")
    print(f"Tham số sử dụng: eps={epsilon_distance}, min_samples={minimum_samples}")
    print(f"Số lượng cụm (clusters) hợp lệ được phát hiện: {total_valid_clusters}")
    print(f"Số lượng điểm bất thường (noise) bị cô lập: {total_noise_points} / {len(cluster_labels)} điểm")
    
    return cluster_labels

# Chạy thuật toán phân cụm DBSCAN
detect_clusters_and_noise_with_dbscan()

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