Chispa mllib prediciendo número extraño o NaN

Soy nuevo en Apache Spark y trato de usar la biblioteca de aprendizaje automático para predecir algunos datos. Mi conjunto de datos en este momento es sólo de unos 350 puntos. Aquí están 7 de esos puntos:

"365","4",41401.387,5330569 "364","3",51517.886,5946290 "363","2",55059.838,6097388 "362","1",43780.977,5304694 "361","7",46447.196,5471836 "360","6",50656.121,5849862 "359","5",44494.476,5460289 

Aquí está mi código:

 def parsePoint(line): split = map(sanitize, line.split(',')) rev = split.pop(-2) return LabeledPoint(rev, split) def sanitize(value): return float(value.strip('"')) parsedData = textFile.map(parsePoint) model = LinearRegressionWithSGD.train(parsedData, iterations=10) print model.predict(parsedData.first().features) 

La predicción es algo totalmente loco, como -6.92840330273e+136 . Si no configuro las iteraciones en train() , obtengo nan como resultado. ¿Qué estoy haciendo mal? ¿Es mi conjunto de datos (su tamaño, quizás?) O mi configuración?

El problema es que LinearRegressionWithSGD utiliza el descenso de gradiente estocástico (SGD) para optimizar el vector de peso de su modelo lineal. SGD es realmente sensible al stepSize proporcionado que se utiliza para actualizar la solución intermedia.

Lo que SGD hace es calcular el gradiente g de la función de costo dada una muestra de los puntos de entrada y los pesos actuales w . Para actualizar los pesos w ir por una cierta distancia en la dirección opuesta de g . La distancia es su tamaño de paso s .

 w(i+1) = w(i) - s * g 

Dado que no está proporcionando un valor de tamaño de paso explícito, MLlib asume stepSize = 1 . Esto parece no funcionar para su caso de uso. Te recomendaría probar diferentes tamaños de pasos, generalmente valores más bajos, para ver cómo se comporta LinearRegressionWithSGD :

 LinearRegressionWithSGD.train(parsedData, numIterartions = 10, stepSize = 0.001)