복붙노트

[SCALA] 어떻게 ML 알고리즘에 대한 DataFrame 열을 벡터화?

SCALA

어떻게 ML 알고리즘에 대한 DataFrame 열을 벡터화?

(| URL | 브라우저 예컨대 UUID) 몇 가지 범주 문자열 값으로 DataFrame 있습니다.

나는 이중 행렬을 받아 ML 알고리즘을 실행하기 위해 이중으로 변환하는 것입니다.

나는이 같은 기능을 정의 있도록 convertion 방법으로는 내가 두 번 값으로 내 문자열 값을 매핑 StringIndexer (스파크 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
   )

이제 문제는 내가하는 DF의 foreach는 열을 반복하는이 함수를 호출하고 결과가 될 수 있도록, 구문 분석을 두 번 열에서 원래 문자열 열을 추가 (또는 변환) 것입니다 :

초기 DF :

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

최종 DF :

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

미리 감사드립니다

해결법

  1. ==============================

    1.당신은 단순히 열 배열을 통해 foldLeft 수 있습니다 :

    당신은 단순히 열 배열을 통해 foldLeft 수 있습니다 :

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

    그럼에도 불구하고, 나는 그것이 좋은 방법이 아니라고 주장한다. SRC 폐기는 사용할 수 없습니다 StringIndexerModel 때문에 당신은 새로운 데이터를 얻을 때. 그 때문에 나는 파이프 라인을 사용하는 것이 좋습니다 것입니다 :

    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는 다음과 같이 포함 할 수있다 :

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

    당신은 또한 더 적은 사용자 정의 할 수 있습니다,하지만 훨씬 더 간결 RFormula을 사용할 수 있습니다 :

    import org.apache.spark.ml.feature.RFormula
    
    val rf = new RFormula().setFormula(" ~ uuid + url + browser - 1")
    val rfModel = rf.fit(dataset)
    rfModel.transform(dataset)
    
  2. from https://stackoverflow.com/questions/32357226/how-to-vectorize-dataframe-columns-for-ml-algorithms by cc-by-sa and MIT license