2017-01-21 4 views
2

Я использую модель LinearRegression в Spark ML для прогнозирования цены. Это регрессия с одной вариацией (x=time, y=price).Spark ML Линейная регрессия - какие гипер-параметры для настройки

Предположим, что мои данные чисты, каковы обычные шаги для улучшения этой модели?

До сих пор я пытался настраивать regularization parameter с помощью cross-validation, и получил rmse=15stdev=30 дал.

Есть ли какие-либо другие важные гиперпараметры, о которых я должен заботиться? Похоже, Спарк ML не очень хорошо документированы для настройки гипер-параметров ...


Update

я смог заиграть параметры с помощью ParamGrid и Cross-Validation. Однако есть ли способ увидеть, как выглядит соответствующая линия после правильной подготовки модели линейной регрессии? Как я могу узнать, есть ли линия quadric или cubic и т. Д.? Было бы замечательно, если бы был способ визуализировать установленную линию со всеми точками данных обучения.

ответ

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 
0

Чтобы ответить на ваш последующий вопрос, линейный Регрессия также будет линейной. Вы можете построить его, предсказывая в наборе данных точек вашего диапазона для ваших значений y с линейным графиком. Затем вы можете распечатать свои данные обучения поверх этого.

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) 
} 

}

+1

Пожалуйста, добавьте некоторые детали/объяснение вашего ответа, не сваливать только код. – Vasan