回顧一下什么叫多輪建模:
要綜合判斷一個模型好不好,一次隨機抽樣是不行的,得多次抽樣建模,看看整體的性能如何才行(特別是對于這種小訓練集)。
所以我的思路是,隨機抽取訓練集和驗證集2000次(隨你),然后構建2000個ML模型(譬如2000個樸素貝葉斯),得出2000批性能參數。那怎么實現呢,下面上R語言代碼,以樸素貝葉斯為例:
library(caret)
library(e1071)
library(pROC)# 加載數據集
dataset <- read.csv("X disease code fs.csv")
cat("數據集加載成功。\n")
X <- dataset[, 2:14]
Y <- dataset[, 1]# 初始化結果數據框
results <- data.frame(Random_Seed = integer(),Sensitivity_Test = numeric(),Specificity_Test = numeric(),AUC_Test = numeric(),Sensitivity_Train = numeric(),Specificity_Train = numeric(),AUC_Train = numeric()
)
cat("結果數據框初始化完成。\n")# 遍歷隨機種子
for (n in 1:2000) {set.seed(n)cat("設置隨機種子為", n, "\n")# 劃分數據集trainIndex <- createDataPartition(Y, p = 0.7, list = FALSE)X_train <- X[trainIndex, ]X_test <- X[-trainIndex, ]y_train <- Y[trainIndex]y_test <- Y[-trainIndex]cat("數據集劃分為訓練集和測試集。\n")# 標準化特征preProcValues <- preProcess(X_train, method = c("center", "scale"))X_train <- predict(preProcValues, X_train)X_test <- predict(preProcValues, X_test)cat("特征標準化完成。\n")# 訓練樸素貝葉斯模型model <- naiveBayes(X_train, y_train)cat("樸素貝葉斯模型訓練完成。\n")# 進行預測y_pred <- predict(model, X_test)y_train_pred <- predict(model, X_train)cat("完成對訓練集和測試集的預測。\n")# 計算混淆矩陣cm_test <- confusionMatrix(as.factor(y_pred), as.factor(y_test))cm_train <- confusionMatrix(as.factor(y_train_pred), as.factor(y_train))cat("混淆矩陣計算完成。\n")# 計算AUC分數auc_test <- auc(as.numeric(y_test), as.numeric(y_pred))auc_train <- auc(as.numeric(y_train), as.numeric(y_train_pred))cat("AUC分數計算完成:測試集 =", auc_test, ",訓練集 =", auc_train, "\n")# 提取敏感性和特異性sen_test <- cm_test$byClass["Sensitivity"]sep_test <- cm_test$byClass["Specificity"]sen_train <- cm_train$byClass["Sensitivity"]sep_train <- cm_train$byClass["Specificity"]cat("敏感性和特異性提取完成。\n")# 追加結果results <- rbind(results, data.frame(Random_Seed = n,Sensitivity_Test = sen_test,Specificity_Test = sep_test,AUC_Test = auc_test,Sensitivity_Train = sen_train,Specificity_Train = sep_train,AUC_Train = auc_train))cat("第", n, "次迭代的結果已追加。\n")
}# 保存結果到CSV
write.csv(results, "jet_NB_par.csv", row.names = FALSE)
cat("結果已保存到jet_NB_par.csv。\n")
簡單解說:
(A)其實就是一個for循環語句,for (n in 1:2000) ,2000次就是2000,你要是想運行10000次,就改成10000;
(B)運行以后呢,可以看到模型在迭代,顯示的是運行到第幾個模型了:
(C)用代碼write.csv(results, "jet_NB_par.csv", row.names = FALSE)輸出成excel查看,輸出地址就是你的工作路徑,不懂的話可以使用代碼getwd()展示出來。
(D)打開工作路徑,可以發現jet_NB_par這個文件:
(E)打開文件,調整一下格式:
(F)然后可以操作了,比如test-sen排個序,看看最好的有多好;比如看看2000次的平均值和標準差:AUC平均值0.77-0.78左右。剩下的自己玩了,不說那么多了,發揮你們的妄想空間。