scala apache-spark apache-spark-mllib apache-spark-ml

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?