2015-01-09 2 views
0

최근에 학생들이 Spark/MLlib/Scala를 사용하여 기계 학습을 배우기 위해 실험실 재료를 준비해야합니다. 나는 기계 학습에 익숙하지만 Spark에 익숙하지 않습니다.Spark/MLlib : 비선형 모델을 훈련하기위한 피쳐 사각형 추가

기계 학습의 "교과서"트릭 중 하나는 비선형 모델을 허용하기 위해 더 높은 차원의 원래 기능을 추가하는 것입니다. 예를 들어, LIBSVM 파일에서 교육 데이터를로드 한 후에 원본 데이터 외에 모든 기능의 제곱을 추가하고 싶습니다.

// Load training data in LIBSVM format. 
val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt") 
val data_add_square = data.map(s => { 
    val tmp = sc.parallelize(s.features.toArray) 
    val tmp_sqr = tmp.map(x => x*x) 
    new LabeledPoint(s.label, Vectors.dense(s.features.toArray ++ tmp_sqr.collect)) 
}) 

은 어떻게 든 내가이 구현도 "헤비급"이고 그렇게 할 수있는 올바른 방법으로하지 보이는 느낌 : 내 현재의 제한된 지식은 아래의 구현을 얻을 수 있습니다. 누구든지이 문제에 관해 밝힐 수 있습니까?

답변

0

각 기능 벡터를 병렬 처리하는 데 과도 함이 정의되어 있으므로 각 LabeledPoint에 대해 RDD를 만드는 데 너무 느려지므로 Spark 클러스터를 종료하면됩니다.

또한 스파 스 및 밀도 벡터를 별도로 사용하는 것이 좋습니다. 당신이 스파 스 벡터를 원래 가지고 있다면 강력하게 제곱 된 특징을위한 스파 스 벡터를 만들 것을 강력하게 제안합니다.

코드, 당신은하지만 큰 특징 벡터

val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt") 
    val dataWithSquares = data map { labeledPoint => 

    val featuresWithSquared = labeledPoint.features match { 
     case denseVector: DenseVector => 
     val original = denseVector.values 
     val squared = original.map(v => v * v) 
     Vectors.dense(original ++ squared) 

     case sparseVector: SparseVector => 
     val builder = collection.mutable.ListBuffer.empty[(Int, Double)] 
     // Collect original values firsts 
     sparseVector foreachActive { case (idx, v) => builder += idx -> v} 
     // Collect squared 
     sparseVector foreachActive { case (idx, v) => builder += idx -> v * v} 
     Vectors.sparse(sparseVector.size * 2, builder) 
    } 

    LabeledPoint(labeledPoint.label, featuresWithSquared) 
    } 
+0

감사의 경우에 더 잘 작동해야 더 무거운 조금 무거운 보인다. 네이티브 배열에서'map()'을 호출 할 수 있는지 몰랐다. 고밀도 및 희소 한 벡터를 별도로 처리하는 것도 좋은 생각입니다. – Neo1989