大数据集的机器学习最佳实践

数据挖掘 机器学习 预测建模 大数据
2021-09-20 04:05:55

我即将从我的硕士毕业,并且已经了解了机器学习并使用它进行了研究项目。我想知道在使用大数据集(如 100 GB 或 TB)执行机器学习任务时行业中的最佳实践。感谢其他数据科学家是否可以分享他们的经验。以下是我的问题:

  1. 显然,非常大的数据集需要更长的时间来训练(可能是几天或几周)。很多时候我们需要训练各种模型(SVM、神经网络等)来比较并找到性能更好的模型。我怀疑,在行业项目中,我们希望尽快获得结果,但要产生最佳性能。有什么减少培训和测试时间的技巧吗?如果您建议对数据集进行子集化,我将有兴趣了解如何最好地对数据集进行子集化以涵盖数据集中的所有或大部分场景。
  2. 我们知道执行交叉验证会更好,因为它可以减少过度拟合。但是,交叉验证也需要时间来训练,使用交叉验证训练的模型可能无法直接实现(从 python sklearn 的经验说:我需要在交叉验证测试后再次使用数据集训练模型才能实现)。你通常在你的大数据项目中进行交叉验证还是通过训练测试拆分?

感谢反馈。

2个回答

我将列出一些我发现有用的做法,希望这会有所帮助:

  1. 无论数据是否庞大,在构建任何模型时都必须进行交叉验证。如果这比最终消费者愿意等待的时间更长,您可能需要重新设定他们的期望,或者获得更快的硬件/软件来构建模型;但不要跳过交叉验证。绘制学习曲线和交叉验证是帮助指导我们的有效步骤,以便我们在流程的早期识别和纠正错误。在我运行交叉折叠验证并发现算法在不同折叠上的性能存在很大差异之前,我遇到过简单的训练测试集没有发现任何问题的情况。

  2. 在确定数据集大小之前,请消除关键变量和异常值缺失值、高度相关变量列和方差接近零的变量的记录。这将使您更好地估计真实可用的数据集。有时,您最终可能只会得到可用于构建模型的可用数据集的一小部分。

  3. 在为构建模型确定数据集的大小时,如果按行和列枚举数据集以及最终数字矩阵的内存大小,则更容易估计计算资源。由于每个机器学习算法最终都会将数据集转换为数值矩阵,因此以 GB/TB 的原始输入数据(可能主要是字符串/文本标称变量等)来枚举数据集大小通常会产生误导,并且数据集似乎比实际使用起来更加艰巨和庞大。

  4. 一旦您知道(或估计)数据集的最终可用大小,请检查您是否有合适的机器能够将其加载到内存中并训练模型。如果您的数据集大小小于软件可用/可用的内存,那么您无需再担心大小。

  5. 如果数据集大小大于可用于训练模型的内存,那么您可以尝试以下方法(首先从最简单的方法开始):

    • 使用具有更多内存的机器:如果您使用的是云服务提供商,那么最简单的方法可能就是提供更多内存并像往常一样继续构建模型。对于物理机器,尝试购买额外的 RAM,它的价格会继续降低,如果你的数据集会随着时间的推移保持这么大或变得更大,那么这是一项很好的投资。
    • 向集群添加节点:对于基于 Hadoop 和 Spark 的集群计算部署,在更大的数据集上进行训练就像向集群添加更多机器一样容易。
    • 分类任务通常需要对具有高度不平衡类的数据进行训练,正负类的比例有时可能高达 1:1000 或更多。在这些情况下提高准确性的一种直接方法是对少数类进行过度采样或对多数类进行欠采样,或者两者一起进行。如果你有一个大数据集,对多数类进行欠采样是一个很好的选择,它可以提高算法的准确性并减少训练时间。
    • 构建一个集成:随机拆分数据集并在每个部分上训练几个基础学习器,然后将它们组合起来以获得最终预测。这将最有效地利用大型数据集并生成更准确的模型。但是你需要花更多的时间来仔细地构建 ensemble 并远离 ensemble 构建的常见陷阱。
    • 如果您使用的是集成,请并行训练许多单线程模型。几乎所有 ML 软件都提供了在不同内核或单独节点上训练多个模型的功能。
    • 根据针对特定数据集训练它们所花费的时间与它们的准确性来评估多种不同的算法。虽然没有通用的答案,但我发现在使用嘈杂的数据时,SVM 的训练时间比精心构建的正则化回归模型集合要长得多,但性能可能只会稍微准确一些;与 CART 树相比,构建良好的神经网络可能需要很长时间来训练,但比树的性能要准确得多。
    • 为了减少构建模型所花费的时间,请尝试尽可能多地自动化该过程。花几个小时自动化一个复杂的容易出错的手动任务可能会在项目后期为您的团队节省一百个小时。
    • 如果可用,请使用那些使用并行处理、稀疏矩阵和缓存感知计算的算法实现,这些可以显着减少处理时间。例如,使用 xgboost 代替 GBM 的单核实现。
    • 如果没有其他方法,请在较小的数据集上训练模型;正如 Emre 在他的回答中所建议的那样,使用学习曲线来确定训练模型所需的最小样本量,添加比这个大小更多的训练记录并不会显着提高模型的准确性。这是一篇探讨这种情况的好文章 - largetrain.pdf

问题是,要使模型饱和需要多少数据?要确定这一点,您可以使用不同数量的数据绘制学习曲线,可能按一个常数因子按比例放大/缩小大小。如果对所有数据进行培训不可行,学习曲线可以帮助您做出明智的权衡。

模型饱和度也可以通过交叉验证发挥作用。如果您未接近饱和,则使用少量折叠会给您带来悲观的性能数据,因为您将使用比它可以使用的更少的数据来训练您的模型。

最后,相反,您可以使用更复杂的模型,而不是“调整”数据大小以适应模型。

欢迎来到 DataScience.SE。