Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何为ML算法矢量化数据帧列?_Scala_Apache Spark_Apache Spark Mllib_Apache Spark Ml - Fatal编程技术网

Scala 如何为ML算法矢量化数据帧列?

Scala 如何为ML算法矢量化数据帧列?,scala,apache-spark,apache-spark-mllib,apache-spark-ml,Scala,Apache Spark,Apache Spark Mllib,Apache Spark Ml,有一个带有一些分类字符串值的数据帧(例如uuid | url |浏览器) 我想把它转换成一个double来执行一个接受double矩阵的ML算法 作为转换方法,我使用StringIndexer(spark 1.4)将字符串值映射为双值,因此我定义了如下函数: def str(arg: String, df:DataFrame) : DataFrame = ( val indexer = new StringIndexer().setInputCol(arg).setOutputCo

有一个带有一些分类字符串值的数据帧(例如uuid | url |浏览器)

我想把它转换成一个double来执行一个接受double矩阵的ML算法

作为转换方法,我使用StringIndexer(spark 1.4)将字符串值映射为双值,因此我定义了如下函数:

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
   )
val assembler  = new VectorAssembler()
    .setInputCols(df.columns.map(cname => s"${cname}_index"))
    .setOutputCol("features")

val stages = transformers :+ assembler
现在的问题是,我将迭代df的foreach列,调用此函数并在解析的double列中添加(或转换)原始字符串列,因此结果将是:

初始df:

[String: uuid|String: url| String: browser]
最终df:

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

提前感谢

您只需在列的
数组上进行
折叠

val transformed: DataFrame = df.columns.foldLeft(df)((df, arg) => str(arg, df))
尽管如此,我仍然认为这不是一个好办法。由于
src
丢弃
StringIndexerModel
因此在获取新数据时不能使用它。因此,我建议使用:

VectorAssembler
可以包括如下内容:

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
   )
val assembler  = new VectorAssembler()
    .setInputCols(df.columns.map(cname => s"${cname}_index"))
    .setOutputCol("features")

val stages = transformers :+ assembler
您还可以使用,它不太可定制,但更简洁:

import org.apache.spark.ml.feature.RFormula

val rf = new RFormula().setFormula(" ~ uuid + url + browser - 1")
val rfModel = rf.fit(dataset)
rfModel.transform(dataset)