Spark

2016-10-28 3 views
2

의 카테고리 목록에서 핫 인코딩 된 벡터 하나를 생성하십시오. 각 고객이 범주에 속할 수있는 범주 (A, B, C, D, E)와 고객의 데이터 집합이 포함 된 데이터가있는 경우 . 어떻게하면이 같은 데이터 세트를 수행 할 수 있습니다 사람이 불꽃이 할 수있는 간단한 방법을 발견했다Spark

id, categories 
1 , [A,C] 
2 , [B] 
3 , [] 
4 , [D,E] 

및이

id, categories, encoded 
1 , [A,C]  , [1,0,1,0,0] 
2 , [B]  , [0,1,0,0,0] 
3 , []  , [0,0,0,0,0] 
4 , [D,E]  , [0,0,0,1,1] 

처럼, 하나의 뜨거운 인코딩 된 벡터에 범주 열을 변환? 다소 동일 아주 쉽게 할 수

답변

2

뭔가,이 정확히 당신이 원하는 한 것을 같이하지 않는 CountVectorizerModel

val df = spark.createDataFrame(Seq(
    (1, Seq("A","C")), 
    (2, Seq("B")), 
    (3, Seq()), 
    (4, Seq("D","E"))) 
).toDF("id", "category") 

val cvm = new CountVectorizerModel(Array("A","B","C","D","E")) 
    .setInputCol("category") 
    .setOutputCol("features") 

cvm.transform(df).show() 

/* 
+---+--------+-------------------+ 
| id|category|   features| 
+---+--------+-------------------+ 
| 1| [A, C]|(5,[0,2],[1.0,1.0])| 
| 2|  [B]|  (5,[1],[1.0])| 
| 3|  []|   (5,[],[])| 
| 4| [D, E]|(5,[3,4],[1.0,1.0])| 
+---+--------+-------------------+ 
*/ 

를 사용하지만, 특징 벡터는 카테고리 데이터에 존재하는 것을 당신에게 말할 것이다 . 예를 들어 1 행에서 [0,2]는 사전의 첫 번째 요소와 세 번째 요소에 해당하거나 "A"와 "C"는 거기에 쓰여 있습니다.

3

는 스파크의 UDF와 (사용자 정의 함수) Stephen Carman 답을 확장 할 수 있습니다 원하는 출력을 달성하기 : 당신이 원하는 출력을 줄 것이다

// Prepare training documents from a list of (id, text, label) tuples. 
val data = spark.createDataFrame(Seq(
    (0L, Seq("A", "B")), 
    (1L, Seq("B")), 
    (2L, Seq.empty), 
    (3L, Seq("D", "E")) 
)).toDF("id", "categories") 

// Get distinct tags array 
val tags = data 
    .flatMap(r ⇒ r.getAs[Seq[String]]("categories")) 
    .distinct() 
    .collect() 
    .sortWith(_ < _) 

val cvmData = new CountVectorizerModel(tags) 
    .setInputCol("categories") 
    .setOutputCol("sparseFeatures") 
    .transform(data) 

val asDense = udf((v: Vector) ⇒ v.toDense) 

cvmData 
    .withColumn("features", asDense($"sparseFeatures")) 
    .select("id", "categories", "features") 
    .show() 

+---+----------+-----------------+ 
| id|categories|   features| 
+---+----------+-----------------+ 
| 0| [A, B]|[1.0,1.0,0.0,0.0]| 
| 1|  [B]|[0.0,1.0,0.0,0.0]| 
| 2|  []|[0.0,0.0,0.0,0.0]| 
| 3| [D, E]|[0.0,0.0,1.0,1.0]| 
+---+----------+-----------------+ 
관련 문제