2015-05-18 3 views
1

Я начинаю с библиотеки Spark MLib со Scala. По моим испытаниям до сих пор я не могу получить результаты даже отдаленно корректно. Пробовал несколько способов добиться этого без успеха. В настоящее время даже с относительно простыми данными:Линейные веса регрессии и предсказание в искры

1,1 
2,2 
3,3 
4,4 
5,5 
6,6 
7,7 
8,8 
9,9 
10,10 

Я не могу прийти к каким-либо достойным результатам. Вот мой код до сих пор: [довольно стандартный Я думаю]

import org.apache.spark.mllib.regression.LinearRegressionWithSGD 
import org.apache.spark.mllib.regression.LabeledPoint 
import org.apache.spark.mllib.linalg.Vectors 

val data = sc.textFile("/Users/jacek/oo.csv") 
val parsedData = data.map { line => 
    val parts = line.split(',') 
    LabeledPoint(parts(0).toDouble, Vectors.dense(Array(1.0, parts(1).toDouble))) 
} 

val numIterations = 20 
val model = LinearRegressionWithSGD.train(parsedData, numIterations) 

val valuesAndPreds = parsedData.map { point => 
    val prediction = model.predict(point.features) 
    (point.label, prediction) 
} 

Таковы результаты я получаю:

model: org.apache.spark.mllib.regression.LinearRegressionModel = (weights=[-1.3423470408513295E21,-9.345181656001024E21], intercept=0.0) 

scala> parsedData.take(10) 
res48: Array[org.apache.spark.mllib.regression.LabeledPoint] = Array((1.0,[1.0,1.0]), (2.0,[1.0,2.0]), (3.0,[1.0,3.0]), (4.0,[1.0,4.0]), (5.0,[1.0,5.0]), (6.0,[1.0,6.0]), (7.0,[1.0,7.0]), (8.0,[1.0,8.0]), (9.0,[1.0,9.0]), (10.0,[1.0,10.0])) 

scala> valuesAndPreds.take(10) 
res49: Array[(Double, Double)] = Array((1.0,-6.764535208E21), (2.0,-1.2266421529070415E22), (3.0,-1.8399632293605623E22), (4.0,-2.453284305814083E22), (5.0,-3.0666053822676038E22), (6.0,-3.6799264587211245E22), (7.0,-4.293247535174645E22), (8.0,-4.906568611628166E22), (9.0,-5.519889688081687E22), (10.0,-6.7645352076E22)) 

scala> 

я пробовал с разными наборами настроек алгоритма линейной регрессии без особой удачи. Любая помощь приветствуется.

ответ

2

Основываясь на некоторых тестах здесь есть параметры регрессии оптимизатора, которые сделали бы число так хорошо, как они могут получить, я полагаю:

var regression = new LinearRegressionWithSGD().setIntercept(true) 
regression.optimizer.setStepSize(0.1) 
regression.optimizer.setNumIterations(1000) 
val model2 = regression.run(parsedData) 

Спасибо @pzecevic за вашу помощь. Вы указали мне в правильном направлении.

2

Не читал ваш вопрос тщательно (извините), но вы, вероятно, необходимо установить перехватывать истина:

val alg = new LinearRegressionWithSGD() 
alg.setIntercept(true) 
alg.optimizer.setNumIterations(numIterations) 
val model = alg.run(parsedData) 

Кроме того, 20 итераций может быть слишком мало.

Смежные вопросы