una studio seleccionar que modificar hacer filas data como columnas columna añadir agregar scala apache-spark apache-spark-mllib apache-spark-ml

scala - studio - que es un data frame



¿Cómo vectorizar columnas DataFrame para algoritmos ML? (1)

Simplemente puede foldLeft a la foldLeft sobre la Array de columnas:

val transformed: DataFrame = df.columns.foldLeft(df)((df, arg) => str(arg, df))

Aún así, argumentaré que no es un buen enfoque. Dado que src descarta StringIndexerModel , no se puede usar cuando obtiene datos nuevos. Por eso recomendaría usar Pipeline :

import org.apache.spark.ml.Pipeline val transformers: Array[org.apache.spark.ml.PipelineStage] = df.columns.map( cname => new StringIndexer() .setInputCol(cname) .setOutputCol(s"${cname}_index") ) // Add the rest of your pipeline like VectorAssembler and algorithm val stages: Array[org.apache.spark.ml.PipelineStage] = transformers ++ ??? val pipeline = new Pipeline().setStages(stages) val model = pipeline.fit(df) model.transform(df)

VectorAssembler se puede incluir así:

val assembler = new VectorAssembler() .setInputCols(df.columns.map(cname => s"${cname}_index")) .setOutputCol("features") val stages = transformers :+ assembler

También podría usar RFormula , que es menos personalizable, pero mucho más conciso:

import org.apache.spark.ml.feature.RFormula val rf = new RFormula().setFormula(" ~ uuid + url + browser - 1") val rfModel = rf.fit(dataset) rfModel.transform(dataset)

tener un DataFrame con algunos valores de cadena categóricos (por ejemplo, uuid | url | navegador).

Me gustaría convertirlo en un doble para ejecutar un algoritmo ML que acepte doble matriz.

Como método de conversión, utilicé StringIndexer (spark 1.4) que asigna mis valores de cadena a valores dobles, así que definí una función como esta:

def str(arg: String, df:DataFrame) : DataFrame = ( val indexer = new StringIndexer().setInputCol(arg).setOutputCol(arg+"_index") val newDF = indexer.fit(df).transform(df) return newDF )

Ahora el problema es que iteraría cada columna de un df, llamaría a esta función y agregaría (o convertiría) la columna de cadena original en la columna doble analizada, por lo que el resultado sería:

Df inicial:

[String: uuid|String: url| String: browser]

Df final:

[String: uuid|Double: uuid_index|String: url|Double: url_index|String: browser|Double: Browser_index]

Gracias por adelantado