【问题标题】:Spark ML Linear Regression - What Hyper-parameters to TuneSpark ML 线性回归 - 调整哪些超参数
【发布时间】:2017-06-06 02:18:41
【问题描述】:

我在 Spark ML 中使用 LinearRegression 模型来预测价格。这是一个单变量回归(x=time, y=price)

假设我的数据是干净的,改进此模型的通常步骤是什么?

到目前为止,我尝试使用cross-validation 调整regularization parameter,并得到rmse=15 给定stdev=30

还有其他我应该关心的重要超参数吗?似乎 Spark ML 没有很好地记录超参数调整......


更新

我能够使用ParamGridCross-Validation 调整参数。但是,有没有办法在正确训练线性回归模型后查看拟合线的样子?我怎么知道线路是quadric 还是cubic 等?如果有一种方法可以用所有训练数据点可视化拟合线,那就太好了。

【问题讨论】:

    标签: linear-regression apache-spark-ml hyperparameters


    【解决方案1】:

    您提供的链接指向主要的超参数:

    .setRegParam(0.3)   // lambda for regularization
    .setElasticNetParam(0.8)  // coefficient for L1 vs L2 
    

    您可以执行 GridSearch 来优化它们的使用 .. 说

    lambda in 0 to 0.8   
    elasticNet in 0 to 1.0
    

    这可以通过将ParamMap 提供给CrossValidator 来完成

    val estimatorParamMaps: Param[Array[ParamMap]]
    param for estimator param maps
    

    【讨论】:

      【解决方案2】:

      为了回答您的后续问题,LinearRegression 也将是线性拟合。您可以通过使用线图预测 y 值范围内的点数据集来绘制它。然后,您可以在其上绘制您的训练数据。

      【讨论】:

        【解决方案3】:

        val session = SparkSession.builder().master("local").appName("PredictiveAnalysis").getOrCreate();

        def main(args: Array[String]): Unit = {
        
                val data = session.sparkContext.textFile("C:\\Users\\Test\\new_workspace\\PredictionAlgo\\src\\main\\resources\\data.txt");
                val parsedData = data.map { line =>
                val x : Array[String] = line.replace(",", " ").split(" ")
                val y = x.map{ (a => a.toDouble)}
                val d = y.size - 1
                        val c = Vectors.dense(y(0),y(d))
                        LabeledPoint(y(0), c)
                }.cache();
                val numIterations = 100;
                val stepSize = 0.00000001;
                val model = LinearRegressionWithSGD.train(parsedData, numIterations, stepSize);
        
                val valuesAndPreds = parsedData.map { point =>
                val prediction = model.predict(point.features)
                (point.label, prediction)
                }
        
                valuesAndPreds.foreach((result) => println(s"predicted label: ${result._1}, actual label: ${result._2}"))
        
                val MSE = valuesAndPreds.map{ case(v, p) => math.pow((v - p), 2) }.mean()
                println("training Mean Squared Error = " + MSE)
        }
        

        }

        【讨论】:

        • 请在你的答案中添加一些细节/解释,不要只转储代码。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-12
        • 2016-05-15
        • 1970-01-01
        • 2019-03-10
        • 2022-01-23
        • 2015-01-08
        相关资源
        最近更新 更多