We-Co

[We-Co] Vector, LabeledPoint - Spark MLlib 본문

Spark

[We-Co] Vector, LabeledPoint - Spark MLlib

위기의코딩맨 2021. 9. 23. 11:43
반응형

안녕하세요. 위기의코딩맨입니다.

Spark MLlib는 기존 Spark 모듈에서 사용하지 않았던 Data Type을 사용하는데

오늘은 비교적으로 많이 사용되는 Vector LabeledPoint에 대해알아보도록 하겠습니다.

 

먼저 MLlib를 사용하기 위해서는 의존성 설정을 진행해야합니다.

pom.xml파일을 열어서

<dependency>
   <groupId>org.apache.spark</groupId>
   <artifactId>spark-mllib_2.11</artifactId>
   <version>2.3.0</version>

</dependency>

해당 부분으로 변경해주시면 됩니다.

 

 

[ Vector ] 

프로그램에서 Double Type의 값을 포함하는 컬렉션으로 구현되며,

Vector에 포함된 각각의 Data는 정의된 순서에 0부터 시작하는 정수형 인덱스를 부여받습니다.

 

Spark MLlib의 Vector는 org.apache.spark.ml.linalg 패키지에서

정의된 트레이트 임으로 직접 인스턴스를 만들 수는 없습니다.

Vector의 인스턴스를 만들기 위해서는 값의 정보만 가지고있는 DenseVector 클래스,

값과 값의 인덱스 정보를 갖고있는 SparseVector 클래스 중 하나를 선택해서 인스턴스를 생성합니다.

 

Vector를 생성할 때는 Vectors 클래스가 제공하는 팩토리 메서드인 dense(), sparse()를 사용하며,

dense()는 위의 DenseVector, sparse()는 SparseVector를 생성합니다.

 

Spark의 대부분 API는 2가지를 구분하지 않고 Vector Type으로 사용하도록 정의를 하여,

어떻게 생성하든 상관 없지만, Data의 값이 0이 다수 포함되어 있을경우 sparse()를 사용하는 것이 좋습니다.

 

scala> import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.ml.linalg.Vectors
scala> val v1 = Vectors.dense(0.1,0.0,0.2,0.3);
v1: org.apache.spark.ml.linalg.Vector = [0.1,0.0,0.2,0.3]
scala> val v2 = Vectors.dense(Array(0.1,0.0,0.2,0.3));
v2: org.apache.spark.ml.linalg.Vector = [0.1,0.0,0.2,0.3]
scala> val v3 = Vectors.sparse(4, Seq((0,0.1), (2,0.2),(3,0.3)))
v3: org.apache.spark.ml.linalg.Vector = (4,[0,2,3],[0.1,0.2,0.3])
scala> val v4 = Vectors.sparse(4, Array(0,2,3),Array(0.1,0.2,0.3))
v4: org.apache.spark.ml.linalg.Vector = (4,[0,2,3],[0.1,0.2,0.3])

 

scala> print(v1.toArray.mkString(", " ))
0.1, 0.0, 0.2, 0.3

scala> print(v3.toArray.mkString(", "))
0.1, 0.0, 0.2, 0.3

 

예제를 보시면 dense()를 사용하여 Vector에 포함할 데이터를 직접 전달하거나 Array를 사용하여 전달합니다.

sparse()는 데이터 상에서 위치 값, 튜블의 배열을 만들어 전달하거나 Vector의 크기나 데이터 위치, 실제 값을 나타내는 3개의 인자를 각각 따로 지정해서 전달합니다.

 

[ LabeledPoint ]

Spark MLlib를 설명할때 간단하게 Label을 설명드렸는데

Label을사용하는 경우를 위한 Vector로서 특정 값을 담고있는 Vector와 Label로 구성되어있습니다.

 

Label은 double Type만 값을 채울수 있으며, 로지스틱 회귀와 같은 이진분류 알고리즘을 사용할 경우는0, 1로 설정해야합니다.

 

 

scala> import org.apache.spark.ml.feature.LabeledPoint
import org.apache.spark.ml.feature.LabeledPoint 
scala> val v1 = Vectors.dense(0.1, 0.0, 0.2, 0.3)
v1: org.apache.spark.ml.linalg.Vector = [0.1,0.0,0.2,0.3] 
scala> val v5 = LabeledPoint(1.0, v1)
v5: org.apache.spark.ml.feature.LabeledPoint = (1.0,[0.1,0.0,0.2,0.3])

scala> print(s"label:${v5.label}, features:${v5.features}")
label:1.0, features:[0.1,0.0,0.2,0.3]

 

LabeledPoint()의 첫번째 인자는 레이블 값을 나타내며, 두번째는 인자의 속성 Vector를 나타냅니다.

이 유형은 DenseVector, SparseVector 둘다 사용 가능합니다.

 

오늘은 MLlib의 Vector, LabeledPoint에 대해 간단하게 알아보았습니다.

LabeledPoint는 File을 불러와서 Label을 만들수있도록 응용이 가능하니 한번 알아봐야겠습니다!

반응형

'Spark' 카테고리의 다른 글

[We-Co] Spark MLlib - Pipeline, Logistic Regression  (0) 2021.09.28
[We-Co] Spark MLlib PipeLine(파이프라인)  (0) 2021.09.24
[We-Co] Spark MLlib  (0) 2021.09.22
[We-Co] Structured Streaming - Spark  (0) 2021.09.22
[We-Co] Spark Streaming  (0) 2021.09.16