안녕하세요, 남두오성입니다.

 

오늘은 랜덤포레스트를 스파크 Native로 짜볼게요.

 

랜덤포레스트는 머신러닝 모델 중에서도 가볍고 예측력이 높은 모델입니다.

 

NN과는 좀 다르지만, Regression 이나 Classificatin에서

 

활용도가 충분히 높은 모델입니다.

 

 

1. Input & OutPut

   1) Double 형식만 적용됩니다.

   2) categorical variable은 인덱싱 해 줘야 합니다.

 

df 라는 데이터 프레임을 불러온 다음,

//DataFrame DataType Cast
val data01 = df.
   withColumn("y", expr("y").cast(StringType)).
   withColumn("b", expr("b").cast(StringType)).
   withColumn("c", expr("c").cast(StringType)).
   withColumn("d", expr("d").cast(StringType)).
   withColumn("e", expr("e").cast(DoubleType))

 

y가 String 이므로, 인덱스 적용시켜 Double로 만들어 줍니다.

(이런 식으로 String을 모두 인덱싱 해줌)

// Index labels, adding metadata to the label column.
// Fit on whole dataset to include all labels in index.
val LabelIndexer = new StringIndexer().
   setInputCol("y").
   setOutputCol("yIndexer").
   fit(data01)
   
val data02 = LabelIndexer.transform(data01)

 

이렇게 인덱싱이 다 된 변수들을 벡터로 모아줘야 합니다.

//generate feature vector column
val assembler = new VectorAssembler().
   setInputCols(Array("b", "c", "d", "e")).
   setOutputCol("features")
   
val data03 = assembler.transform(data02)

val featureIndexer = new VectorIndexer().
   setInputCol("features").
   setOutputCol("indexedFeatures").
   setMaxCategories(4).
   fit(data03)

 

데이터를 트레이닝 세트와 테스트 세트로 나누어 줍니다. (8:2로 나누기)

// Split the data into training and test sets
val splitSeed = (s"${y}${mo}${d}").toInt
val Array(trainData, testData) = data03.randomSplit(Array(0.8, 0.2), splitSeed)

 

RF 분류 모형을 이제 만들어 봅시다.

 

val rf = new RandomForestClassifier().
   setLabelCol("yIndexer").
   setFeaturesCol("indexedFeatures").
   setFeatureSubsetStrategy("auto").
   setSeed(splitSeed)
   
// Chain indexer and forest in a Pipeline.
val pipeline = new Pipeline().
   setStages(Array(featureIndexer, rf))

// Train model. This also runs the indexer.
val rfmodel = pipeline.fit(trainData)

 

이제 테스트 세트를 넣어서 예측치를 뽑아 봅니다.

(여기에서는 Fitting이 되겠지요)

 

// Make predictions.
val predictions = rfmodel.transform(testData)

 

이렇게 나온 prediction을 가지고 MSE, MAPE 등 정확도를 측정하면 됩니다.

 

끝.

 

 

P.S. 여기 참조 많이 했습니다.

 

 

Spark ML – Aurobindo's Blogs

(From my book: Learning Spark SQL, Packt Publishing, 2017) Building the Spark ML pipeline In our example ML pipeline, we will have a sequence of Pipeline components, which are detailed, in the following sections. Using StringIndexer for indexing categorica

www.twesdai.com

 

BELATED ARTICLES

more