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批量訓練的過程,可以大幅度節約內存使用。
【掃碼聯系老師領取報名表】
獲取備賽計劃,考前查缺補漏、重點沖刺
免費領取相關真題及解析,還有一對一學術活動規劃!


? 2025. All Rights Reserved. 滬ICP備2023009024號-1