【问题标题】:Which classifier or ML SDK should I use in this case?在这种情况下,我应该使用哪个分类器或 ML SDK?
【发布时间】:2016-09-14 09:23:39
【问题描述】:

训练数据(包括训练集和验证集)大约有80百万个样本,每个样本有200个密集浮点数。有6 标记的类,它们是不平衡的。

在常用的 ML 库(例如,libsvmscikit-learnSpark MLlibrandom forestXGBoost 或其他)中,我应该使用哪个?硬件配置方面,该机拥有24CPU核心和250Gb内存。

【问题讨论】:

  • 我会使用 Spark MLlib
  • @DrVComas,谢谢!我还没有安装 Spark。如果方便,请您查看此帖子 [stackoverflow.com/questions/37304536/…?
  • 这就是我使用 spark 的原因,如果数据集很大,您可以使用整个数据集毫无问题地训练模型。
  • @DrVComas,是的,现在我发现问题是缩放大规模数据。为了拟合模型,我们应该首先计算全局均值和标准差。 map-reduce 非常适合这个任务。

标签: machine-learning scikit-learn random-forest apache-spark-mllib xgboost


【解决方案1】:

我建议使用 scikit-learn 的 SGDClassifier,因为它是在线的,因此您可以将训练数据以块(小批量)的形式加载到内存中并逐步训练分类器,这样您就不需要将所有数据加载到记忆。

它高度并行且易于使用。 您可以将 warm_start 参数设置为 True 并多次调用 fit 并将每个 X、y 块加载到内存中,或者您可以使用 partial_fit 方法更好的选择。

clf = SGDClassifier(loss='hinge', alpha=1e-4, penalty='l2', l1_ratio=0.9, learning_rate='optimal', n_iter=10, shuffle=False, n_jobs=10, fit_intercept=True)
# len(classes) = n_classes
all_classes = np.array(set_of_all_classes)
while True:
    #load a minibatch from disk into memory
    X, y = load_next_chunk()
    clf.partial_fit(X, y, all_classes) 
X_test, y_test = load_test_data()    
y_pred = clf.predict(X_test)

【讨论】:

  • 请记住,partial_fit 仅对数据执行一个 epoch(循环),因此为了更好地优化它,您可能需要重复整个过程,例如 5 次以收敛。尽管您的数据足够大,甚至可以在 1 个 epoch 之前为您提供一个好的模型。您还应该注意记录的顺序。最好在将整个 80M 记录放入分类器之前对其进行打乱,因为如果数据中存在隐藏顺序,则可能会损害模型的泛化能力,从而影响其预测性能。
猜你喜欢
  • 2016-03-15
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多