Как сгенерировать кортежи (исходная метка, прогнозируемая метка) в Spark с помощью MLlib?

Я пытаюсь делать прогнозы с помощью модели, которую я получил от MLlib на Spark. Цель состоит в том, чтобы сгенерировать кортежи (orinalLabelInData, predictedLabel). Затем эти кортежи можно использовать для оценки модели. Каков наилучший способ добиться этого? Спасибо.

Предполагая, что parsedTrainData является RDD LabeledPoint

from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.tree import DecisionTree, DecisionTreeModel
from pyspark.mllib.util import MLUtils

parsedTrainData = sc.parallelize([LabeledPoint(1.0, [11.0,-12.0,23.0]), 
                                  LabeledPoint(3.0, [-1.0,12.0,-23.0])])

model = DecisionTree.trainClassifier(parsedTrainData, numClasses=7,
categoricalFeaturesInfo={}, impurity='gini', maxDepth=8, maxBins=32)

model.predict(parsedTrainData.map(lambda x: x.features)).take(1)

Это возвращает прогнозы, но я не уверен, как сопоставить каждый прогноз с исходными метками в данных.

Я попытался

parsedTrainData.map(lambda x: (x.label, dtModel.predict(x.features))).take(1)

однако, похоже, что мой способ отправки модели работнику здесь не подходит

/spark140/python/pyspark/context.pyc in __getnewargs__(self)
    250         # This method is called when attempting to pickle SparkContext, which is always an error:
    251         raise Exception(
--> 252             "It appears that you are attempting to reference SparkContext from a broadcast "
    253             "variable, action, or transforamtion. SparkContext can only be used on the driver, "
    254             "not in code that it run on workers. For more information, see SPARK-5063."

Exception: It appears that you are attempting to reference SparkContext from a broadcast variable, action, or transforamtion. SparkContext can only be used on the driver, not in code that it run on workers. For more information, see SPARK-5063. 

person Bin    schedule 28.07.2015    source источник
comment
Было бы полезно, если бы вы сказали нам, что такое класс model.   -  person zero323    schedule 28.07.2015
comment
@zero323, спасибо, zero323. Я обновил вопрос соответственно.   -  person Bin    schedule 28.07.2015
comment
Я также изменил сообщение, так что есть фрагмент кода Python, который будет воспроизводить Exception.   -  person Bin    schedule 28.07.2015


Ответы (1)


Ну, согласно официальной документации, вы можете просто заархивировать предсказания и ярлыки, подобные этому:

predictions = model.predict(parsedTrainData.map(lambda x: x.features))
labelsAndPredictions = parsedTrainData.map(lambda x: x.label).zip(predictions)
person zero323    schedule 28.07.2015
comment
Большое спасибо! нуль. Я пропустил его. На моих данных работает отлично. Я был обеспокоен тем, что распределенные данные будут возвращаться в случайном порядке и не будут совпадать. Из этого замечательного ресурса, который вы указали. Кажется, что Spark справляется с этим. Может быть, потому, что он отправляет все преобразования сразу на рабочий узел, когда действие запускает вычисление, поэтому данные будут правильно заархивированы на каждом рабочем узле? - person Bin; 28.07.2015
comment
Что ж, поскольку это операция только для карты, а данные не растут, нет необходимости в перетасовке, и порядок должен сохраняться. Тем не менее, я должен признать, что я немного сбит с толку. Scala-версия DecisionTreeModel может обрабатывать эквивалент parsedTrainData.map(lambda x: (x.label, dtModel.predict(x.features))), поэтому кажется, что в стратегии выполнения есть что-то другое, но я пока не смог точно определить проблему в исходном коде PySpark. - person zero323; 28.07.2015
comment
@Bin Если вам интересно, я разместил здесь некоторые пояснения и дополнительный вопрос здесь: stackoverflow.com/q/31684842/1560062< /а> - person zero323; 28.07.2015
comment
Прохладно! Спасибо, что продолжаете исследовать. Мы получим лучшее понимание по этому вопросу через ваш новый вопрос. Я буду следить за вашим новым постом. - person Bin; 28.07.2015