2016-11-09 6 views
2

VectorAssembler에서 매우 이상한 동작이 발생했으며 다른 사람이 본 적이 있는지 궁금합니다.Spark ML VectorAssembler가 이상한 결과를 반환합니다.

내 시나리오는 매우 간단합니다. 나는 어떤 표준 IntDouble 필드를 가진 CSV 파일의 데이터를 분석하고 추가 열을 계산합니다. 내 분석 기능이 반환 : 나는 인쇄 할 때 그래서

val assembler = new VectorAssembler() 
          .setInputCols(Array("orderNo", "pageNo", "joinedCounts")) 
          .setOutputCol("features") 

val assemblerData = assembler.transform(data) 

:

val parsedData = rawData.filter(row => row != header).map(parseLine) 
val data = sqlContext.createDataFrame(parsedData).toDF("label", "orderNo", "pageNo","joinedCounts") 

내가 다음 사용과 같은 VectorAssembler :

val joined = countPerChannel ++ countPerSource //two arrays of Doubles joined 
(label, orderNo, pageNo, Vectors.dense(joinedCounts)) 

내 주요 기능은 다음과 같습니다 구문 분석 함수를 사용 내 데이터의 행이 VectorAssembler에 들어가기 전에 다음과 같이 보입니다.

[3.2,17.0,15.0,[0.0,0.0,0.0,0.0,3.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,4.0,0.0,0.0,2.0]] 

나는 데이터의 동일한 행을 인쇄하고 VectorAssembler의 변환 기능이 얻을 후 :

[3.2,(18,[0,1,6,9,14,17],[17.0,15.0,3.0,1.0,4.0,2.0])] 

대체 무슨 일이야? VectorAssembler은 무엇이 완료 되었습니까? 나는 모든 계산을 두 번 확인하고 심지어 간단한 Spark 예제를 따르고 코드에 무엇이 잘못되었는지를 볼 수 없습니다. 너는 할수 있니?

답변

7

출력에 대해 이상한 점은 없습니다. 귀하의 벡터는 제로 요소를 많이 가지고있는 것처럼 보입니다. 따라서 Apache Spark는 귀하의 벡터를 희소하게 표현했습니다.

더 설명하기 :

당신의 벡터가 (18 개) 요소 (차원)

이 벡터에서 [0,1,6,9,14,17]을와 indices 위해 [17.0,15.0,3.0,1.0,4.0,2.0]

스파 스 벡터입니다 비 제로의 요소가 포함되어 구성되어있다처럼 보인다 표현은 계산 공간을 더 쉽고 빠르게 계산할 수있는 방법입니다. 스파 스 표현에 대한 자세한 내용 here.

이제 희박한 표현을 희박한 표현으로 변환 할 수 있지만 비용은 발생합니다.

편집 : 귀하의 의견에 따라 기능 중요성을 높이는 데 관심이있는 것으로 보입니다. 따라서 this을 살펴 보시기 바랍니다.

+0

변경할 수 있습니까? – Dimitris

+0

또한 LinearRegression 알고리즘을 사용하고 각 입력에 대한 계수를 얻고 싶습니다. 이 희박한 표현은 그 계수를 얻는 것을 더 어렵게합니까? – Dimitris

+0

더 어렵지 않습니다. 인덱스와 요소 사이에 단순한 맵을 가진 하나의 벡터 출력이라고 생각하기 때문에 스파 스 벡터를 고밀도 벡터로 변환 할 수 있습니다. – eliasah