You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:27:02