我们是学生,试图处理大约 1.4 亿条记录的数据大小,并尝试运行很少的机器学习算法。我们是整个云解决方案和 mahout 实现的新手。目前我们已经在 postgresql 数据库中设置了它们,但是当前的实现没有扩展,并且在多次性能调整后读/写操作似乎非常慢。因此我们计划寻求基于云的服务。
我们已经探索了一些可能的替代方案。
- 基于亚马逊云的服务(Mahout 实现)
- Picloud with scikits learn(我们计划使用 NumPy 的 HDF5 格式)
- 请推荐任何其他替代方案(如果有)。
下面是问题
- 哪个会给我们带来更好的结果(周转时间)并且成本效益高?请务必向我们提及存在的任何其他替代方案。
- 如果我们设置亚马逊服务,我们应该如何设置数据格式?如果我们使用 dynamodb 成本会飙升吗?
谢谢
这取决于您要解决的机器学习问题的性质。我建议您首先将您的数据集子采样到适合内存的东西(例如,假设稀疏表示,每个样本有几百个非零特征的 100k 个样本)。
然后在 scikit-learn 中尝试一些可扩展到大量样本的机器学习算法:
- SGDClassifier 或 MultinomialNB,如果您想进行监督分类(如果您在数据集中有要预测的分类标签)
- SGDRegressor 如果你想做监督回归(如果你有连续的目标变量来预测)
- MiniBatchKMeans 聚类进行无监督聚类(但默认情况下没有客观的方法来量化所得聚类的质量)。
- ...
执行网格搜索以找到模型超参数的最佳值(例如正则化器 alpha
和 SGDClassifier 的传递次数 n_iter
)并使用评估性能交叉验证。
完成后,使用 2 倍大的数据集(仍适合内存)重试,看看它是否能显着提高您的预测准确性。如果不是这种情况,那么不要浪费时间尝试在集群上并行化它以在完整数据集上运行它,因为它不会产生任何更好的结果。
如果它做了你能做的,将数据分成几部分,然后在每个节点上切片数据,使用 picloud 独立学习每个节点上的 SGDClassifier 或 SGDRegressor 模型并收集权重(coef_
和 intercept_
),然后计算平均权重以构建最终的线性模型,并在数据集的某些保留切片上对其进行评估。
了解更多错误分析。查看如何绘制学习曲线: