我有一个数据集,我想使用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()
有关如何设法执行此操作的任何建议吗?
谢谢!
答案 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毫秒之间),因此这种“延迟”对我而言并不重要。