2

Начиная с примера, я пытался сделать LinearRegression. Проблема в том, что я получил неправильный результат. В качестве перехватчика я должен иметь: 2.2.Spark mllib LinearRegression weird result

Я попытался добавить .optimizer.setStepSize (0.1), найденный в другом сообщении, но все же получить странный результат. Предложение?

Это набор данных

1,2 
2,4 
3,5 
4,4 
5,5 

Код:

import org.apache.spark.SparkConf 
import org.apache.spark.SparkContext 
import org.apache.spark.mllib.regression.LabeledPoint 
import org.apache.spark.mllib.regression.LinearRegressionModel 
import org.apache.spark.mllib.regression.LinearRegressionWithSGD 
import org.apache.spark.mllib.linalg.Vectors 

object linearReg { 
    def main(args: Array[String]) { 
    StreamingExamples.setStreamingLogLevels() 
    val sparkConf = new SparkConf().setAppName("linearReg").setMaster("local") 
    val sc=new SparkContext(sparkConf) 
    // Load and parse the data 
    val data = sc.textFile("/home/daniele/dati.data") 
    val parsedData = data.map { line => 
     val parts = line.split(',') 
     LabeledPoint(parts(0).toDouble, Vectors.dense(Array(1.0)++parts(1).split(' ').map(_.toDouble))) 
    }.cache() 
    parsedData.collect().foreach(println) 
    // Building the model 
    val numIterations = 1000 
    val model = LinearRegressionWithSGD.train(parsedData, numIterations) 
    println("Interceptor:"+model.intercept) 
    // Evaluate model on training examples and compute training error 
    val valuesAndPreds = parsedData.map { point => 
     val prediction = model.predict(point.features) 
     (point.label, prediction) 
    } 
    valuesAndPreds.collect().foreach(println) 
    val MSE = valuesAndPreds.map { case (v, p) => math.pow((v - p), 2) }.mean() 
    println("training Mean Squared Error = " + MSE) 

    // Save and load model 
    model.save(sc, "myModelPath") 
    val sameModel = LinearRegressionModel.load(sc, "myModelPath") 
    } 
} 

Результат:

weights: [-4.062601003207354E25], intercept: -9.484399253945647E24 

Update -Используется .train метод -Добавлена ​​1,0 в качестве дополнения к перехват. Данные выглядят следующим образом: 1.0 добавление

ответ

2

Вы используете run, что означает, что данные, которые вы передаете, интерпретируются как «настроенные параметры», а не функции, подлежащие регрессии.

docs содержат хорошие примеры подготовки, то под управлением модель:

//note the "train" instead of "run" 
val numIterations = 1000 
val model = LinearRegressionWithSGD.train(parsedData, numIterations) 

Результатом является более точный вес:

scala> model.weights 
res4: org.apache.spark.mllib.linalg.Vector = [0.7674418604651163] 

Если вы хотите добавить перехватывать только поместить значение 1.0 как особенность вашего плотного вектора. Изменить код примера:

... 
LabeledPoint(Parts(0).toDouble, Vectors.dense(Array(1.0) ++ parts(1).split(' ').map(_.toDouble))) 
... 

Первая особенность - это ваш перехват.

+0

модифицировано в соответствии с вашими требованиями. –

+0

Это дает мне java.lang.NumberFormatException: empty String –

+0

Это исходит из вашего синтаксического кода, а не добавление, которое я сделал относительно 1.0 в качестве функции перехвата ... –