Я пытаюсь выполнить настройку гиперпараметров в scala, используя GridCV.Тем не менее, я создаю свой конвейер и все, я подгоняю свой набор данных к конвейеру, он корректно вписывается.
Затем я добавляю немного paramGrid
, и я иду на перекрестную проверку после 4 этапов, это выдает мне ошибку:
scala> val cvModel = cv.fit(df)
Tracker started, with env={DMLC_NUM_SERVER=0, DMLC_TRACKER_URI=10.xx.xx.xxx, DMLC_TRACKER_PORT=9091, DMLC_NUM_WORKER=1}
Tracker started, with env={DMLC_NUM_SERVER=0, DMLC_TRACKER_URI=10.xx.xx.xxx, DMLC_TRACKER_PORT=9091, DMLC_NUM_WORKER=1}
Tracker started, with env={DMLC_NUM_SERVER=0, DMLC_TRACKER_URI=10.xx.xx.xxx, DMLC_TRACKER_PORT=9091, DMLC_NUM_WORKER=1}
Tracker started, with env={DMLC_NUM_SERVER=0, DMLC_TRACKER_URI=10.xx.xx.xxx, DMLC_TRACKER_PORT=9091, DMLC_NUM_WORKER=1}
19/02/13 09:16:33 WARN TaskSetManager: Lost task 2.0 in stage 152.0 (TID 916, ip-10.xx.xx.xxx.ec2.internal, executor 7): java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.spark.ml.linalg.DenseVector.apply(Vectors.scala:448)
at org.apache.spark.ml.evaluation.BinaryClassificationEvaluator$$anonfun$1.apply(BinaryClassificationEvaluator.scala:82)
at org.apache.spark.ml.evaluation.BinaryClassificationEvaluator$$anonfun$1.apply(BinaryClassificationEvaluator.scala:81)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
at org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter..
А потом два или три абзаца ошибки на самом деле.Я не могу понять, почему это происходит, так как я впервые пишу в Scala.Но в соответствии с моей концепцией и кодом, приведенным в примерах, это не похоже на тренировку.
Вот мой код:
import java.util.Calendar
import org.apache.log4j.{Level, Logger}
import org.apache.spark.ml.feature._
import org.apache.spark.sql._
import org.apache.spark.sql.functions.lit
import java.io.PrintWriter
import java.io.File
import org.apache.spark.ml.feature.StringIndexer
import org.apache.spark.ml.tuning._
import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator
import ml.dmlc.xgboost4j.scala.spark.XGBoostClassifier
import ml.dmlc.xgboost4j.scala.spark.XGBoostClassificationModel
import org.apache.spark.ml.{Pipeline, PipelineModel}
val spark = SparkSession.builder().getOrCreate()
val dataset = spark.sql("select * from userdb.xgb_train_data")
val df = dataset.na.fill(0)
val header = df.columns.filter(_ != "id").filter(_ != "y_val")
val assembler = new VectorAssembler().setInputCols(header).setOutputCol("features")
val booster= new XGBoostClassifier().setLabelCol("y_val")
val pipeline = new Pipeline().setStages(Array(assembler,booster))
val model = pipeline.fit(df)
val evaluator = new BinaryClassificationEvaluator().setLabelCol("y_val")
val paramGrid = new ParamGridBuilder().
addGrid(booster.maxDepth, Array(3, 8)).
addGrid(booster.eta, Array(0.2, 0.6)).
build()
val cv = new CrossValidator().
setEstimator(pipeline).
setEvaluator(evaluator).
setEstimatorParamMaps(paramGrid).
setNumFolds(10)
val cvModel = cv.fit(df)
val bestModel = cvModel.bestModel.asInstanceOf[PipelineModel].stages()
.asInstanceOf[XGBoostClassificationModel]
bestModel.extractParamMap()
Или есть какой-либо другой способ сделать гипернастройка параметров и проверка на перекрестную проверку?Я сталкиваюсь с проблемой при выполнении кода setEvaluator
.Что я понимаю, так это то, что моя форма и форма прогноза y не совпадают.Но как мне убедиться, что они это делают?
PS Я запускаю это на кластере EMR.Также я попробовал то же самое, просто изменив алгоритм на Логистическую регрессию, и он просто отлично работает.И я использую xgboost v0.8 и spark v2.2