在(不是那么)大型数据集上进行线性回归的技术堆栈

数据挖掘 机器学习 r 线性回归
2022-02-10 13:02:41

在参加 Coursera 的机器学习课程时,我发现我可以使用我工作的公司的数据库(约 50MM 记录)来做一些线性回归实验。

但是提出这个实验所涉及的步骤之一是定义这个任务所需的技术堆栈。

据我了解,应涵盖以下任务:

  1. 读取原始数据并将其存储在非生产数据库中
  2. 将数据转换为“回归友好”格式
  3. 将转换后的数据存储在中间数据库上
  4. 计算实际回归

对于#1,我可以采取一些路径,例如自定义 .NET 或 Java 程序,甚至使用 ETL 过程(这更多是为了将数据复制到其他地方并且不要弄乱生产数据库)。

#2 有趣的部分开始了:我应该考虑为 <100MM 记录数据库使用专门的工具吗?如果是这样,您建议如何将此数据转换为类似矩阵的表示?

我相信 #3 取决于 #4:我看到很多基于文本或 csv 文件的样本(例如:在 R 或 Matlab/Octave 中)。这些是这些计算的标准格式吗?或者我应该从数据库中读取

对于#4,据我所知,使用 R 是要走的路,对吧?

最后,我应该考虑一个多千兆多处理器服务器,还是考虑到它是一个实验,其中花费几个小时的计算不是一个大问题,一台 4GB 的机器可以完成这项工作?

我知道这个问题可能被认为过于宽泛,但我真的很想听听你的意见,我应该为此考虑什么,即使我遗漏了一些东西(或走上了完全错误的道路)。

关于数据,您可以将其视为波士顿的房价:它是一个包含 30 个特征(列)的数据集,用于预测其中一列的值。

(最初发布在 Stack Overflow 上的问题)

3个回答

由于还没有人提到 RAM 高效方法:

您可以使用在线/核外学习,而不是将所有内容都加载到 RAM 中。

例如, Python 的Scikit-Learn具有SGDClassifier类。将其损失函数设置为“log”,您将得到逻辑回归。使用 partial_fit 函数,您可以向它提供直接从数据库(或某些 CSV 文件...)读取的小批量数据。

Vowpal Wabbit也可能值得一试。它专为核外学习而设计 - 几乎不使用任何 RAM,而且您找不到任何更快的东西。

您还可以使用 Python 的Keras库来构建神经网络(或者在最简单的情况下只是逻辑回归),您还可以使用小批量数据来提供它,而不是将所有内容都加载到 RAM 中。与其他两个建议相比,神经网络还可以学习非线性依赖关系。

除此之外,尝试从更少的样本开始——用 10k、100k、1M 的样本绘制学习曲线,看看是否需要 100M 的样本才能获得好分数。

如果您的整个数据集适合 RAM,则会更容易。因此,请检查它有多大(以 GB 为单位)并获得足够的 RAM。多处理器可能不会有太大帮助。因此,请尝试仅使用几个内核来获得最高频率的 proc。您可以将数据提取到 csv 中并使用 R 或 Scikit-learn 进行建模。

您可以将 R 或 Python 用于传统回归库的 1 亿条记录。根据我的经验,您将需要大约 16GB 的 RAM,可能不止这些!在运行算法和预处理步骤时,四核处理器会很好。最好将转换后的数据存储到即时数据库中。