2015-09-02 11 views
6

, bazı kategorik dize değerlerine sahip bir DataFrame'e sahiptir (örn. Uuid | url | browser).ML algoritmaları için DataFrame sütunları nasıl vektör edilir?

Çift matrisi kabul eden bir ML algoritması yürütmek için onu çift olarak dönüştürürüm. Şimdi mesele i bir foreach sütun yineleme olduğunu ifade etti

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 
    ) 

:

dönüşüm yöntemiyle olarak ben çift değerlere benim dize değerleri map StringIndexer (1.4 kıvılcım) kullanılan, bu yüzden böyle bir işlevi tanımlanan df, bu işlevi çağırmak ve ayrıştırılmış çift sütunda orijinal dize sütunu eklemek (veya dönüştürmek), bu yüzden sonuç şöyle olacaktır:

ilk df:

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

Final df: Yine

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

, bunun iyi bir yaklaşım olmadığını iddia edecektir: peşin

cevap

11

Sadece foldLeft sütun Array üzerinde olabilir içinde

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

teşekkürler. src, StringIndexerModel'u iptal ettiğinden, yeni veriler aldığınızda kullanılamaz. Bu nedenle ben Pipeline kullanarak öneriyoruz:

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

val stages = transformers :+ assembler 

Ayrıca daha az özelleştirilebilir, ama çok daha özlü olan RFormula kullanabilirsiniz:

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 böyle eklenebilir

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

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