python - 将数据加载到 Catboost Pool 对象中

标签 python pandas parquet catboost catboostregressor

我正在训练 Catboost 模型并使用 Pool 对象,如下所示:

pool = Pool(data=x_train, label=y_train, cat_features=cat_cols)
eval_set = Pool(data=x_validation, label=y_validation['Label'], cat_features=cat_cols)

model.fit(pool, early_stopping_rounds=EARLY_STOPPING_ROUNDS, eval_set=eval_set)

对于x_trainy_trainx_validationy_validation,它们来自Pandas DataFrame type (数据集保存为 Parquet 文件,我使用 PyArrow 将它们读入数据帧)。 model 是一个 Catboost 分类器/回归器。

我正在尝试针对大型数据集进行优化,我的问题是:

  1. 当将数据集读取到 Pandas DataFrame(使用 PyArrow),然后创建 Pool 对象时,我实际上是否将用于存储数据集的内存量增加了一倍?据我了解,他们复制数据来构建池,并且这不是引用。
  2. 是否有更有效的方法来创建池?例如直接从 libsvm 文件加载它?就像这里提到的https://catboost.ai/docs/concepts/python-usages-examples.html#load-the-dataset-from-a-file
  3. 有什么方法可以批量将数据加载到Pool中吗?并且一开始就不将所有内容加载到内存中?

最佳答案

  1. 是的,不幸的是,所使用的 RAM 量增加了一倍,因此最好先将数据转换为 Catboost 可以理解的文件格式,然后从文件创建池。为什么 Catboost 使用额外的 RAM - 来量化数据集。您可以从大 Pandas 数据帧(必须加载到 RAM 中)准备一个池,删除 df,量化池,如果您认为以后必须重复训练,则保存它。请注意,您只能保存量化池。如果这样做,请始终说量化边界,否则,您将无法创建辅助数据集(如验证数据集),因为它们需要相同的量化。像 csv/tsv Catboost 这样的简单文件格式可以直接从磁盘读取(并量化,它们在直到模块中有一个辅助函数)。
  2. 是的,正如您引用的那样。
  3. 您可以使用 batch training 手动加载批处理或者选择 training continuation 。两者都可以达到你的目的,我已经尝试过了。训练继续看起来更简单(因为您只需提供 init_model),但您将无法在 GPU 上进行训练(至少目前如此)。另外,您将仅限于对称树,并且对超参数还有更多限制。通过批量训练,您可以使用 GPU。

关于python - 将数据加载到 Catboost Pool 对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67981836/

相关文章:

python - 在python中生成序列的第30亿个元素

python - 将时间序列数据拆分为一行中的时间间隔 (PythonicWay) - 每小时

r - 如何使用 arrow::open_dataset 连接到 Azure Blob 存储中的 Parquet 文件?

regex - Pandas Starts 有多个选项

c++ - 从大型 github 项目链接共享库

hadoop - 使用 -query 和 --as-parquetfile 运行 Sqoop : java. lang.NullPointerException 时出现异常

python - 用 BeautifulSoup 抓取网站 : TypeError: 'NoneType' object is not callable

python - 如何将虚拟环境从服务器复制/克隆到本地计算机

python - 检查同一列中是否有相似的字符串

Python:打印 Pandas dataframe 返回 numpy.ndarray 属性错误