Skip to content

Buổi 7: Máy học Nâng cao và Tối ưu Mô hình trong R

Buổi 7: Máy học Nâng cao và Tối ưu Mô hình trong R

Nội dung chi tiết

1. Random Forests (Rừng Ngẫu nhiên)

Random Forest là gì?

Random Forest là một thuật toán học có giám sát thuộc nhóm phương pháp tập hợp (ensemble methods). Nó kết hợp nhiều cây quyết định (decision trees) để cải thiện độ chính xác và giảm hiện tượng overfitting. Random Forest có thể được sử dụng cho cả bài toán phân loại (classification) và hồi quy (regression).

Triển khai Random Forest với gói randomForest:

Chúng ta sẽ sử dụng tập dữ liệu iris để xây dựng một mô hình Random Forest phân loại loài hoa.

# Cài đặt và tải gói randomForest
install.packages("randomForest")
library(randomForest)

# Tải dữ liệu iris
data(iris)

# Chia dữ liệu thành tập huấn luyện và tập kiểm tra
set.seed(123)
train_index <- sample(1:nrow(iris), 0.8 * nrow(iris))
train_data <- iris[train_index, ]
test_data <- iris[-train_index, ]

# Xây dựng mô hình Random Forest
rf_model <- randomForest(Species ~ ., data = train_data, ntree = 100)

# Dự đoán trên tập kiểm tra
rf_predictions <- predict(rf_model, test_data)

# Xem kết quả dự đoán
head(rf_predictions)

Kết quả mẫu:

     1         2         3         4         5         6 
setosa    setosa    setosa    setosa    setosa    setosa 

Xem tầm quan trọng của các biến (Feature Importance):

Random Forest cho phép đánh giá mức độ quan trọng của từng biến trong việc dự đoán.

# Xem tầm quan trọng của các biến
importance(rf_model)
varImpPlot(rf_model, main = "Tầm quan trọng của các Biến trong Random Forest")

Giải thích:

  • Các biến như Petal.LengthPetal.Width thường có tầm quan trọng cao trong việc phân loại loài hoa iris.

2. Tối ưu Siêu tham số (Hyperparameter Tuning)

Siêu tham số là gì?

Siêu tham số là các tham số được thiết lập trước khi huấn luyện mô hình, ví dụ: số lượng cây (ntree) và số biến được chọn ngẫu nhiên tại mỗi lần phân chia (mtry) trong Random Forest.

Tối ưu siêu tham số với gói caret:

Chúng ta sẽ sử dụng caret để thực hiện tìm kiếm lưới (grid search) nhằm tìm ra giá trị tối ưu cho mtry.

# Cài đặt và tải gói caret
install.packages("caret")
library(caret)

# Thiết lập kiểm định chéo (cross-validation)
set.seed(123)
ctrl <- trainControl(method = "cv", number = 5)

# Định nghĩa lưới tìm kiếm cho mtry
tune_grid <- expand.grid(mtry = c(1, 2, 3, 4))

# Huấn luyện mô hình Random Forest với grid search
rf_tuned <- train(Species ~ ., data = train_data, method = "rf",
                  trControl = ctrl, tuneGrid = tune_grid)

# Xem kết quả
print(rf_tuned)

# Dự đoán với mô hình đã tối ưu
rf_tuned_predictions <- predict(rf_tuned, test_data)

# Xem kết quả dự đoán
head(rf_tuned_predictions)

Kết quả mẫu:

Random Forest 

120 samples
  4 predictor
  3 classes: 'setosa', 'versicolor', 'virginica' 

No pre-processing
Resampling: Cross-Validated (5 fold) 
Summary of sample sizes: 96, 96, 96, 96, 96 
Resampling results across tuning parameters:

  mtry  Accuracy   Kappa    
  1     0.9583333  0.9375   
  2     0.9666667  0.95     
  3     0.9666667  0.95     
  4     0.9666667  0.95     

Accuracy was used to select the optimal model using the largest value.
The final value used for the model was mtry = 2.

Giải thích:

  • Giá trị mtry = 2 cho độ chính xác cao nhất (96.67%).
  • Mô hình đã được tối ưu và có thể được sử dụng để dự đoán.

3. Phân cụm với R (Clustering)

Phân cụm là gì?

Phân cụm (clustering) là một kỹ thuật học không giám sát, nhằm nhóm các quan sát tương tự thành các cụm dựa trên đặc trưng của chúng. Thuật toán K-Means là một trong những phương pháp phân cụm phổ biến nhất.

Triển khai K-Means với hàm kmeans():

Chúng ta sẽ phân cụm tập dữ liệu iris (bỏ cột Species) thành 3 cụm và so sánh với nhãn thực tế.

# Chuẩn bị dữ liệu (bỏ cột Species)
iris_features <- iris[, -5]

# Chuẩn hóa dữ liệu (để các biến có cùng thang đo)
iris_scaled <- scale(iris_features)

# Thực hiện K-Means với k = 3
set.seed(123)
kmeans_model <- kmeans(iris_scaled, centers = 3, nstart = 20)

# Xem kết quả phân cụm
kmeans_clusters <- kmeans_model$cluster
table(kmeans_clusters, iris$Species)

Kết quả mẫu:

              setosa versicolor virginica
kmeans_clusters
           1      0         48        14
           2     50          0         0
           3      0          2        36

