2017-08-16 78 views
1

我剛剛開始使用Spark和Spark ML,並且發現它比Python和sklearn更困難。是否可以爲Spark ML中的隨機森林製作通用培訓管道?

開發時間要大得多,所以我想知道是否可以製作一個適用於任何(足夠小)數據集並訓練隨機森林分類器的通用管道。理想情況下,我會創造像

def trainClassifier(df: DataFrame, labelColumn: String) { 
    ... 
} 

在星火很多的開發時間都花在編碼列數值列,然後形成一個矢量出來的特點,使星火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) 

所以我的問題更是一個設計問題(請告訴我到不同的網站,如果合適的話)有關如何編寫一個通用的培訓職能進行分類,將與任何工作DataFrame,但它也是一個關於Spark的問題,我在問Spark中是否可行這種事情(所以這是一個API問題,所以它更適合於stackoverflow)?

編輯:我的意思是我不指定列和手動轉換每個新數據幀的列。我想要一個函數trainClassifier,它將採用具有不同列和不同列類型的各種數據框。除了labelColumn之外的所有列迭代並將它們一起編譯爲分類器可以使用的特徵向量。

回答

3

您可以創建自定義管道:

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") 

這些步驟可以在函數返回數組[舞臺] - 陣列(索引器,編碼器)。現在,您可以爲here寫一些功能Concat的所有陣列和建立流水線:

val randomForest = ... 

val pipeline = new Pipeline() 
    .setStages(allStepsArray(indexer , encoder , randomForest)) 

然後你就可以在管道上調用合適,甚至建立CrossValidator像link

val model = pipeline.fit(testData) 
+0

我的意思是,我不要指定列並手動轉換每個新數據框的列。我想要一個函數'trainClassifier',它將採用具有不同列和不同列類型的各種數據框。我應該在我的問題中更清楚地說明。我將編輯。 – bourbaki4481472

+0

@ bourbaki4481472請參閱我的答案 - 現在的列是動態生成的:)這就是我認爲你可以做的一切 –