Scala 是否有可能在Spark ML中为随机林创建一个通用培训管道?

Scala 是否有可能在Spark ML中为随机林创建一个通用培训管道?,scala,apache-spark,machine-learning,apache-spark-mllib,Scala,Apache Spark,Machine Learning,Apache Spark Mllib,我刚刚开始使用Spark和Spark ML,我发现它比Python和sklearn困难得多 开发时间要长得多,所以我想知道,在任何(足够小的)数据集上制作一个通用管道并训练一个随机森林分类器是否可行。理想情况下,我会创建一个函数,如 def trainClassifier(df: DataFrame, labelColumn: String) { ... } Spark中的很多开发时间都花在将列编码为数字列,然后形成一个特征向量,这样Spark ML的随机林就可以实际使用它。所以一个人最终

我刚刚开始使用Spark和Spark ML,我发现它比Python和sklearn困难得多

开发时间要长得多,所以我想知道,在任何(足够小的)数据集上制作一个通用管道并训练一个随机森林分类器是否可行。理想情况下,我会创建一个函数,如

def trainClassifier(df: DataFrame, labelColumn: String) {
  ...
}
Spark中的很多开发时间都花在将列编码为数字列,然后形成一个特征向量,这样Spark ML的随机林就可以实际使用它。所以一个人最终会写下这样的句子

val indexer = new StringIndexer()
                   .setInputCol("category")
                   .setOutputCol("categoryIndex")
                   .fit(df)

val indexed = indexer.transform(df)

val encoder = new OneHotEncoder()
                   .setInputCol("categoryIndex")
                   .setOutputCol("categoryVec")

val encoded = encoder.transform(indexed)
因此,我的问题更多的是一个设计问题(如果合适的话,请引导我到另一个站点),关于如何编写一个通用的分类训练函数,该函数将与任何
数据帧
一起工作,但这也是一个关于Spark的问题,因为我要问的是,这种事情在Spark中是否可行(这是一个API问题,因此更适合stackoverflow)


编辑:我的意思是,我不需要指定列,也不需要手动转换每个新数据帧的列。我需要一个函数
trainClassifier
,它将接收具有不同列和不同列类型的各种数据帧。它将迭代除labelColumn之外的所有列,并编译这些列组合成分类器可以使用的特征向量。

您可以创建自定义管道:

val start = "category"; // can be parameter of method or function
val indexer = new StringIndexer()
               .setInputCol(start )
               .setOutputCol(start + "Index")
               .fit(df)

val encoder = new OneHotEncoder()
               .setInputCol(encoder.outputCol)
               .setOutputCol(start  + "encoded") 
val randomForest = ... 

val pipeline = new Pipeline()
    .setStages(allStepsArray(indexer , encoder , randomForest))
这些步骤可以在返回Array[Stage]-Array(indexer、encoder)的函数中进行。现在您可以将其作为函数写入concat所有数组并创建管道:

val start = "category"; // can be parameter of method or function
val indexer = new StringIndexer()
               .setInputCol(start )
               .setOutputCol(start + "Index")
               .fit(df)

val encoder = new OneHotEncoder()
               .setInputCol(encoder.outputCol)
               .setOutputCol(start  + "encoded") 
val randomForest = ... 

val pipeline = new Pipeline()
    .setStages(allStepsArray(indexer , encoder , randomForest))
然后,您可以在管道上调用fit,甚至可以构建CrossValidator,如:


我的意思是,我不知道如何指定列并手动转换每个新数据帧的列。我想要一个函数
trainClassifier
,它将接收具有不同列和不同列类型的各种数据帧。我应该在我的问题中更清楚地说明这一点。我将进行编辑。@bourbaki4481472请参阅我的answ呃-现在列是动态生成的:)这就是我认为您可以做的一切