Kaggle学术活动中American Express风控赛需要预测客户未来是否会违约,赛题原始数据为50GB大小,那么如何减少内存的使用呢?
方法1:使用parquetApache Parquet是面向分析型业务的列式存储格式。Parquet是一种与语言无关的列式存储文件类型,可以适配多种计算框架。
Parquet是一种二进制文件,其中包含了各种针对其内容的元数据。在无需读取与解析文件内容的情况下,可以仅依靠元数据来确定文件中的列名称、压缩/编码方式、数据类型、乃至一些基本的统计类信息。
现在论坛已经有转换后的数据,压缩之后文件大小11GB左右,https://www.kaggle.com/datasets/odins0n/amex-parquet
方法2:选择小数位数原始数据集浮点字段包含了较多小数位,使用float32格式进行存储,比如:
0.5870422600496985
0.609056086399499
0.6149111732046417
通过信息熵可以确定的保留的位数,或者使用float16格式。
方法3:类别转化为categoryPandas中数据类型Category,Categories是没有大小顺序的。Categorical Data类型存储的不是数据本身,而是该数据对应的编码。这里使用Category,本质和Label encode的操作一致。
方法4:使用矩阵存储数据将数据从Dataframe转换为矩阵,这里可以选择Numpy或者稀疏矩阵存储,对内存也比较友好。
方法5:XGBoost DMatrixXGBoost在训练中可以传入DMatrix或者Dataframe,前者在内存上更加友好。
dtrain = xgb.DMatrix(X_train, y_train)
可以将数据集存储为libsvm格式,使用External Memory Version完成训练,或者从命令行训练。
https://xgboost.readthedocs.io/en/latest/tutorials/external_memory.html
使用LightGBM的自带的Dataset读取文件进行训练,比使用Numpy和Pandas数据更好。当然把内存数据转换为Dataset也有一定的效果。
https://lightgbm.readthedocs.io/en/latest/Python-Intro.html
设置histogram_pool_size参数控制内存使用,也可以减少num_leaves和max_bin的取值。
方法6:树模型微调XGBoost和LightGBM在API使用上,支持继续训练。因此可以将数据集拆分为多个文件,然后依次进行训练。
# save model to file
gbm.save_model('model.txt')
print('Dumping model to JSON...')
model_json = gbm.dump_model()
with open('model.json', 'w+') as f:
json.dump(model_json, f, indent=4)
# continue training
# init_model accepts:
gbm = lgb.train(params,
lgb_train,
num_boost_round=10,
init_model='model.txt',
valid_sets=lgb_eval)
print('Finished 10 - 20 rounds with model file...')
方法7:深度学习与TFRecord为了高效地读取数据,比较有帮助的一种做法是对数据进行序列化并将其存储在一组可线性读取的文件(每个文件 100-200MB)中。这尤其适用于通过网络进行流式传输的数据。这种做法对缓冲任何数据预处理也十分有用。
TFRecord格式是一种用于存储二进制记录序列的简单格式。协议缓冲区是一个跨平台、跨语言的库,用于高效地序列化结构化数据。协议消息由.proto文件定义,这通常是了解消息类型最简单的方法。
配合深度学习Batch批量训练的过程,可以大幅度节约内存使用。
【扫码联系老师领取报名表】
获取备赛计划,考前查缺补漏、重点冲刺
免费领取相关真题及解析,还有一对一学术活动规划!
© 2024. All Rights Reserved. 沪ICP备2023009024号-1