Scala 如何为ML算法矢量化数据帧列?
有一个带有一些分类字符串值的数据帧(例如uuid | url |浏览器) 我想把它转换成一个double来执行一个接受double矩阵的ML算法 作为转换方法,我使用StringIndexer(spark 1.4)将字符串值映射为双值,因此我定义了如下函数: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
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)