Giải thích:

  • Cụm 2 tương ứng hoàn toàn với loài setosa.
  • Cụm 1 và 3 chủ yếu tương ứng với versicolorvirginica, nhưng có một số nhầm lẫn.

Trực quan hóa cụm với ggplot2:

# Cài đặt và tải gói ggplot2
install.packages("ggplot2")
library(ggplot2)

# Thêm kết quả phân cụm vào dữ liệu
iris$Cluster <- as.factor(kmeans_clusters)

# Vẽ biểu đồ phân tán
ggplot(iris, aes(x = Petal.Length, y = Petal.Width, color = Cluster)) +
  geom_point(size = 3) +
  labs(title = "Phân cụm K-Means trên Dữ liệu Iris",
       x = "Chiều dài Cánh hoa (Petal.Length)",
       y = "Chiều rộng Cánh hoa (Petal.Width)") +
  theme_minimal()

Kết quả sẽ hiển thị một biểu đồ phân tán, trong đó các điểm được tô màu theo cụm, giúp dễ dàng hình dung các nhóm.

4. Giảm chiều Dữ liệu (Dimensionality Reduction)

Giảm chiều là gì?

Giảm chiều (dimensionality reduction) là kỹ thuật giảm số lượng biến trong dữ liệu, giúp đơn giản hóa mô hình, giảm thời gian tính toán, và tránh hiện tượng "lời nguyền của chiều" (curse of dimensionality).

Phân tích Thành phần Chính (PCA):

PCA (Principal Component Analysis) là một phương pháp giảm chiều phổ biến, chuyển đổi dữ liệu thành các thành phần chính (principal components) sao cho giữ được phần lớn thông tin (phương sai) của dữ liệu gốc.

# Thực hiện PCA trên dữ liệu iris (bỏ cột Species)
iris_features <- iris[, -5]
pca_result <- prcomp(iris_features, scale. = TRUE)

# Xem tóm tắt PCA
summary(pca_result)

Kết quả mẫu:

Importance of components:
                          PC1    PC2     PC3     PC4
Standard deviation     1.7084 0.9560 0.3831 0.1433
Proportion of Variance 0.7296 0.2285 0.0367 0.0051
Cumulative Proportion  0.7296 0.9581 0.9949 1.0000

Giải thích:

  • PC1 (Thành phần chính 1) giải thích 72.96% phương sai.
  • PC1 và PC2 cùng nhau giải thích 95.81% phương sai → Có thể giảm dữ liệu xuống còn 2 chiều mà vẫn giữ được phần lớn thông tin.

Trực quan hóa dữ liệu sau PCA:

# Tạo dữ liệu để vẽ biểu đồ
pca_data <- data.frame(pca_result$x[, 1:2], Species = iris$Species)

# Vẽ biểu đồ phân tán
ggplot(pca_data, aes(x = PC1, y = PC2, color = Species)) +
  geom_point(size = 3) +
  labs(title = "Dữ liệu Iris sau khi Giảm chiều bằng PCA",
       x = "Thành phần Chính 1 (PC1)",
       y = "Thành phần Chính 2 (PC2)") +
  theme_minimal()

Kết quả sẽ hiển thị một biểu đồ phân tán, trong đó các loài hoa được phân tách rõ ràng trên không gian 2 chiều (PC1 và PC2).

5. Bài tập Thực hành

Yêu cầu:

  • Xây dựng và tối ưu một mô hình Random Forest trên tập dữ liệu iris.
  • Thực hiện phân cụm K-Means trên tập dữ liệu iris và trực quan hóa kết quả.

Hướng dẫn chi tiết:

1. Xây dựng và tối ưu Random Forest: (Đã thực hiện ở trên).

2. Phân cụm K-Means và trực quan hóa:

# Chuẩn bị dữ liệu
iris_features <- iris[, -5]
iris_scaled <- scale(iris_features)

# Thực hiện K-Means
set.seed(123)
kmeans_model <- kmeans(iris_scaled, centers = 3, nstart = 20)

# Thêm kết quả phân cụm vào dữ liệu
iris$Cluster <- as.factor(kmeans_model$cluster)

# Trực quan hóa
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Cluster)) +
  geom_point(size = 3) +
  labs(title = "Phân cụm K-Means trên Dữ liệu Iris",
       x = "Chiều dài Đài hoa (Sepal.Length)",
       y = "Chiều rộng Đài hoa (Sepal.Width)") +
  theme_minimal()

Kết quả mong đợi:

  • Học viên sẽ thấy các cụm được hình thành và có thể so sánh với nhãn thực tế (Species).
  • Mô hình Random Forest sau khi tối ưu sẽ có độ chính xác cao hơn so với mô hình mặc định.

Công cụ/Gói sử dụng

  • randomForest: Để xây dựng mô hình Random Forest.
  • caret: Để tối ưu siêu tham số.
  • stats: Để thực hiện K-Means và PCA.
  • ggplot2: Để trực quan hóa dữ liệu.

Tóm tắt buổi học

Buổi 7 tập trung vào các kỹ thuật máy học nâng cao, bao gồm Random Forest, tối ưu siêu tham số, phân cụm K-Means, và giảm chiều dữ liệu bằng PCA. Học viên được thực hành trên tập dữ liệu iris, từ việc xây dựng mô hình, tối ưu hóa, đến phân tích dữ liệu không có nhãn. Đây là bước quan trọng để chuẩn bị cho các dự án thực tế ở buổi cuối cùng.

Leave a Reply

Your email address will not be published. Required fields are marked *