Mac M2运行R语言随机森林模型遇内存耗尽问题求助
在MacBook Air M2(8GB内存/128GB存储)上运行R随机森林模型时遭遇内存耗尽错误
运行以下随机森林训练代码时,出现Error: vector memory exhausted (limit reached?)错误:
model <- train(CascadingDelay ~ ., data = train_data, method = "rf", trControl = trainControl(method = "cv", number = 10))
已尝试将训练集采样缩小至10000条记录,但问题仍未解决。
完整代码
# TEST library(dplyr) # 数据处理 library(caret) # 机器学习工具 # 选择分析所需列 selected_cols <- c("Year", "Month", "DayofMonth", "DayOfWeek", "DepTime", "CRSDepTime", "ArrTime", "CRSArrTime", "UniqueCarrier", "FlightNum", "Origin", "Dest", "Distance", "Cancelled", "CancellationCode") flight_data <- Flight_Details_2003 %>% select(selected_cols) # 创建延误变量,过滤取消航班和负延误记录 flight_data <- flight_data %>% mutate(DepDelay = DepTime - CRSDepTime) %>% filter(Cancelled == 0, DepDelay >= 0) # 按机场和日期汇总延误数据 airport_data <- flight_data %>% group_by(Year, Month, DayofMonth, Origin) %>% summarize(TotalDelay = sum(DepDelay)) # 自连接生成机场间延误关联矩阵 delay_matrix <- merge(airport_data, airport_data, by = c("Year", "Month", "DayofMonth")) # 创建级联延误标签:出发机场延误但到达机场无延误则标记为1 delay_matrix <- delay_matrix %>% mutate(CascadingDelay = ifelse(TotalDelay.x > 0 & TotalDelay.y == 0, 1, 0)) # 预处理机器学习数据集 # 删除无关列 delay_matrix <- delay_matrix %>% select(-c("TotalDelay.x", "TotalDelay.y")) # 将目标变量转为因子类型 delay_matrix$CascadingDelay <- factor(delay_matrix$CascadingDelay, levels = c(0,1), labels = c("No", "Yes")) # 划分训练集和测试集 set.seed(123) train_index <- createDataPartition(delay_matrix$CascadingDelay, p = 0.7, list = FALSE) train_data <- delay_matrix[train_index,] test_data <- delay_matrix[-train_index,] # 尝试采样缩小训练集以解决内存耗尽问题 set.seed(123) sample_size <- 10000 train_data_sample <- train_data[sample(seq_len(nrow(train_data)), size = sample_size), ] # 训练随机森林模型 model <- train(CascadingDelay ~ ., data = train_data, method = "rf", trControl = trainControl(method = "cv", number = 10)) # 评估模型准确率 confusionMatrix(model, test_data$CascadingDelay)
原始数据集Flight_Details_2003结构
> str(Flight_Details_2003) 'data.frame': 6488540 obs. of 29 variables: $ Year : int 2003 2003 2003 2003 2003 2003 2003 2003 2003 2003 ... $ Month : int 1 1 1 1 1 1 1 1 1 1 ... $ DayofMonth : int 29 30 31 1 2 3 4 5 6 1 ... $ DayOfWeek : int 3 4 5 3 4 5 6 7 1 3 ... $ DepTime : int 1651 1654 1724 1033 1053 1031 1031 1035 1031 1713 ... $ CRSDepTime : int 1655 1655 1655 1035 1035 1035 1035 1035 1035 1710 ... $ ArrTime : int 1912 1910 1936 1625 1726 1640 1626 1636 1653 1851 ... $ CRSArrTime : int 1913 1913 1913 1634 1634 1634 1634 1634 1634 1847 ... $ UniqueCarrier : chr "UA" "UA" "UA" "UA" ... $ FlightNum : int 1017 1017 1017 1018 1018 1018 1018 1018 1018 1020 ... $ TailNum : chr "N202UA" "N311UA" "N317UA" "N409UA" ... $ ActualElapsedTime: int 141 136 132 232 273 249 235 241 262 98 ... $ CRSElapsedTime : int 138 138 138 239 239 239 239 239 239 97 ... $ AirTime : int 119 108 110 215 214 223 219 227 241 62 ... $ ArrDelay : int -1 -3 23 -9 52 6 -8 2 19 4 ... $ DepDelay : int -4 -1 29 -2 18 -4 -4 0 -4 3 ... $ Origin : chr "ORD" "ORD" "ORD" "OAK" ... $ Dest : chr "MSY" "MSY" "MSY" "ORD" ... $ Distance : int 837 837 837 1835 1835 1835 1835 1835 1835 413 ... $ TaxiIn : int 5 2 5 6 13 13 5 5 7 7 ... $ TaxiOut : int 17 26 17 11 46 13 11 9 14 29 ... $ Cancelled : int 0 0 0 0 0 0 0 0 0 0 ... $ CancellationCode : chr NA NA NA NA ... $ Diverted : int 0 0 0 0 0 0 0 0 0 0 ... $ CarrierDelay : int NA NA NA NA NA NA NA NA NA NA ... $ WeatherDelay : int NA NA NA NA NA NA NA NA NA NA ... $ NASDelay : int NA NA NA NA NA NA NA NA NA NA ... $ SecurityDelay : int NA NA NA NA NA NA NA NA NA NA ... $ LateAircraftDelay: int NA NA NA NA NA NA NA NA NA NA ...
解决内存耗尽问题的可行方案
1. 修正采样数据集的使用
你已经生成了采样后的train_data_sample,但训练模型时仍在使用原训练集train_data,这是核心问题。修改训练代码为:
model <- train(CascadingDelay ~ ., data = train_data_sample, method = "rf", trControl = trainControl(method = "cv", number = 10))
2. 优化随机森林参数降低内存占用
- 减少决策树数量:通过
ntree参数将默认的500棵树降至100棵 - 限制树的深度:用
maxdepth参数控制单棵树的最大深度,避免过度生长 - 减少分裂特征数:
mtry参数控制每棵树分裂时随机选取的特征数,分类任务可设为特征数的1/3
示例代码:
model <- train(CascadingDelay ~ ., data = train_data_sample, method = "rf", trControl = trainControl(method = "cv", number = 10), ntree = 100, maxdepth = 10, mtry = 3)
3. 优化数据预处理
- 控制自连接后的数据规模:
merge(airport_data, airport_data, ...)会让数据量膨胀为机场数量的平方,可缩小时间范围(如仅取1个月数据)或过滤低流量机场 - 转换分类变量为因子:将
UniqueCarrier、Origin、Dest等字符型变量转为因子,减少内存占用:
delay_matrix <- delay_matrix %>% mutate(across(c(UniqueCarrier, Origin, Dest), factor))
4. 调整R的内存限制(macOS)
在终端执行以下命令后重启R,允许R使用更多虚拟内存:
export R_MAX_VSIZE=32000000000
该命令将最大内存限制设为32GB,系统会自动调用磁盘补充内存。
5. 使用更高效的随机森林实现
改用ranger包替代caret的rf方法,它的内存效率和运行速度都更优:
library(ranger) model <- ranger(CascadingDelay ~ ., data = train_data_sample, num.trees = 100, max.depth = 10, mtry = 3, cv.folds = 10)
内容的提问来源于stack exchange,提问作者Joseph Ng
相关产品推荐
相关产品推荐

