spark-shell에서 PCA를 공부한다. (차원 축소)


차원 축소는 고려하는 변수의 수를 줄이는 과정이다. 원본과 잡음이 많은 피쳐에서 잠재 피쳐를 추출하거나 구조를 유지하면서 데이터를 압축하는 데 사용할 수 있다. 스파크 MLlib는 RowMatrix 클래스의 차원 축소를 지원한다. 데이터의 차원을 줄이기 위해 가장 일반적으로 사용되는 알고리즘은 PCA와 SVD이다. 


PCA를 살펴본다.



PCA는 가능한 상관 변수의 관찰 셋을 주성분(Principal component)라고 부르는 선형 무상관 변수 집합으로 변환하기 위해 직교(orthogonal) 트랜스포메이션을 사용하는 통계적 과정이다.



PCA 알고리즘은 PCA를 사용해 저차원 공간에 벡터를 투영하는 데 사용할 수 있다. 



그런 다음, 감소 된 피쳐 벡터에 기초해 ML 모델을 트레이닝할 수 있다. 


다음 예는 6차원 피쳐 벡터를 4 차원 주성분에 투영하는 방법을 보여준다. 다음과 같은 피쳐 벡터가 있다고 가정한다.


scala>
import org.apache.spark.ml.linalg.Vectors


val data = Array(

Vectors.dense(3.5, 2.0, 5.0, 6.3, 5.60, 2.4),

Vectors.dense(4.40, 0.10, 3.0, 9.0, 7.0, 8.75),

Vectors.dense(3.20, 2.40, 0.0, 6.0, 7.4, 3.34))





* 여기서 주의할 점은 Vectors의 패키지를 잘 확인해야 한다.


import org.apache.spark.mllib.linalg.Vectors이 아니라 import org.apache.spark.ml.linalg.Vectors을 사용해야 한다.




이제 데이터 프레임을 생성하자.


scala>


val df = spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")

df.show(false)


+--------------------------+

|features                  |

+--------------------------+

|[3.5,2.0,5.0,6.3,5.6,2.4] |

|[4.4,0.1,3.0,9.0,7.0,8.75]|

|[3.2,2.4,0.0,6.0,7.4,3.34]|

+--------------------------+




이제 PCA에 대한 6차원 피쳐 벡터를 갖는 피쳐 데이터 프레임을 생성한다.


이제 다음과 같은 매개 변수를 설정하여 PCA 모델을 초기화한다.



import org.apache.spark.ml.feature.PCA


val pca = new PCA()

.setInputCol("features")

.setOutputCol("pcaFeatures")

.setK(4)

.fit(df)






차이를 주기 위해 setOutputCol 메소드를 사용하여 출력 컬럼을 pcaFeatures로 설정했다. 

그리고 PCA의 차원을 설정했다. 

마지막으로 트랜스포메이션을 생성하기 위해 데이터 프레임을 피팅했다. 



PCA 모델에는 explain variance(분산도)이 포함된다. 



val result = pca.transform(df).select("pcaFeatures")

result.show(false)


+-------------------------------------------------------------------------------+

|pcaFeatures                                                                    |

+-------------------------------------------------------------------------------+

|[-5.149253129088708,3.2157431427730376,-5.390271710168745,-1.0528214606325355] |

|[-12.372614091904456,0.8041966678176822,-5.390271710168748,-1.0528214606325337]|

|[-5.649682494292663,-2.1891778048858255,-5.390271710168744,-1.0528214606325337]|

+-------------------------------------------------------------------------------+



이전 코드는 PCA를 사용해 주성분으로서 4차원의 피쳐 벡터를 갖는 피쳐 데이터 프레임을 생성한다. 



Posted by 김용환 '김용환'

댓글을 달아 주세요