在xgboost中将numpy数组转换为DMatrix

yan*_*hen 5 pandas scikit-learn xgboost

我想将我的数组训练集和标签转换为 DMatrix 进行训练。

dtrain = xgb.DMatrix(x_train, label=y_train)
Run Code Online (Sandbox Code Playgroud)

这里x_train.shape = (13619575, 45)

但是当我运行这段代码时,jupyter笔记本内核崩溃了,而我的内存仍然有8GB。

我试图将其减少到 70% 的记录。但它还是崩溃了。有什么办法可以解决吗?

谢谢。

小智 0

这与此问题相关: https ://github.com/dmlc/xgboost/issues/163

numpy 和 xgb.DMatrix 之间会存在重复的内存复制,如果想节省内存,请尝试将数据转换为 LibSVM 格式,并且 xgb.DMatrix 支持从 textformat 直接加载,无需涉及 numpy。或者干脆使用具有更多 RAM 的机器。

您可以使用 dump_svmlight_file 转储为 SVM 文件格式

这里给出的示例: https ://www.kaggle.com/c/telstra-recruiting-network/discussion/18223

import pandas as pd
import numpy as np
from sklearn.datasets import dump_svmlight_file

df = pd.DataFrame()
df['Id'] = np.arange(10)
df['F1'] = np.random.rand(10,)
df['F2'] = np.random.rand(10,)
df['Target'] = map(lambda x: -1 if x < 0.5 else 1, np.random.rand(10,))

X = df[np.setdiff1d(df.columns,['Id','Target'])]
y = df.Target

print df

dump_svmlight_file(X,y,'smvlight.dat',zero_based=True,multilabel=False)
Run Code Online (Sandbox Code Playgroud)

虽然我现在有一个问题:对于 4Gb 数据集来说转储非常慢,但必须存在更快的方法。