基于R 4.2.2版本演示
一、写在前面
有不少大佬问做机器学习分类能不能用R语言,不想学Python咯。
答曰:可!用GPT或者Kimi转一下就得了呗。
加上最近也没啥内容写了,就帮各位搬运一下吧。
二、R代码实现Ababoost分类
(1)导入数据
我习惯用RStudio自带的导入功能:


(2)建立Ababoost模型(默认参数)
- # Load necessary libraries
- library(caret)
- library(pROC)
- library(ggplot2)
-
- # Assume 'data' is your dataframe containing the data
- # Set seed to ensure reproducibility
- set.seed(123)
-
- # Split data into training and validation sets (80% training, 20% validation)
- trainIndex <- createDataPartition(data$X, p = 0.8, list = FALSE)
- trainData <- data[trainIndex, ]
- validData <- data[-trainIndex, ]
-
- # Convert the target variable to a factor for classification
- trainData$X <- as.factor(trainData$X)
- validData$X <- as.factor(validData$X)
-
- # Define control method for training with cross-validation
- trainControl <- trainControl(method = "cv", number = 10)
-
- # Fit Random Forest model on the training set
- model <- train(X ~ ., data = trainData, method = "ada", trControl = trainControl)
-
- # Print the best parameters found by the model
- best_params <- model$bestTune
- cat("The best parameters found are:\n")
- print(best_params)
-
- # Predict on the training and validation sets
- trainPredict <- predict(model, trainData, type = "prob")[,2]
- validPredict <- predict(model, validData, type = "prob")[,2]
-
- # Calculate ROC curves and AUC values
- trainRoc <- roc(response = trainData$X, predictor = trainPredict)
- validRoc <- roc(response = validData$X, predictor = validPredict)
-
- # Plot ROC curves with AUC values
- ggplot(data = data.frame(fpr = trainRoc$specificities, tpr = trainRoc$sensitivities), aes(x = 1 - fpr, y = tpr)) +
- geom_line(color = "blue") +
- geom_area(alpha = 0.2, fill = "blue") +
- geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "black") +
- ggtitle("Training ROC Curve") +
- xlab("False Positive Rate") +
- ylab("True Positive Rate") +
- annotate("text", x = 0.5, y = 0.1, label = paste("Training AUC =", round(auc(trainRoc), 2)), hjust = 0.5, color = "blue")
-
- ggplot(data = data.frame(fpr = validRoc$specificities, tpr = validRoc$sensitivities), aes(x = 1 - fpr, y = tpr)) +
- geom_line(color = "red") +
- geom_area(alpha = 0.2, fill = "red") +
- geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "black") +
- ggtitle("Validation ROC Curve") +
- xlab("False Positive Rate") +
- ylab("True Positive Rate") +
- annotate("text", x = 0.5, y = 0.2, label = paste("Validation AUC =", round(auc(validRoc), 2)), hjust = 0.5, color = "red")
-
- # Calculate confusion matrices based on 0.5 cutoff for probability
- confMatTrain <- table(trainData$X, trainPredict >= 0.5)
- confMatValid <- table(validData$X, validPredict >= 0.5)
-
- # Function to plot confusion matrix using ggplot2
- plot_confusion_matrix <- function(conf_mat, dataset_name) {
- conf_mat_df <- as.data.frame(as.table(conf_mat))
- colnames(conf_mat_df) <- c("Actual", "Predicted", "Freq")
-
- p <- ggplot(data = conf_mat_df, aes(x = Predicted, y = Actual, fill = Freq)) +
- geom_tile(color = "white") +
- geom_text(aes(label = Freq), vjust = 1.5, color = "black", size = 5) +
- scale_fill_gradient(low = "white", high = "steelblue") +
- labs(title = paste("Confusion Matrix -", dataset_name, "Set"), x = "Predicted Class", y = "Actual Class") +
- theme_minimal() +
- theme(axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5))
-
- print(p)
- }
-
- # Now call the function to plot and display the confusion matrices
- plot_confusion_matrix(confMatTrain, "Training")
- plot_confusion_matrix(confMatValid, "Validation")
-
- # Extract values for calculations
- a_train <- confMatTrain[1, 1]
- b_train <- confMatTrain[1, 2]
- c_train <- confMatTrain[2, 1]
- d_train <- confMatTrain[2, 2]
-
- a_valid <- confMatValid[1, 1]
- b_valid <- confMatValid[1, 2]
- c_valid <- confMatValid[2, 1]
- d_valid <- confMatValid[2, 2]
-
- # Training Set Metrics
- acc_train <- (a_train + d_train) / sum(confMatTrain)
- error_rate_train <- 1 - acc_train
- sen_train <- d_train / (d_train + c_train)
- sep_train <- a_train / (a_train + b_train)
- precision_train <- d_train / (b_train + d_train)
- F1_train <- (2 * precision_train * sen_train) / (precision_train + sen_train)
- MCC_train <- (d_train * a_train - b_train * c_train) / sqrt((d_train + b_train) * (d_train + c_train) * (a_train + b_train) * (a_train + c_train))
- auc_train <- roc(response = trainData$X, predictor = trainPredict)$auc
-
- # Validation Set Metrics
- acc_valid <- (a_valid + d_valid) / sum(confMatValid)
- error_rate_valid <- 1 - acc_valid
- sen_valid <- d_valid / (d_valid + c_valid)
- sep_valid <- a_valid / (a_valid + b_valid)
- precision_valid <- d_valid / (b_valid + d_valid)
- F1_valid <- (2 * precision_valid * sen_valid) / (precision_valid + sen_valid)
- MCC_valid <- (d_valid * a_valid - b_valid * c_valid) / sqrt((d_valid + b_valid) * (d_valid + c_valid) * (a_valid + b_valid) * (a_valid + c_valid))
- auc_valid <- roc(response = validData$X, predictor = validPredict)$auc
-
- # Print Metrics
- cat("Training Metrics\n")
- cat("Accuracy:", acc_train, "\n")
- cat("Error Rate:", error_rate_train, "\n")
- cat("Sensitivity:", sen_train, "\n")
- cat("Specificity:", sep_train, "\n")
- cat("Precision:", precision_train, "\n")
- cat("F1 Score:", F1_train, "\n")
- cat("MCC:", MCC_train, "\n")
- cat("AUC:", auc_train, "\n\n")
-
- cat("Validation Metrics\n")
- cat("Accuracy:", acc_valid, "\n")
- cat("Error Rate:", error_rate_valid, "\n")
- cat("Sensitivity:", sen_valid, "\n")
- cat("Specificity:", sep_valid, "\n")
- cat("Precision:", precision_valid, "\n")
- cat("F1 Score:", F1_valid, "\n")
- cat("MCC:", MCC_valid, "\n")
- cat("AUC:", auc_valid, "\n")
在R语言中,使用 caret 包训练Ababoost模型时,最关键的可调参数不多,下面是一些可以调整的关键参数:
①Iter: 这是最重要的参数之一,代表弱学习器的数量,即AdaBoost算法中的迭代次数。较大的nIter值通常可以提高模型的复杂度和拟合能力,但也可能导致过拟合。
②maxdepth: 这是决策树的最大深度。AdaBoost通常使用决策树作为其弱学习器。通过调整maxdepth可以控制单个决策树的复杂度,从而影响整个集成模型的复杂度。
③nu: 这个参数是学习率(也称为收缩参数或步长)。它用于更新每次迭代中模型权重。较小的nu值可以使模型学习得更加谨慎,通常可以减少过拟合的风险,但可能需要更多的迭代次数来收敛。
结果输出(默认参数):

