R语言中100次随机划分数据集的最优存储方案咨询
最优存储方案:用列表(List)而非单独变量
作为R语言新手,你遇到的这个问题其实很常见——当需要多次重复数据集划分时,选对存储方式能让后续的模型训练和分析省心太多。首先明确:绝对不推荐为每组划分创建单独变量(比如H1, H2...H100),原因很简单:
- 手动创建100个变量会让代码极度冗余,写起来麻烦
- 后续遍历、对比这些变量时,需要写大量重复代码,维护性极差
- 变量名过多会污染全局环境,容易出错
而列表(List)是最适合的存储方式,它能灵活收纳所有划分结果,且方便后续批量处理。下面给你两种具体实现方式,按需选择:
方式1:直接存储划分后的训练集和测试集
如果你的数据集不大,直接把每次划分好的完整数据集存在列表里,使用起来更直观:
library(rminer) # 初始化一个长度为100的空列表 holdout_results <- vector("list", 100) # 循环生成100次划分 for (i in 1:100) { # 执行划分,这里把ratio参数补全(比如设为0.7,即70%训练集) H <- holdout(myData$salary, ratio = 0.7) # 将当前划分的训练集、测试集存入列表 holdout_results[[i]] <- list( train_set = myData[H$tr, ], test_set = myData[H$ts, ] ) } # 调用示例:取第10次划分的训练集 holdout_results[[10]]$train_set
方式2:存储划分索引(更节省内存)
如果你的数据集很大,直接存完整数据集会占用过多内存,优先存储划分的索引(即holdout返回的tr和ts),后续需要时再从原数据集中提取:
library(rminer) holdout_indices <- vector("list", 100) for (i in 1:100) { H <- holdout(myData$salary, ratio = 0.7) # 只存索引,不存完整数据集 holdout_indices[[i]] <- list( train_idx = H$tr, test_idx = H$ts ) } # 调用示例:取第5次划分的测试集 test_set_5 <- myData[holdout_indices[[5]]$test_idx, ]
后续:找到最优划分的小技巧
存好所有划分后,你可以批量训练模型、评估性能,最终找到最优的那一组:
# 假设用随机森林模型,先加载包 library(randomForest) # 初始化向量存储每次划分的模型性能(比如均方误差MSE) mse_scores <- numeric(100) for (i in 1:100) { # 提取当前划分的训练/测试集(这里用索引方式举例) train_data <- myData[holdout_indices[[i]]$train_idx, ] test_data <- myData[holdout_indices[[i]]$test_idx, ] # 训练模型(假设salary是因变量,其他为自变量) rf_model <- randomForest(salary ~ ., data = train_data) # 预测并计算MSE predictions <- predict(rf_model, test_data) mse_scores[i] <- mean((test_data$salary - predictions)^2) } # 找到MSE最小的划分(即最优划分) best_split_idx <- which.min(mse_scores) best_train_set <- myData[holdout_indices[[best_split_idx]]$train_idx, ] best_test_set <- myData[holdout_indices[[best_split_idx]]$test_idx, ]
这样一套流程下来,你不仅能高效存储所有划分,还能轻松找到最优的训练/测试集组合,代码也整洁易维护。
内容的提问来源于stack exchange,提问作者Andira Gita
相关产品推荐
相关产品推荐

