scala - Spark ML VectorAssembler devuelve resultados extraños
apache-spark apache-spark-mllib (1)
No hay nada extraño en la salida.
Su vector parece tener muchos elementos cero, por lo tanto,
spark
utilizada es una representación escasa.
Para explicar más a fondo:
Parece que su vector está compuesto de 18 elementos (dimensión).
Estos índices
[0,1,6,9,14,17]
del vector contienen elementos distintos de cero que están en orden
[17.0,15.0,3.0,1.0,4.0,2.0]
La representación vectorial dispersa es una forma de ahorrar espacio computacional, por lo que es más fácil y rápido de calcular. Más información sobre la escasa representación here .
Ahora, por supuesto, puede convertir esa representación escasa en una representación densa, pero tiene un costo.
En caso de que esté interesado en obtener la importancia de la función, le aconsejo que eche un vistazo a this .
Estoy experimentando un comportamiento muy extraño por parte de
VectorAssembler
y me preguntaba si alguien más ha visto esto.
Mi escenario es bastante sencillo.
Analizo los datos de un archivo
CSV
donde tengo algunos campos
Int
y
Double
estándar y también calculo algunas columnas adicionales.
Mi función de análisis devuelve esto:
val joined = countPerChannel ++ countPerSource //two arrays of Doubles joined
(label, orderNo, pageNo, Vectors.dense(joinedCounts))
Mi función principal utiliza la función de análisis de esta manera:
val parsedData = rawData.filter(row => row != header).map(parseLine)
val data = sqlContext.createDataFrame(parsedData).toDF("label", "orderNo", "pageNo","joinedCounts")
Luego uso un
VectorAssembler
como este:
val assembler = new VectorAssembler()
.setInputCols(Array("orderNo", "pageNo", "joinedCounts"))
.setOutputCol("features")
val assemblerData = assembler.transform(data)
Entonces, cuando
VectorAssembler
una fila de mis datos antes de que entre en el
VectorAssembler
se ve así:
[3.2,17.0,15.0,[0.0,0.0,0.0,0.0,3.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,4.0,0.0,0.0,2.0]]
Después de la función de transformación de VectorAssembler, imprimo la misma fila de datos y obtengo esto:
[3.2,(18,[0,1,6,9,14,17],[17.0,15.0,3.0,1.0,4.0,2.0])]
¿Qué diablos está pasando?
¿Qué ha hecho el
VectorAssembler
?
Revisé todos los cálculos e incluso seguí los ejemplos simples de Spark y no puedo ver qué está mal con mi código.
¿Puedes?