Перекрестная валидация при выполнении в случайном лесу навсегда на кластере EMR - PullRequest
0 голосов
/ 03 июня 2019

У меня есть написанный код на Spark Scala для модели RandomForest. Мои данные имеют 200 миллионов записей и 12 функций. Это работает для простого RandomFores, однако, для настройки гиперпараметра с GridBuilder и CrossValidation даже с выборочными данными и одним значением для каждого параметра в paramGridBuilder - это всегда! Есть идеи почему?

Я выполняю код на кластерах EMR с экземплярами памяти C5.2xlarge. 1 главный узел, 4 узла кода и 5 узлов задачи. Я попробовал этот код:

val stringIndexer_label = new StringIndexer().setInputCol("lbl").setOutputCol("label").fit(df_data)

val playerIndexer = new StringIndexer().setInputCol("player").setOutputCol("player_index").setHandleInvalid("keep")

val domain_bundleIndexer = new StringIndexer().setInputCol("domain_bundle").setOutputCol("domain_bundle_index").setHandleInvalid("keep")

val cityIndexer = new StringIndexer().setInputCol("city").setOutputCol("city_index").setHandleInvalid("keep")

val regionIndexer = new StringIndexer().setInputCol("region").setOutputCol("region_index").setHandleInvalid("keep")


// val categoricalColumns = Array(("device_id", "player", "bundle",  "city", "region")

//
val vectorAssembler_features = new VectorAssembler().
setInputCols(Array("player_index", "city_index","region_index","domain_bundle_index", "uid_type","advertiser_id" ,"dayweek", "hour", "video_duration", "exchange_id", "device_type_id", "ip", "user_agent_hash")).
setOutputCol("features")


////////////////////////////////
/////// RANDOM FOREST 


val rf = new RandomForestClassifier().setLabelCol("label").setFeaturesCol("features").setMaxBins(100000000).setNumTrees(101).setMaxDepth(8)

val labelConverter = new IndexToString().setInputCol("prediction").setOutputCol("predictedLabel").setLabels(stringIndexer_label.labels)

val pipelineRF = new Pipeline().setStages(Array(stringIndexer_label,domain_bundleIndexer, playerIndexer, cityIndexer, regionIndexer,vectorAssembler_features, rf))
//

val paramGridRF = new ParamGridBuilder().
// addGrid(rf.maxBins, Array(100,200)).
addGrid(rf.maxDepth, Array(4, 8,10)).
addGrid(rf.numTrees, Array( 11, 51, 101)).
addGrid(rf.impurity, Array("entropy", "gini")).
build()

// val paramGridRF = new ParamGridBuilder().
// // addGrid(rf.maxBins, Array(100)).
// addGrid(rf.maxDepth, Array(10)).
// addGrid(rf.numTrees, Array( 11)).
// addGrid(rf.impurity, Array("entropy")).
// build()


val evaluatorRF= new BinaryClassificationEvaluator().
setLabelCol("label").
setRawPredictionCol("prediction")

val crossvalRF = new CrossValidator().
setEstimator(pipelineRF).
setEvaluator(evaluatorRF).
setEstimatorParamMaps(paramGridRF).
//setNumFolds(3).
setCollectSubModels(true)

// **** model.subModels

val pipelineModelRF = crossvalRF.fit(training_data)

Поскольку время выполнения для простой модели без перекрестной проверки занимает ~ 10 минут, я ожидаю, что приведенный выше код (закомментированный paramGrid) займет 3 раза * 10 минут = 30 минут. Но это никогда не заканчивается. Кто-нибудь может дать мне предложение?

...