Error al entrenar el modelo de regresión logística en Apache Spark. SPARK-5063

Estoy tratando de construir un modelo de regresión logística con Apache Spark. Aquí está el código.

parsedData = raw_data.map(mapper) # mapper is a function that generates pair of label and feature vector as LabeledPoint object featureVectors = parsedData.map(lambda point: point.features) # get feature vectors from parsed data scaler = StandardScaler(True, True).fit(featureVectors) #this creates a standardization model to scale the features scaledData = parsedData.map(lambda lp: LabeledPoint(lp.label, scaler.transform(lp.features))) #trasform the features to scale mean to zero and unit std deviation modelScaledSGD = LogisticRegressionWithSGD.train(scaledData, iterations = 10) 

Pero me sale este error:

Excepción: parece que está intentando hacer referencia a SparkContext desde una variable de transmisión, una acción o una transformación. SparkContext solo se puede utilizar en el controlador, no en el código que se ejecuta en los trabajadores. Para más información, vea SPARK-5063.

No estoy seguro de cómo solucionar esto. Cualquier ayuda sera enormemente apreciada.

El problema que ve es más o menos el mismo que he descrito en ¿Cómo usar la función Java / Scala de una acción o transformación? Para transformar, debe llamar a la función Scala, y requiere acceso a SparkContext ahí el error que ve.

La forma estándar de manejar esto es procesar solo la parte requerida de sus datos y luego comprimir los resultados.

 labels = parsedData.map(lambda point: point.label) featuresTransformed = scaler.transform(featureVectors) scaledData = (labels .zip(featuresTransformed) .map(lambda p: LabeledPoint(p[0], p[1]))) modelScaledSGD = LogisticRegressionWithSGD.train(...) 

Si no planea implementar sus propios métodos basados ​​en los componentes de MLlib , es más fácil utilizar ML API de alto nivel.

Editar :

Hay dos posibles problemas aquí.

  1. En este punto, LogisticRegressionWithSGD solo admite la clasificación binomial (Gracias a eliasah por señalarlo). Si necesita una clasificación de múltiples tags, puede reemplazarla con LogisticRegressionWithLBFGS .
  2. StandardScaler solo admite vectores densos, por lo que tiene aplicaciones limitadas.