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.Length
vàPetal.Width
thường có tầm quan trọng cao trong việc phân loại loài hoairis
.
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
versicolor
vàvirginica
, 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.