Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Can';t找出火花线回归误差的原因_Apache Spark_Pyspark_Apache Spark Mllib - Fatal编程技术网

Apache spark Can';t找出火花线回归误差的原因

Apache spark Can';t找出火花线回归误差的原因,apache-spark,pyspark,apache-spark-mllib,Apache Spark,Pyspark,Apache Spark Mllib,我正试图使用我在Kaggle上找到的一个住房数据集,在PySpark中做一个非常简单的线性回归。有很多列,但为了使这(实际上)尽可能简单,我只保留了其中的两列(在开始使用所有列之后),并且仍然没有幸得到一个模型的培训。以下是在执行回归步骤之前数据框的外观: 2016-09-07 17:12:08,804 root INFO [Row(price=78000.0, sqft_living=780.0, sqft_lot=16344.0, features=DenseVector([780.0, 1

我正试图使用我在Kaggle上找到的一个住房数据集,在PySpark中做一个非常简单的
线性回归。有很多列,但为了使这(实际上)尽可能简单,我只保留了其中的两列(在开始使用所有列之后),并且仍然没有幸得到一个模型的培训。以下是在执行回归步骤之前数据框的外观:

2016-09-07 17:12:08,804 root INFO [Row(price=78000.0, sqft_living=780.0, sqft_lot=16344.0, features=DenseVector([780.0, 16344.0])), Row(price=80000.0, sqft_living=430.0, sqft_lot=5050.0, features=DenseVector([430.0, 5050.0])), Row(price=81000.0, sqft_living=730.0, sqft_lot=9975.0, features=DenseVector([730.0, 9975.0])), Row(price=82000.0, sqft_living=860.0, sqft_lot=10426.0, features=DenseVector([860.0, 10426.0])), Row(price=84000.0, sqft_living=700.0, sqft_lot=20130.0, features=DenseVector([700.0, 20130.0])), Row(price=85000.0, sqft_living=830.0, sqft_lot=9000.0, features=DenseVector([830.0, 9000.0])), Row(price=85000.0, sqft_living=910.0, sqft_lot=9753.0, features=DenseVector([910.0, 9753.0])), Row(price=86500.0, sqft_living=840.0, sqft_lot=9480.0, features=DenseVector([840.0, 9480.0])), Row(price=89000.0, sqft_living=900.0, sqft_lot=4750.0, features=DenseVector([900.0, 4750.0])), Row(price=89950.0, sqft_living=570.0, sqft_lot=4080.0, features=DenseVector([570.0, 4080.0]))]
我使用以下代码来训练模型:

    standard_scaler = StandardScaler(inputCol='features',
                                     outputCol='scaled')
    lr = LinearRegression(featuresCol=standard_scaler.getOutputCol(), labelCol='price', weightCol=None,
                          maxIter=100, tol=1e-4)
    pipeline = Pipeline(stages=[standard_scaler, lr])
    grid = (ParamGridBuilder()
            .baseOn({lr.labelCol: 'price'})
            .addGrid(lr.regParam, [0.1, 1.0])
            .addGrid(lr.elasticNetParam, elastic_net_params or [0.0, 1.0])
            .build())
    ev = RegressionEvaluator(metricName="rmse", labelCol='price')
    cv = CrossValidator(estimator=pipeline,
                        estimatorParamMaps=grid,
                        evaluator=ev,
                        numFolds=5)
    model = cv.fit(data).bestModel
我得到的错误是:

2016-09-07 17:12:08,805 root INFO Training regression model...
2016-09-07 17:12:09,530 root ERROR An error occurred while calling o60.fit.
: java.lang.NullPointerException
    at org.apache.spark.ml.regression.LinearRegression.train(LinearRegression.scala:164)
    at org.apache.spark.ml.regression.LinearRegression.train(LinearRegression.scala:70)
    at org.apache.spark.ml.Predictor.fit(Predictor.scala:90)
    at org.apache.spark.ml.Predictor.fit(Predictor.scala:71)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:237)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:280)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:128)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:211)
    at java.lang.Thread.run(Thread.java:745)

有什么想法吗?

在这种情况下,您不能使用
管道。调用
pipeline.fit
时,它会转换为(大致)

但实际上你需要

standard_scaler_model = standard_scaler.fit(dataframe)
dataframe = standard_scaler_model.transform(dataframe)
lr_model = lr.fit(dataframe)

错误是因为您的
lr.fit
无法找到
StandardScaler
模型的输出(即转换结果)。

此处的错误不是由StandardScaler造成的。这对我来说很好(显然你的经历不同)。错误原来是
weight
列。当我试图指定导致我出错的
weightCol=None
时。我通过创建一个权重为1.0的weightCol(必须是浮点!)来修复它。谢谢@evan zamir。我得到了同样的错误,你下面的评论解决了这个问题。只是我没有使用1.0作为权重,而是放弃了权重参数。这看起来像Spark中的一个bug,应该报告。
standard_scaler_model = standard_scaler.fit(dataframe)
dataframe = standard_scaler_model.transform(dataframe)
lr_model = lr.fit(dataframe)