我使用Spark ML中的LinearRegression模型来预测价格。这是单个变量回归(x=time, y=price)
。
假设我的数据很干净,改进此模型需要采取哪些常规步骤?
到目前为止,我尝试使用cross-validation调整regularization parameter
,并rmse=15
获得stdev=30
。
我还应该关注其他重要的超参数吗?对于超参数调整,Spark ML似乎没有很好的文档......
更新
我可以使用ParamGrid
和Cross-Validation
来调整参数。但是,有没有办法在正确训练线性回归模型后看到拟合线的样子?如何知道该行是quadric
还是cubic
等?如果有一种方法可以用所有训练数据点可视化拟合线,那将是很好的。
答案 0 :(得分:0)
您提供的链接指向主要的超参数:
.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
答案 1 :(得分:0)
要回答您的后续问题,LinearRegression也将是线性拟合。您可以通过使用线图预测y值范围内的点数据集来绘制它。然后,您可以在其上绘制您的训练数据。
答案 2 :(得分:0)
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)
}
}