无法装入内存的大数据集的预测建模

数据挖掘 机器学习 Python scikit-学习 决策树
2021-09-17 23:15:04

我正在尝试在本地计算机上大小约为 10G 的数据集之上构建决策树模型。但是,我只有8G内存。我现在所做的只是对数据的某些子集进行随机抽样,尝试不同的模型参数并使用 scikit-learn 包检查预测性能。我仍然需要基于这些随机采样结果的模型参数的最终模型,但显然我无法在完整数据集之上构建模型。这个问题我该怎么办?我是机器学习的新手,欢迎提出任何建议。谢谢!

4个回答

无论您是将其用于爱好还是工作,我都会推荐 Amazon Web Services 上的 EMR。这个名字是不合时宜的(它不再只是 map reduce),但 EMR 使您能够快速建立一个由多台机器组成的 Apache Spark 集群。Spark 带有用于构建树的机器学习库,并且可以扩展到您需要的任意数量的机器(以至于您不再面临内存限制)。EMR 很便宜,因为您按小时收费并且不必购买自己的硬件。Apache Spark 非常适合你的简历,它也是一项实用技能,因为它通常是大多数数据科学家在处理对于单台机器来说太大的数据集时首先使用的工具。

由于您使用的是 Python 和 scikit-learn,您可以查看以下在线学习算法之一:

  • sklearn.naive_bayes.MultinomialNB
  • sklearn.naive_bayes.BernoulliNB
  • sklearn.linear_model.Perceptron
  • sklearn.linear_model.PassiveAggressiveClassifier
  • sklearn.linear_model.SGDClassifier

  • sklearn.linear_model.PassiveAggressiveRegressor

  • sklearn.linear_model.SGDRegressor

所有这些在线学习算法(特别是使用 SGD)都允许通过内存一次一个条目地流式传输数据。对于这种方法,您的记忆将绰绰有余。在 scikit-learn 中,这是通过partial_fit()方法实现的。可以在 scikit-learn 用户指南中找到更多关于这种非核心方法的信息。

如果你想坚持基于树的算法,你可以看看 xgboost 包,它还允许通过内存流式传输数据。但是,这种方法涉及更多一点,因为它只接受 LIBSVM 格式的数据,以便在为xgboost保留的内存缓存中解析它。此外,它不允许进行参数调整,因为 xgboost 适用于 numpy 对象,并且从 LIBSVM 转换为 numpy 会将数据从缓存转储到主内存,因此无法扩展。

您还可以使用Databricks 社区版 ,它可以让您启动 Spark 集群(免费版的大小有限),您可以在其中运行 pyspark 或纯 python 脚本。

通常,更多的训练示例意味着学习的改进,但如果您只是在具有足够训练示例的数据集子集上拟合一个好的算法,您也可以获得非常好的(并且接近最佳分数)。在当前情况下,您可以执行以下操作:

  • 取数据的一个子集,比如 4-5GB。您唯一需要考虑的是,您的目标标签应该在子集中几乎分层,否则模型将表现不佳。

  • 将 PCA 应用于您的数据并尽量减少特征数量。在您的数据子集中,可能有一些只是冗余的特征。

  • 在您当前的子集上应用最适合您的数据集的算法。您可能需要为此做一些研究。

最重要的是,我建议一件事。在本地机器上训练如此庞大的数据集可能会非常痛苦。因此,最好将模型部署在 AWS 或他们在云上提供的 Google 机器学习平台上。

我希望它有帮助!

您需要使用一种不会同时将所有示例加载到内存中的算法。使用随机梯度下降(一个很好的实现是 Vowpal Wabbit)。