在默认参数中,caret包已经默默帮我们吧上面三个参数进行测试和寻优。





从AUC来看,Ababoost随便一跑,就跑出个不错的结果。不过有些过拟合了,验证集的性能稍微差些。
三、Ababoost手动调参方法(3个值)
设置iter值取值50、100、200、400、600;maxdepth取值1、2、5、7和9;nu取值0.01、0.1、0.5:
- # Load necessary libraries
- library(caret)
- library(pROC)
- library(ggplot2)
-
- # Assume 'data' is your dataframe containing the data
- # Set seed to ensure reproducibility
- set.seed(123)
-
- # Split data into training and validation sets (80% training, 20% validation)
- trainIndex <- createDataPartition(data$X, p = 0.8, list = FALSE)
- trainData <- data[trainIndex, ]
- validData <- data[-trainIndex, ]
-
- # Convert the target variable to a factor for classification
- trainData$X <- as.factor(trainData$X)
- validData$X <- as.factor(validData$X)
-
- # Define control method for training with cross-validation
- trainControl <- trainControl(method = "cv", number = 10)
-
- # Define the tuning grid with correct parameter names
- tuneGrid <- expand.grid(iter = c(50, 100, 200, 400, 600),
- maxdepth = c(1, 2, 5, 7, 9),
- nu = c(0.01, 0.1, 0.5))
-
- # Train the model using the ada method and the corrected tuning grid
- model <- train(X ~ ., data = trainData, method = "ada", trControl = trainControl, tuneGrid = tuneGrid)
-
-
- # Print the best parameters found by the model
- best_params <- model$bestTune
- cat("The best parameters found are:\n")
- print(best_params)
-
- # Predict on the training and validation sets
- trainPredict <- predict(model, trainData, type = "prob")[,2]
- validPredict <- predict(model, validData, type = "prob")[,2]
-
- # Calculate ROC curves and AUC values
- trainRoc <- roc(response = trainData$X, predictor = trainPredict)
- validRoc <- roc(response = validData$X, predictor = validPredict)
-
- # Plot ROC curves with AUC values
- ggplot(data = data.frame(fpr = trainRoc$specificities, tpr = trainRoc$sensitivities), aes(x = 1 - fpr, y = tpr)) +
- geom_line(color = "blue") +
- geom_area(alpha = 0.2, fill = "blue") +
- geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "black") +
- ggtitle("Training ROC Curve") +
- xlab("False Positive Rate") +
- ylab("True Positive Rate") +
- annotate("text", x = 0.5, y = 0.1, label = paste("Training AUC =", round(auc(trainRoc), 2)), hjust = 0.5, color = "blue")
-
- ggplot(data = data.frame(fpr = validRoc$specificities, tpr = validRoc$sensitivities), aes(x = 1 - fpr, y = tpr)) +
- geom_line(color = "red") +
- geom_area(alpha = 0.2, fill = "red") +
- geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "black") +
- ggtitle("Validation ROC Curve") +
- xlab("False Positive Rate") +
- ylab("True Positive Rate") +
- annotate("text", x = 0.5, y = 0.2, label = paste("Validation AUC =", round(auc(validRoc), 2)), hjust = 0.5, color = "red")
-
- # Calculate confusion matrices based on 0.5 cutoff for probability
- confMatTrain <- table(trainData$X, trainPredict >= 0.5)
- confMatValid <- table(validData$X, validPredict >= 0.5)
-
- # Function to plot confusion matrix using ggplot2
- plot_confusion_matrix <- function(conf_mat, dataset_name) {
- conf_mat_df <- as.data.frame(as.table(conf_mat))
- colnames(conf_mat_df) <- c("Actual", "Predicted", "Freq")
-
- p <- ggplot(data = conf_mat_df, aes(x = Predicted, y = Actual, fill = Freq)) +
- geom_tile(color = "white") +
- geom_text(aes(label = Freq), vjust = 1.5, color = "black", size = 5) +
- scale_fill_gradient(low = "white", high = "steelblue") +
- labs(title = paste("Confusion Matrix -", dataset_name, "Set"), x = "Predicted Class", y = "Actual Class") +
- theme_minimal() +
- theme(axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5))
-
- print(p)
- }
-
- # Now call the function to plot and display the confusion matrices
- plot_confusion_matrix(confMatTrain, "Training")
- plot_confusion_matrix(confMatValid, "Validation")
-
- # Extract values for calculations
- a_train <- confMatTrain[1, 1]
- b_train <- confMatTrain[1, 2]
- c_train <- confMatTrain[2, 1]
- d_train <- confMatTrain[2, 2]
-
- a_valid <- confMatValid[1, 1]
- b_valid <- confMatValid[1, 2]
- c_valid <- confMatValid[2, 1]
- d_valid <- confMatValid[2, 2]
-
- # Training Set Metrics
- acc_train <- (a_train + d_train) / sum(confMatTrain)
- error_rate_train <- 1 - acc_train
- sen_train <- d_train / (d_train + c_train)
- sep_train <- a_train / (a_train + b_train)
- precision_train <- d_train / (b_train + d_train)
- F1_train <- (2 * precision_train * sen_train) / (precision_train + sen_train)
- MCC_train <- (d_train * a_train - b_train * c_train) / sqrt((d_train + b_train) * (d_train + c_train) * (a_train + b_train) * (a_train + c_train))
- auc_train <- roc(response = trainData$X, predictor = trainPredict)$auc
-
- # Validation Set Metrics
- acc_valid <- (a_valid + d_valid) / sum(confMatValid)
- error_rate_valid <- 1 - acc_valid
- sen_valid <- d_valid / (d_valid + c_valid)
- sep_valid <- a_valid / (a_valid + b_valid)
- precision_valid <- d_valid / (b_valid + d_valid)
- F1_valid <- (2 * precision_valid * sen_valid) / (precision_valid + sen_valid)
- MCC_valid <- (d_valid * a_valid - b_valid * c_valid) / sqrt((d_valid + b_valid) * (d_valid + c_valid) * (a_valid + b_valid) * (a_valid + c_valid))
- auc_valid <- roc(response = validData$X, predictor = validPredict)$auc
-
- # Print Metrics
- cat("Training Metrics\n")
- cat("Accuracy:", acc_train, "\n")
- cat("Error Rate:", error_rate_train, "\n")
- cat("Sensitivity:", sen_train, "\n")
- cat("Specificity:", sep_train, "\n")
- cat("Precision:", precision_train, "\n")
- cat("F1 Score:", F1_train, "\n")
- cat("MCC:", MCC_train, "\n")
- cat("AUC:", auc_train, "\n\n")
-
- cat("Validation Metrics\n")
- cat("Accuracy:", acc_valid, "\n")
- cat("Error Rate:", error_rate_valid, "\n")
- cat("Sensitivity:", sen_valid, "\n")
- cat("Specificity:", sep_valid, "\n")
- cat("Precision:", precision_valid, "\n")
- cat("F1 Score:", F1_valid, "\n")
- cat("MCC:", MCC_valid, "\n")
- cat("AUC:", auc_valid, "\n")
结果输出:

以上是找到的相对最优参数组合,看看具体性能:



还不让入默认的性能好呢。
看看GPT给的参数的取值建议,祝各位调得开心:
iter (迭代次数): 这个参数通常设置在10到1000之间。较小的数据集可能需要较少的迭代,而较大或较复杂的数据集可能需要更多的迭代。通常开始可以尝试50, 100, 200等值,然后根据模型的性能来调整。
maxdepth (树的最大深度): 这个参数一般设置在1到10之间。深度为1意味着使用决策树桩(仅一个决策点),这有助于防止过拟合,是AdaBoost中常用的设置。但对于更复杂的数据模式,可能需要更深的树。可以尝试的值包括1, 2, 3, 5等。
nu (学习率): 学习率的典型取值范围是0.01到1。较小的学习率(如0.01, 0.1)可以使模型学习得更稳健,但收敛速度可能较慢,需要更多的迭代次数。较高的学习率可以加快学习速度,但可能导致模型在训练过程中不稳定。
四、最后
数据嘛:
链接:https://pan.baidu.com/s/1rEf6JZyzA1ia5exoq5OF7g?pwd=x8xm
提取码:x8xm