R RasterBrick转数据框过大含大量0值,如何缩小以运行随机森林?
R栅格转数据框运行随机森林内存不足的优化方案
- 优化字段存储类型,删除无效数据
- 不要把分类字段转成字符型:你当前把NLCD、NLUD等分类字段转成
character类型,相同取值下字符型占用的内存是因子型的3-5倍,把这些字段转成factor类型即可,随机森林本身支持因子类型的分类特征输入,无需转字符。 - 压缩数值字段精度:人口、坡度、高度这类数值字段默认是double双精度存储,如果你不需要小数点后6位以上的精度,转成float单精度或者整型存储,内存占用可以直接减半。
- 过滤无效行:你提到数据绝大多数是全0值,这些样本不会给模型提供任何有效信息,直接删掉全0或者目标变量Height为0的行,数据量至少可以压缩70%以上。
- 不要把分类字段转成字符型:你当前把NLCD、NLUD等分类字段转成
- 避免全量栅格转数据框,提前抽样
随机森林的训练不需要用到全部5300万条观测,只要样本有足够代表性,抽5%-10%的非0样本训练效果和全量几乎没有差异。你可以直接在RasterBrick层面用sampleRandom或者sampleStratified函数抽样,只把抽出来的样本转成数据框,数据量直接降到百万级别,完全不会爆内存。 - 更换内存效率更高的工具链
- 用
terra包替代raster包处理栅格数据:terra是raster的开发者新推出的包,底层用C实现,内存占用只有raster的1/3左右,转数据框的效率也高很多。 - 用
data.table替代base的data.frame存储数据:同数据量下data.table的内存占用比data.frame小30%以上,后续的清洗、建模操作速度也快数倍。 - 用
ranger包做随机森林训练:ranger是随机森林的高效实现,内存占用远低于caret默认调用的randomForest包,还支持并行计算,处理百万级样本毫无压力。
- 用
另外你当前的拆分代码存在笔误:你生成的数据集命名是dts21b,但拆分时用的是df[Train,],就算内存足够也会报对象未找到的错误,记得修改。
内容的提问来源于stack exchange,提问作者Jay Antonio Oliver
相关产品推荐
相关产品推荐

