在Apache Spark上训练逻辑回归模型时出错。 SPARK-5063

时间:2015-08-25 05:44:32

标签: python apache-spark pyspark apache-spark-mllib logistic-regression

我正在尝试使用Apache Spark构建Logistic回归模型。 这是代码。

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)

但是我收到了这个错误:

  

异常:您似乎正在尝试从广播变量,操作或转换引用SparkContext。 SparkContext只能在驱动程序上使用,而不能在工作程序上运行的代码中使用。有关更多信息,请参阅SPARK-5063。

我不知道如何解决这个问题。任何帮助都会受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

您看到的问题与我在How to use Java/Scala function from an action or a transformation?中描述的问题几乎相同要转换您必须调用Scala函数,并且它需要访问SparkContext因此错误您见。

处理此问题的标准方法是仅处理所需的数据部分,然后压缩结果。

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(...)

如果不打算根据MLlib组件实施您自己的方法,则可以更轻松地使用高级ML API

修改

这里有两个可能的问题。

  1. 此时LogisticRegressionWithSGD支持only binomial分类(感谢eliasah指出了这一点)。如果您需要多标签分类,可以将其替换为LogisticRegressionWithLBFGS
  2. StandardScaler仅支持密集向量,因此它的应用程序有限。