使用Spark并行运行不同的分类器/算法

时间:2017-04-04 12:39:20

标签: python apache-spark machine-learning pyspark

我有一个数据集,我想使用Spark with Python并行测试不同的分类器。 例如,如果我想测试决策树和随机森林,我怎么能并行运行它们?

我尝试了一些方法,但我一直在努力:

cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

我试图这样做(使用scikit-learn的分类器而不是Spark的代码很好:

def apply_classifier(clf, train_dataset, test_dataset):
    model = clf.fit(train_dataset)

    predictions = model.transform(test_dataset)

    evaluator = BinaryClassificationEvaluator()
    evaluator.evaluate(predictions)

    return [(model, predictions)]

...

dt = DecisionTreeClassifier(labelCol="indexedLabel", featuresCol="indexedFeatures", maxDepth=3)

rf = RandomForestClassifier(labelCol="indexedLabel", featuresCol="indexedFeatures")

classifiers = [dt, rf]

sc.parallelize(classifiers).flatMap(lambda x: apply_classifier(x, train_dataset, test_dataset)).collect() 

有关如何设法执行此操作的任何建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

@ larissa-leite

为克服这一点,我正在使用thread中所述的[multiprocessing](https://docs.python.org/3/library/multiprocessing.html)

这是线程的代码:

from multiprocessing import Process

def func1():
  print 'func1: starting'
  for i in xrange(10000000): pass
  print 'func1: finishing'

def func2():
  print 'func2: starting'
  for i in xrange(10000000): pass
  print 'func2: finishing'

if __name__ == '__main__':
  p1 = Process(target=func1)
  p1.start()
  p2 = Process(target=func2)
  p2.start()
  p1.join()
  p2.join()

只需解释一下我为什么使用它:我使用OneVsRestClassifier训练了多个文本分类器模型(超过200个),我需要将接收到的文本扩展到每个模型中。

在这里,将所有预测传递给我的延迟小于200毫秒(对于人来说the baseline time reaction可以在100毫秒至420毫秒之间),因此这种“延迟”对我而言并不重要。