From ac30a0aff5616af39af0be8b06da3d5348363910 Mon Sep 17 00:00:00 2001 From: Nan Zhu Date: Sat, 4 Mar 2017 14:14:31 -0800 Subject: [PATCH] [jvm-packages][spark]Preserve num classes (#2068) * add back train method but mark as deprecated * fix scalastyle error * change class to object in examples * fix compilation error * bump spark version to 2.1 * preserve num_class issues * fix failed test cases * rivising * add multi class test --- .../scala/spark/XGBoostEstimator.scala | 21 +- .../spark/params/LearningTaskParams.scala | 9 +- .../src/test/resources/dermatology.data | 366 ++++++++++++++++++ .../scala/spark/XGBoostDFSuite.scala | 43 +- 4 files changed, 424 insertions(+), 15 deletions(-) create mode 100644 jvm-packages/xgboost4j-spark/src/test/resources/dermatology.data diff --git a/jvm-packages/xgboost4j-spark/src/main/scala/ml/dmlc/xgboost4j/scala/spark/XGBoostEstimator.scala b/jvm-packages/xgboost4j-spark/src/main/scala/ml/dmlc/xgboost4j/scala/spark/XGBoostEstimator.scala index 7f25401b2..c00d16ad0 100644 --- a/jvm-packages/xgboost4j-spark/src/main/scala/ml/dmlc/xgboost4j/scala/spark/XGBoostEstimator.scala +++ b/jvm-packages/xgboost4j-spark/src/main/scala/ml/dmlc/xgboost4j/scala/spark/XGBoostEstimator.scala @@ -97,7 +97,12 @@ class XGBoostEstimator private[spark]( for (param <- params) { xgbParamMap += param.name -> $(param) } - xgbParamMap.toMap + val r = xgbParamMap.toMap + if (!XGBoost.isClassificationTask(r) || $(numClasses) == 2) { + r - "num_class" + } else { + r + } } /** @@ -110,19 +115,13 @@ class XGBoostEstimator private[spark]( LabeledPoint(label, feature) } transformSchema(trainingSet.schema, logging = true) - val trainedModel = XGBoost.trainWithRDD(instances, fromParamsToXGBParamMap, + val derivedXGBoosterParamMap = fromParamsToXGBParamMap + val trainedModel = XGBoost.trainWithRDD(instances, derivedXGBoosterParamMap, $(round), $(nWorkers), $(customObj), $(customEval), $(useExternalMemory), $(missing)).setParent(this) val returnedModel = copyValues(trainedModel) - if (XGBoost.isClassificationTask(xgboostParams)) { - val numClass = { - if (xgboostParams.contains("num_class")) { - xgboostParams("num_class").asInstanceOf[Int] - } else { - 2 - } - } - returnedModel.asInstanceOf[XGBoostClassificationModel].numOfClasses = numClass + if (XGBoost.isClassificationTask(derivedXGBoosterParamMap)) { + returnedModel.asInstanceOf[XGBoostClassificationModel].numOfClasses = $(numClasses) } returnedModel } diff --git a/jvm-packages/xgboost4j-spark/src/main/scala/ml/dmlc/xgboost4j/scala/spark/params/LearningTaskParams.scala b/jvm-packages/xgboost4j-spark/src/main/scala/ml/dmlc/xgboost4j/scala/spark/params/LearningTaskParams.scala index 0f6b73a3c..1ac0778f7 100644 --- a/jvm-packages/xgboost4j-spark/src/main/scala/ml/dmlc/xgboost4j/scala/spark/params/LearningTaskParams.scala +++ b/jvm-packages/xgboost4j-spark/src/main/scala/ml/dmlc/xgboost4j/scala/spark/params/LearningTaskParams.scala @@ -18,10 +18,15 @@ package ml.dmlc.xgboost4j.scala.spark.params import scala.collection.immutable.HashSet -import org.apache.spark.ml.param.{DoubleParam, Param, Params} +import org.apache.spark.ml.param.{DoubleParam, IntParam, Param, Params} trait LearningTaskParams extends Params { + /** + * number of tasks to learn + */ + val numClasses = new IntParam(this, "num_class", "number of classes") + /** * Specify the learning task and the corresponding learning objective. * options: reg:linear, reg:logistic, binary:logistic, binary:logitraw, count:poisson, @@ -48,7 +53,7 @@ trait LearningTaskParams extends Params { s" {${LearningTaskParams.supportedEvalMetrics.mkString(",")}}", (value: String) => LearningTaskParams.supportedEvalMetrics.contains(value)) - setDefault(objective -> "reg:linear", baseScore -> 0.5) + setDefault(objective -> "reg:linear", baseScore -> 0.5, numClasses -> 2) } private[spark] object LearningTaskParams { diff --git a/jvm-packages/xgboost4j-spark/src/test/resources/dermatology.data b/jvm-packages/xgboost4j-spark/src/test/resources/dermatology.data new file mode 100644 index 000000000..5cec8187b --- /dev/null +++ b/jvm-packages/xgboost4j-spark/src/test/resources/dermatology.data @@ -0,0 +1,366 @@ +2,2,0,3,0,0,0,0,1,0,0,0,0,0,0,3,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,55,2 +3,3,3,2,1,0,0,0,1,1,1,0,0,1,0,1,2,0,2,2,2,2,2,1,0,0,0,0,0,0,0,1,0,8,1 +2,1,2,3,1,3,0,3,0,0,0,1,0,0,0,1,2,0,2,0,0,0,0,0,2,0,2,3,2,0,0,2,3,26,3 +2,2,2,0,0,0,0,0,3,2,0,0,0,3,0,0,2,0,3,2,2,2,2,0,0,3,0,0,0,0,0,3,0,40,1 +2,3,2,2,2,2,0,2,0,0,0,1,0,0,0,1,2,0,0,0,0,0,0,0,2,2,3,2,3,0,0,2,3,45,3 +2,3,2,0,0,0,0,0,0,0,0,0,2,1,0,2,2,0,2,0,0,0,1,0,0,0,0,2,0,0,0,1,0,41,2 +2,1,0,2,0,0,0,0,0,0,0,0,0,0,3,1,3,0,0,0,2,0,0,0,0,0,0,0,0,0,0,2,0,18,5 +2,2,3,3,3,3,0,2,0,0,0,2,0,0,0,2,3,0,0,0,0,0,0,0,0,2,2,3,2,0,0,3,3,57,3 +2,2,1,0,2,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,22,4 +2,2,1,0,1,0,0,0,0,0,0,0,0,0,0,3,2,0,2,0,0,0,0,0,0,0,0,2,0,0,0,2,0,30,4 +3,3,2,1,1,0,0,0,2,2,1,0,0,0,0,0,3,2,3,2,2,2,1,1,0,0,0,0,0,0,0,1,0,20,1 +2,2,0,3,0,0,0,0,0,0,0,0,0,2,0,2,2,0,0,0,0,0,1,0,0,0,0,3,0,0,0,1,0,21,2 +3,3,1,2,0,0,0,0,0,1,0,0,0,2,0,3,1,0,1,0,0,0,0,0,0,0,0,2,0,0,0,1,0,22,2 +2,3,3,0,0,0,0,0,1,1,1,0,0,1,0,0,2,1,2,1,2,3,0,2,0,0,0,0,0,0,0,2,0,10,1 +2,2,3,3,0,3,0,2,0,0,0,2,0,0,0,1,1,1,1,0,0,0,0,0,2,0,3,0,3,0,0,1,3,65,3 +1,1,0,1,3,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,40,4 +2,2,1,3,0,0,0,0,0,0,0,0,0,2,0,2,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,30,2 +3,3,3,0,0,0,0,0,3,3,1,0,0,2,0,0,2,0,2,3,3,3,2,3,0,3,0,0,0,0,0,2,0,38,1 +2,1,3,3,3,3,0,0,2,0,0,3,0,0,0,3,2,0,1,0,0,0,0,0,3,0,2,0,3,0,0,2,3,23,3 +1,1,0,3,0,0,0,0,0,0,0,0,0,0,3,0,3,2,2,0,3,0,0,0,0,0,0,1,0,0,0,2,0,17,5 +2,1,1,2,0,0,3,0,1,2,0,0,0,1,0,0,1,2,2,0,1,0,1,0,0,0,0,0,0,1,2,1,0,8,6 +3,2,2,0,0,0,0,0,0,0,0,0,0,2,0,2,2,1,2,0,2,1,2,0,0,0,0,3,0,0,0,2,0,51,2 +2,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1,3,1,2,0,2,1,0,0,0,0,0,1,0,1,0,2,0,42,5 +2,2,2,3,2,2,0,2,0,0,0,3,2,0,0,0,2,1,1,0,0,0,0,0,3,0,3,0,2,0,0,2,3,44,3 +2,0,0,3,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,0,0,2,0,22,5 +2,1,1,0,1,0,0,0,2,0,0,0,0,0,0,0,2,2,2,2,2,2,1,2,0,2,0,0,0,0,0,2,0,33,1 +1,1,0,1,0,0,3,0,1,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,0,1,0,2,2,1,0,10,6 +1,2,2,3,0,0,0,0,0,0,0,0,0,0,1,1,2,1,1,0,3,0,0,0,0,0,0,1,0,0,0,3,0,17,5 +3,2,2,2,0,0,0,0,0,0,0,0,0,2,0,3,3,3,2,0,0,0,0,0,0,0,0,2,0,1,1,2,0,43,2 +1,1,2,3,2,2,0,3,0,0,0,2,0,0,0,2,2,1,2,0,0,0,0,0,3,0,3,0,3,1,0,2,3,50,3 +3,2,1,2,0,0,0,0,1,2,0,0,0,1,0,0,2,0,3,2,2,2,1,2,0,2,0,0,0,0,0,1,0,50,1 +3,2,0,2,0,0,0,0,0,0,0,0,1,2,0,2,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,10,2 +2,3,3,3,3,0,0,0,3,3,0,0,0,0,0,0,3,2,2,3,3,3,1,3,0,0,0,0,0,0,0,1,0,34,1 +2,2,1,0,0,0,0,0,1,0,1,0,0,2,0,0,2,1,2,2,1,2,0,1,0,0,0,0,0,0,0,0,0,?,1 +2,1,0,0,2,0,0,0,0,0,0,0,0,0,0,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,?,4 +2,2,1,2,0,0,0,0,0,0,0,0,0,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,?,2 +2,1,2,3,2,3,0,2,0,0,1,1,0,0,0,2,1,1,2,0,0,0,0,0,1,0,2,0,2,0,0,0,3,?,3 +2,1,1,1,0,0,0,0,0,0,0,0,0,1,0,3,2,1,0,0,0,0,2,0,0,0,0,2,0,0,0,1,0,15,2 +2,1,2,3,2,1,0,2,0,0,0,0,0,0,0,2,2,2,1,0,0,0,0,0,2,0,1,0,3,0,0,2,3,26,3 +3,3,2,0,0,0,0,0,2,2,1,0,0,1,0,0,2,2,3,2,2,1,0,2,0,0,0,0,0,0,0,1,0,46,1 +1,1,1,0,0,0,1,0,0,0,0,0,1,1,0,2,1,1,1,0,0,0,0,0,0,0,0,3,0,0,0,1,0,51,2 +1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,62,4 +3,2,1,1,0,0,0,0,2,1,0,0,0,0,0,0,2,1,1,1,1,1,0,1,0,0,0,0,0,0,0,1,0,15,1 +2,1,1,0,0,0,0,0,1,0,0,0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,35,2 +0,1,0,3,0,0,0,0,0,0,0,0,0,0,2,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,30,5 +2,1,1,1,1,2,0,1,0,0,0,2,0,0,0,3,2,1,1,0,0,0,0,0,2,0,2,0,2,0,0,3,3,48,3 +2,1,1,3,3,0,0,0,0,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,0,0,1,0,0,0,2,0,46,4 +2,1,1,1,0,0,2,0,3,2,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12,6 +1,2,1,1,0,0,0,0,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,2,0,0,0,0,2,52,2 +2,0,1,0,0,2,0,1,0,0,0,3,0,0,0,2,2,2,2,0,0,0,0,0,1,0,3,0,2,0,0,2,2,60,3 +3,1,1,2,2,2,0,0,0,0,0,2,0,0,0,2,1,0,1,0,0,0,0,0,1,0,2,0,3,0,0,2,3,32,3 +1,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,35,4 +2,2,1,0,0,0,0,0,2,2,0,0,0,1,0,0,2,1,1,1,2,2,1,2,0,0,0,0,0,0,0,1,0,41,1 +3,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,1,0,2,2,2,3,0,3,0,0,0,0,0,0,0,2,0,48,1 +0,1,0,2,0,0,0,0,0,0,0,0,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,0,0,0,0,3,0,51,5 +2,2,2,0,0,0,0,0,0,1,0,0,0,0,0,1,2,0,2,1,3,2,0,1,0,0,0,0,0,0,0,1,0,19,1 +1,1,1,2,0,0,0,0,0,0,0,0,1,1,0,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,22,2 +2,1,1,3,0,3,0,1,0,0,0,1,0,0,0,2,2,0,1,0,0,0,0,0,1,0,3,0,1,0,0,2,2,29,3 +1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,1,0,0,0,1,0,25,4 +3,3,0,3,0,0,0,0,0,0,0,0,1,1,0,3,1,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,33,2 +2,2,1,1,0,0,1,0,1,1,1,0,0,0,0,1,2,1,1,1,1,0,0,0,0,0,0,1,0,1,1,1,0,8,6 +2,1,1,0,0,0,0,0,1,1,1,0,0,1,0,0,2,2,2,2,2,2,0,1,0,1,0,0,0,0,0,1,0,40,1 +1,1,0,1,0,0,0,0,0,0,0,0,0,0,2,1,3,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,0,33,5 +3,3,2,1,1,0,0,0,2,2,1,0,0,0,0,0,3,2,3,2,2,2,1,1,0,0,0,0,0,0,0,1,0,42,1 +2,2,0,3,0,0,0,0,0,0,0,0,0,2,0,3,1,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,36,2 +3,2,2,2,0,2,0,1,0,0,0,2,0,0,0,1,1,1,1,0,0,0,0,0,2,0,2,0,2,0,0,1,3,60,3 +2,2,2,0,0,0,0,0,2,2,0,0,0,1,0,0,2,0,2,3,3,3,1,3,0,3,0,0,0,0,0,3,0,36,1 +1,1,0,1,3,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,21,4 +3,3,3,2,0,0,0,0,0,0,0,0,0,0,3,2,2,2,2,0,2,0,0,0,0,0,0,0,0,0,0,3,0,40,5 +3,3,3,0,1,0,0,0,2,0,0,0,0,0,0,1,1,2,2,2,2,2,0,0,0,0,0,0,0,0,0,2,0,21,1 +2,2,2,1,0,0,0,0,0,0,0,0,0,1,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,34,2 +2,1,2,0,0,0,3,0,3,0,0,0,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,0,0,3,3,0,0,13,6 +1,1,1,1,1,0,0,1,0,0,0,2,0,0,0,3,1,0,1,0,0,0,0,0,2,0,2,0,2,0,0,2,3,52,3 +1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,0,1,0,0,0,0,0,0,0,0,0,0,2,0,48,5 +2,1,2,2,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,2,0,0,0,1,0,17,4 +3,2,1,2,0,0,0,0,0,0,0,0,0,2,0,2,1,0,2,0,0,0,0,0,0,0,0,2,0,0,0,2,0,25,2 +2,2,2,1,0,0,0,0,0,0,0,0,0,2,0,1,2,0,3,0,0,0,0,0,0,0,0,3,0,0,0,0,0,33,2 +2,1,2,2,2,0,0,0,0,0,0,0,1,2,0,2,2,2,2,2,2,1,1,1,0,0,0,0,0,0,0,3,0,62,1 +0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,3,1,1,1,0,0,0,0,0,2,0,3,3,3,0,0,3,3,52,3 +2,2,1,2,0,0,0,0,0,0,0,0,0,0,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,27,5 +3,2,2,2,2,0,0,0,0,0,0,0,0,1,0,0,2,1,1,1,2,1,1,1,0,0,0,0,0,0,0,2,0,40,1 +3,2,2,2,0,0,0,0,0,0,0,0,0,3,0,2,2,0,3,0,0,0,0,0,0,0,0,2,0,0,0,1,0,31,2 +2,1,1,2,0,0,0,0,0,0,0,0,0,2,0,3,2,0,2,0,0,0,0,0,0,0,0,3,0,0,0,3,0,27,2 +3,2,2,1,0,0,0,0,0,0,0,0,0,1,0,2,1,0,2,0,0,0,0,0,0,0,0,2,0,0,0,2,0,10,2 +1,1,2,3,0,0,0,0,0,0,0,0,0,0,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,55,5 +2,2,2,3,3,0,0,0,0,2,0,0,1,2,0,1,1,1,1,1,1,1,1,2,0,0,0,0,0,0,0,2,0,30,1 +3,3,2,2,1,0,0,0,0,1,0,0,2,2,0,1,2,1,1,1,2,1,2,1,0,0,0,0,0,0,0,2,0,42,1 +2,1,2,1,1,0,0,2,0,0,0,2,0,0,0,2,2,0,2,0,0,0,0,0,3,0,3,0,3,0,0,3,3,48,3 +0,1,2,1,1,0,1,0,2,3,0,0,0,1,0,0,3,1,2,3,3,3,1,1,0,0,0,0,0,0,0,2,0,22,1 +1,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,0,1,0,31,4 +3,2,1,3,0,0,0,0,0,0,1,0,1,2,0,3,2,0,1,0,1,0,0,0,0,0,0,3,0,0,0,1,0,50,2 +2,1,0,2,0,0,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,43,2 +1,1,1,3,0,0,1,0,0,0,0,0,0,0,2,1,3,1,1,0,2,0,0,0,0,0,0,1,0,0,0,2,0,30,5 +3,3,3,3,3,0,0,0,3,3,1,0,0,1,0,0,2,1,2,2,2,2,2,2,0,1,0,0,0,0,0,2,0,42,1 +2,1,1,3,2,2,0,2,0,0,0,2,0,0,0,2,2,0,1,0,0,0,0,0,2,0,3,0,2,0,0,3,3,22,3 +2,1,0,2,2,0,0,0,0,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,18,4 +2,2,1,2,0,0,0,0,0,0,0,0,0,1,0,3,2,0,1,0,0,0,0,0,0,0,0,3,0,0,0,2,0,35,2 +1,1,1,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,0,0,3,0,0,0,0,0,0,0,0,0,0,1,0,60,5 +2,2,2,2,2,0,0,0,2,1,0,0,0,0,0,2,0,2,2,2,2,2,1,1,0,0,0,0,0,0,0,1,0,28,1 +2,2,1,0,0,0,2,0,2,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,13,6 +2,2,1,1,0,0,0,0,1,0,0,0,1,1,0,2,2,1,1,0,1,0,1,0,0,0,0,2,0,0,0,1,0,20,2 +1,1,2,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,64,5 +3,3,3,2,2,0,0,0,2,2,0,0,0,1,0,0,1,0,1,1,1,1,1,1,0,2,0,0,0,0,0,3,0,43,1 +2,3,1,2,0,0,0,0,0,0,0,0,1,0,0,3,2,0,2,0,2,0,0,0,0,0,0,2,0,0,0,1,0,20,2 +1,2,2,1,0,0,0,0,0,0,0,0,2,0,0,2,3,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,34,2 +2,2,2,2,2,0,0,0,2,2,1,0,0,1,0,0,2,1,2,2,2,1,0,2,0,0,1,0,0,0,0,1,0,39,1 +1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,60,4 +1,1,1,1,1,0,0,0,1,1,0,0,0,2,0,0,1,2,1,1,1,2,0,3,0,0,0,0,0,0,0,2,0,38,1 +2,2,3,2,1,3,0,2,0,0,0,2,0,0,0,2,3,0,0,0,0,0,0,0,2,0,3,0,2,0,0,2,3,44,3 +3,2,1,2,2,0,0,0,2,2,0,0,0,1,0,0,2,3,2,2,2,3,0,3,0,0,0,0,0,0,0,3,1,36,1 +2,2,2,3,2,0,0,0,3,3,0,0,0,1,0,0,2,0,2,2,2,2,2,2,0,1,0,0,0,0,0,2,0,41,1 +2,2,2,3,2,2,0,2,0,0,0,3,0,0,0,3,2,0,1,0,0,0,0,0,2,0,3,2,3,0,0,3,3,18,3 +1,1,2,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,2,0,39,5 +2,2,3,2,3,3,0,3,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,3,0,2,2,2,0,0,2,2,40,3 +1,1,1,2,2,2,0,2,0,0,0,2,0,0,0,2,2,0,1,0,0,0,0,0,2,0,2,0,2,0,0,3,3,47,3 +2,2,2,3,0,0,1,0,0,0,0,0,0,0,3,1,2,2,2,0,2,0,0,0,0,0,0,0,0,0,0,1,0,16,5 +2,2,1,2,0,0,0,0,0,0,0,0,0,1,0,2,2,0,2,0,0,0,0,0,0,0,0,2,0,0,0,2,0,27,2 +2,2,3,2,2,2,0,3,0,0,0,2,0,0,2,2,2,0,1,0,0,0,0,0,2,0,3,3,2,0,0,2,2,52,3 +2,2,0,2,2,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,3,0,0,0,2,0,25,4 +1,1,1,1,1,0,0,0,2,2,0,0,0,2,0,0,2,1,1,2,2,1,0,2,0,0,0,0,0,0,0,0,2,0,1 +3,3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,1,0,0,0,0,0,0,3,0,0,0,2,0,33,2 +2,2,2,1,0,0,2,0,0,0,0,0,0,0,3,1,3,2,2,0,2,0,0,0,0,0,0,0,0,0,0,2,0,46,5 +1,1,2,0,0,0,3,0,3,0,1,0,0,0,0,2,1,1,1,1,0,0,0,0,0,0,0,0,0,2,2,2,0,7,6 +2,3,3,3,3,0,0,0,2,1,0,0,0,0,0,2,2,1,3,3,3,3,0,0,0,0,0,0,0,0,0,2,0,30,1 +3,2,2,2,2,0,0,0,0,3,0,0,0,2,0,0,3,1,3,3,3,2,0,1,0,0,0,0,0,0,0,2,0,29,1 +2,2,1,1,0,0,0,0,0,0,0,0,0,1,0,2,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,1,0,23,2 +2,2,2,0,0,0,2,0,2,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,2,2,2,0,8,6 +2,2,2,2,3,2,0,3,0,0,0,3,0,0,0,3,2,0,1,0,0,0,0,0,2,0,3,0,3,0,0,3,3,44,3 +1,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,3,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,17,5 +2,1,0,2,2,0,0,0,0,0,0,0,0,0,0,2,1,1,1,0,0,0,0,0,0,0,0,2,0,0,0,1,0,16,4 +1,1,2,2,2,0,2,0,1,2,0,0,0,1,0,0,2,1,2,3,3,3,2,2,0,0,0,0,0,0,0,2,0,55,1 +2,2,2,3,2,0,0,0,1,1,0,0,0,1,0,0,1,1,1,1,1,1,1,1,0,2,0,0,0,0,0,3,0,40,1 +3,2,2,1,3,3,0,3,0,0,0,3,0,0,0,3,2,0,3,0,0,0,0,0,2,0,3,3,3,0,0,2,2,34,3 +2,2,1,0,0,0,0,0,0,0,0,0,0,0,2,0,3,0,0,0,2,0,0,0,0,0,0,0,0,0,0,3,0,29,5 +3,2,2,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,34,5 +1,1,1,1,1,0,1,0,2,3,0,0,0,1,0,0,2,2,1,2,2,2,2,2,0,0,0,0,0,0,0,3,0,25,1 +2,2,0,2,1,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,3,0,0,0,3,0,70,4 +3,3,2,1,0,0,0,0,0,0,0,0,2,0,0,2,3,0,2,0,2,0,0,0,0,0,0,2,0,0,0,1,0,37,2 +2,3,2,3,3,3,0,2,0,0,0,3,0,0,0,3,2,0,3,0,0,0,0,0,3,0,2,2,2,0,0,2,2,41,3 +3,3,3,3,2,0,0,0,0,0,0,0,0,1,0,0,2,1,1,1,2,1,1,2,0,0,0,0,0,0,0,2,0,32,1 +2,2,1,2,2,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,20,2 +2,3,1,2,1,0,0,0,0,0,0,0,0,2,0,0,1,0,0,2,1,2,2,0,0,0,0,0,0,0,0,2,0,19,1 +3,2,2,3,2,0,0,0,0,2,0,0,0,2,0,2,2,1,2,3,3,3,3,1,0,0,0,0,0,0,0,3,0,61,1 +2,1,1,3,2,2,0,2,0,0,0,0,0,0,2,3,0,2,0,0,0,0,0,3,0,2,0,2,2,0,0,3,2,27,3 +1,1,2,3,2,3,0,3,0,0,0,2,0,0,0,2,2,0,2,0,0,0,0,0,2,0,3,2,3,0,0,2,3,36,3 +2,2,3,3,1,2,0,2,0,0,0,1,0,0,0,3,3,0,2,0,0,0,0,0,3,0,2,1,2,0,0,2,3,40,3 +3,2,0,3,0,0,0,0,0,0,0,0,1,1,0,3,2,0,1,0,0,0,0,0,0,0,0,3,0,0,0,2,0,52,2 +1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,0,3,0,1,0,2,0,0,0,0,0,0,0,0,0,0,1,0,27,5 +2,2,2,0,2,0,0,0,0,0,0,0,0,0,0,2,2,0,2,0,0,0,0,0,0,0,0,2,0,0,0,1,0,30,4 +2,3,0,2,0,0,0,0,0,0,0,0,0,0,0,3,2,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,45,2 +1,2,0,3,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,34,2 +2,3,2,1,0,0,0,0,1,2,1,0,0,1,0,2,1,0,1,2,2,1,1,0,0,0,0,0,0,0,0,2,0,27,1 +3,3,2,2,0,0,0,0,2,0,0,0,0,1,0,2,1,0,2,1,1,1,1,0,0,0,0,0,0,0,0,2,0,46,1 +2,2,2,0,0,0,0,0,1,0,0,0,0,2,0,1,3,0,1,2,2,1,0,0,0,0,0,0,0,0,0,1,0,52,1 +1,0,1,2,0,0,0,0,0,0,0,0,0,0,3,0,3,1,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,28,5 +2,1,1,1,0,2,0,2,0,0,0,2,0,0,0,2,2,0,2,0,0,0,0,0,1,0,2,2,2,0,0,3,3,40,3 +2,3,0,2,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,55,2 +3,3,2,2,0,3,0,2,0,0,0,2,0,0,0,2,2,0,2,0,0,0,0,0,2,0,2,3,3,0,0,2,3,32,3 +2,2,1,2,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,33,2 +3,2,2,1,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,47,2 +2,1,2,0,2,0,0,0,0,0,0,0,0,0,0,2,2,0,1,0,0,0,0,0,0,0,0,2,0,0,0,1,0,35,4 +2,1,1,2,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,61,2 +3,2,2,2,0,2,0,2,0,0,0,2,0,0,0,2,2,0,2,0,0,0,0,0,2,0,1,1,1,0,0,2,2,22,3 +2,2,0,0,0,0,2,0,1,1,1,0,0,0,0,2,2,0,1,0,0,0,0,0,0,0,0,1,0,1,2,1,0,10,6 +3,2,0,2,0,0,0,0,0,0,0,0,0,1,0,2,2,0,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,20,2 +3,2,2,3,1,0,0,0,1,1,1,0,0,2,0,0,2,0,2,2,3,2,1,1,0,0,0,0,0,0,0,1,0,55,1 +2,3,2,2,1,0,0,0,2,2,0,0,0,2,0,0,2,0,3,3,3,2,2,2,0,0,0,0,0,0,0,2,0,67,1 +2,2,3,3,1,2,0,2,0,0,0,2,0,0,0,3,2,0,2,0,0,0,0,0,2,0,2,0,0,0,0,2,3,51,3 +2,2,2,0,2,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,20,4 +2,2,3,3,1,3,0,2,0,0,0,3,0,0,0,2,3,0,2,0,0,0,0,0,2,0,3,2,2,0,0,3,3,22,3 +1,1,2,3,1,2,0,2,0,0,0,1,0,0,0,1,3,0,1,0,0,0,0,0,1,0,2,2,3,0,0,2,3,45,3 +2,3,2,0,0,0,0,0,2,2,0,0,0,2,0,0,2,0,2,3,2,1,3,0,0,2,0,0,0,0,0,2,0,55,1 +3,2,3,0,0,0,0,0,3,0,0,0,0,3,0,0,1,0,1,2,2,0,2,0,0,3,0,0,0,0,0,1,0,56,1 +3,3,3,0,0,0,0,0,2,0,0,0,0,2,0,0,2,0,2,2,3,0,3,0,0,2,0,0,0,0,0,2,0,18,1 +3,2,2,2,0,2,0,2,0,0,0,2,0,0,0,2,3,0,3,0,0,0,0,0,2,0,2,3,2,0,0,2,3,40,3 +2,2,2,0,0,0,0,0,3,2,0,0,0,2,0,0,2,0,2,2,3,2,3,0,0,2,0,0,0,0,0,3,0,30,1 +3,2,3,0,0,0,0,0,2,2,0,0,0,2,0,0,3,0,2,2,2,3,3,0,0,2,0,0,0,0,0,2,0,33,1 +2,2,0,3,0,0,0,0,0,0,0,0,0,2,0,3,3,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,40,2 +1,2,2,2,0,3,0,2,0,0,0,2,0,0,0,3,2,0,2,0,0,0,0,0,3,0,2,2,2,0,0,2,2,42,3 +2,2,2,2,0,2,0,3,0,0,0,3,0,0,0,3,3,0,3,0,0,0,0,0,3,0,3,3,3,0,0,2,2,36,3 +2,3,2,0,0,0,0,0,2,0,0,0,0,3,0,0,3,0,2,2,2,0,2,0,0,0,0,0,0,0,0,2,0,27,1 +3,2,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,1,0,2,2,0,0,0,0,0,0,0,0,0,2,0,56,1 +1,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,2,0,3,3,0,0,0,0,0,0,0,0,0,3,0,60,1 +2,2,2,0,0,0,0,0,0,0,0,0,0,3,0,0,3,0,3,0,3,3,0,0,0,0,0,0,0,0,0,2,0,20,1 +2,2,1,0,0,0,3,0,2,0,1,0,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,3,3,2,0,7,6 +2,2,0,2,0,0,0,0,0,0,0,0,0,1,0,3,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,30,2 +3,2,0,3,0,0,0,0,0,0,0,0,0,2,0,2,2,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,19,2 +2,3,0,2,0,0,0,0,0,0,0,0,0,2,0,3,3,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,52,2 +3,2,0,2,0,0,0,0,0,0,1,0,0,2,0,2,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,55,2 +2,2,2,0,0,0,0,0,3,0,0,0,0,2,0,0,2,0,2,2,2,0,2,0,0,2,0,0,0,0,0,2,0,23,1 +2,1,2,3,1,2,0,2,0,0,0,2,0,0,0,1,3,0,2,0,0,0,0,0,2,0,2,0,3,0,0,3,2,50,3 +2,3,3,3,0,3,0,3,0,0,0,2,0,0,0,2,1,0,2,0,0,0,0,0,2,0,2,0,3,0,0,2,2,38,3 +3,2,2,2,0,2,0,0,0,0,0,2,0,0,0,3,2,0,3,0,0,0,0,0,2,0,3,0,2,0,0,3,3,25,3 +2,2,2,0,0,0,0,0,2,2,1,0,0,2,0,0,2,0,3,3,2,2,2,1,0,2,0,0,0,0,0,2,0,18,1 +3,2,2,0,0,0,0,0,3,3,1,0,0,3,0,0,3,0,2,3,2,3,2,0,0,3,0,0,0,0,0,2,0,35,1 +2,2,1,2,0,0,0,0,0,0,0,0,1,1,0,2,2,0,1,0,0,0,1,0,0,0,0,3,0,0,0,2,0,22,2 +3,2,3,3,1,2,0,2,0,0,0,3,0,0,0,2,2,0,2,0,0,0,0,0,1,0,2,0,2,0,0,2,3,52,3 +3,2,2,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,2,0,0,0,1,0,0,0,0,2,0,0,0,2,0,50,2 +2,2,2,0,0,0,0,0,0,0,0,0,1,2,0,2,0,0,1,0,0,0,0,0,0,0,0,2,0,0,0,1,0,33,2 +3,2,1,0,0,0,0,0,0,0,0,0,1,1,0,2,0,0,2,0,0,0,0,0,0,0,0,2,0,0,0,1,0,44,2 +1,1,0,2,0,0,1,0,0,0,0,0,0,0,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,18,5 +1,1,0,1,0,0,2,0,0,0,0,0,0,0,1,2,1,2,0,0,2,0,0,0,0,0,0,0,0,0,0,2,0,25,5 +2,2,0,2,0,0,1,0,0,0,0,0,0,0,2,1,2,1,0,0,2,0,0,0,0,0,0,0,0,0,0,3,0,52,5 +1,1,0,1,0,0,2,0,0,0,0,0,0,0,2,2,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,35,5 +2,2,0,2,0,0,1,0,0,0,0,0,0,0,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,40,5 +3,2,2,0,0,0,0,0,2,2,1,0,0,2,0,0,3,2,1,2,2,2,1,1,0,0,0,0,0,0,0,2,0,55,1 +2,3,2,0,1,0,0,0,2,3,0,0,0,2,0,0,2,3,1,2,2,2,1,1,0,0,0,0,0,0,0,1,0,20,1 +3,2,2,0,2,0,0,0,3,2,0,0,0,3,0,0,3,2,2,2,2,2,1,0,0,0,0,0,0,0,0,2,0,60,1 +2,3,2,0,0,0,0,0,2,3,0,0,0,2,0,0,2,2,2,2,2,3,2,1,0,0,0,0,0,0,0,2,0,33,1 +2,3,2,0,0,0,0,0,3,2,0,0,0,2,0,0,3,2,3,2,2,3,2,1,0,0,0,0,0,0,0,2,0,27,1 +3,2,2,0,0,0,0,0,2,2,0,0,0,2,0,0,3,1,2,3,3,2,3,0,0,0,0,0,0,0,0,2,0,50,1 +2,3,2,0,0,0,0,0,3,2,0,0,0,2,0,0,2,1,2,3,3,2,2,0,0,0,0,0,0,0,0,1,0,70,1 +2,2,2,3,1,2,0,2,0,0,0,2,0,0,0,2,2,0,1,0,0,0,0,0,2,2,2,1,3,0,0,2,3,28,3 +2,2,2,2,1,3,0,2,0,0,0,2,0,0,0,3,2,0,0,0,0,0,0,0,3,2,2,2,2,0,0,3,3,30,3 +3,2,3,2,2,2,0,2,0,0,0,3,0,0,0,2,3,0,1,0,0,0,0,0,2,1,2,2,1,0,0,2,3,53,3 +2,3,2,3,3,2,0,2,0,0,0,2,0,0,0,3,2,0,0,0,0,0,0,0,3,2,2,1,2,0,0,2,2,27,3 +2,2,3,2,2,2,0,3,0,0,0,3,0,0,0,2,3,0,0,0,0,0,0,0,2,2,3,2,2,0,0,2,3,50,3 +3,2,2,3,3,3,0,2,0,0,0,2,0,0,0,2,3,0,0,0,0,0,0,0,2,2,2,2,2,0,0,2,2,42,3 +3,2,1,0,2,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,45,4 +2,2,1,0,1,0,0,0,0,0,0,0,0,0,0,3,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,35,4 +3,1,1,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,30,4 +2,2,2,1,2,0,0,0,0,0,0,0,0,0,0,3,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,42,4 +1,1,1,3,0,0,0,0,0,0,0,0,0,0,2,1,3,0,1,0,2,0,0,0,0,0,0,0,0,0,0,2,0,18,5 +2,1,2,2,0,0,0,0,0,0,0,0,0,0,3,0,3,0,2,0,2,0,0,0,0,0,0,2,0,0,0,1,0,25,5 +2,1,3,3,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,0,0,0,0,0,1,0,0,0,1,0,36,5 +2,1,2,2,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,40,5 +1,2,1,1,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,0,2,0,35,5 +1,1,1,2,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,0,2,0,19,5 +2,1,2,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,0,50,5 +2,2,0,2,0,0,0,0,0,0,0,0,1,1,0,2,2,0,2,0,0,0,0,0,0,0,0,3,0,0,0,2,0,47,2 +3,2,0,1,0,0,0,0,0,1,0,0,2,2,0,3,2,0,2,0,0,0,0,0,0,0,0,2,0,0,0,3,0,30,2 +2,3,0,3,0,0,0,0,0,2,0,0,2,2,0,2,3,0,3,0,0,0,0,0,0,0,0,2,0,0,0,2,0,42,2 +3,2,0,2,0,0,0,0,0,2,0,0,2,2,0,2,2,0,2,0,0,0,0,0,0,0,0,1,0,0,0,2,0,55,2 +2,2,2,1,1,0,0,0,2,0,1,0,0,2,0,1,2,1,2,2,2,2,1,1,0,1,0,0,0,0,0,2,0,60,1 +3,2,3,0,1,0,0,0,1,2,0,0,0,2,0,2,1,2,1,1,1,1,1,1,0,2,0,0,0,0,0,2,0,65,1 +2,2,2,1,0,0,0,0,0,1,1,0,0,1,0,2,1,2,2,2,1,2,0,0,0,1,0,0,0,0,0,2,0,47,1 +3,2,3,2,0,0,0,0,0,2,1,0,0,0,0,2,1,3,2,2,2,2,0,0,0,3,0,0,0,0,0,3,0,35,1 +2,2,1,1,0,0,0,0,0,2,1,0,0,0,0,2,2,2,2,1,2,2,0,0,0,2,0,0,0,0,0,2,0,52,1 +2,2,2,2,0,0,0,0,0,1,0,0,0,0,0,2,2,3,2,2,1,1,0,0,0,2,0,0,0,0,0,1,0,60,1 +2,2,2,1,0,0,2,0,2,2,1,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,2,2,2,0,7,6 +3,2,0,0,0,0,2,0,2,2,0,0,0,0,0,2,1,0,2,0,0,0,0,0,0,0,0,1,0,2,3,3,0,8,6 +2,2,2,3,0,0,0,0,2,2,1,0,0,1,0,0,2,1,2,3,3,3,0,1,0,2,0,0,0,0,0,1,0,25,1 +3,2,2,3,0,0,0,0,2,0,0,0,0,2,0,0,2,2,2,2,2,2,0,2,0,2,0,0,0,0,0,1,0,60,1 +2,2,2,2,0,0,0,0,2,2,1,0,0,1,0,0,3,0,3,2,2,2,0,2,0,2,0,0,0,0,0,2,0,50,1 +2,1,2,0,0,0,0,0,3,2,1,0,0,2,0,0,2,0,2,3,2,2,0,2,0,3,0,0,0,0,0,2,0,33,1 +3,3,3,0,0,0,0,0,2,3,0,0,0,1,0,0,3,0,3,3,3,3,0,1,0,3,0,0,0,0,0,3,0,27,1 +2,2,2,0,0,0,0,0,2,3,0,0,0,2,0,0,2,0,2,3,2,2,0,2,0,2,0,0,0,0,0,2,0,55,1 +2,2,2,0,0,0,0,0,2,2,0,0,0,2,0,0,2,0,2,2,2,2,0,2,0,2,0,0,0,0,0,2,0,62,1 +3,2,2,0,0,0,0,0,0,1,1,0,0,2,0,0,2,0,1,1,2,2,1,0,0,2,0,0,0,0,0,2,0,19,1 +2,1,1,2,2,2,0,2,0,0,0,2,1,0,0,3,2,1,1,0,0,0,0,0,2,0,2,2,3,0,0,2,3,50,3 +2,2,2,2,3,3,0,2,0,0,0,2,0,0,0,2,3,1,1,0,0,0,0,0,2,0,2,3,2,0,0,3,2,40,3 +2,2,2,2,1,2,0,2,0,0,0,2,1,0,0,3,2,1,1,0,0,0,0,0,2,0,2,2,3,0,0,2,3,62,3 +2,2,2,2,1,2,0,2,0,0,0,3,1,0,0,2,2,1,1,0,0,0,0,0,2,0,2,3,2,0,0,2,3,36,3 +2,1,2,2,0,3,0,2,0,0,0,2,1,0,0,3,2,1,1,0,0,0,0,0,2,0,2,3,2,0,0,3,2,27,3 +3,1,2,3,0,3,0,0,0,1,0,2,1,0,0,2,3,1,2,0,0,0,0,0,1,0,3,2,3,0,0,2,2,47,3 +2,1,2,2,0,2,0,0,0,1,0,1,1,0,0,2,3,1,2,0,0,0,0,0,2,0,2,2,2,0,0,2,2,50,3 +2,1,1,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,35,4 +3,2,1,1,0,0,0,0,0,0,0,0,1,0,0,3,2,1,1,0,0,0,0,0,0,1,0,1,0,0,0,2,0,25,4 +1,2,2,0,1,0,0,0,0,0,0,0,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,60,4 +2,2,2,0,1,0,0,0,0,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,22,4 +1,2,2,0,1,0,0,0,0,0,0,0,0,0,0,3,2,2,1,0,0,0,0,0,0,1,0,2,0,0,0,2,0,35,4 +2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,1,0,0,0,2,0,36,4 +2,1,0,2,0,0,0,0,0,0,0,0,0,0,2,1,3,2,2,1,3,0,0,0,0,0,0,2,0,0,0,3,0,?,5 +1,1,1,3,0,0,0,0,0,0,0,0,0,0,3,2,3,1,2,2,2,0,0,0,0,0,0,3,0,0,0,2,0,?,5 +1,1,0,2,0,0,0,0,1,0,0,0,0,0,3,2,3,2,1,1,3,0,0,0,0,0,0,2,0,0,0,3,0,?,5 +1,1,0,3,0,0,0,0,0,0,0,0,0,0,2,1,3,1,1,0,2,0,1,0,0,0,0,2,0,0,0,3,0,?,5 +2,2,1,1,0,0,2,0,2,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,2,0,1,2,2,0,10,6 +3,2,0,1,0,0,2,0,1,0,1,0,0,0,0,1,2,1,2,0,0,0,0,0,0,0,0,3,0,1,2,2,0,12,6 +2,2,1,1,0,0,2,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,2,0,1,2,2,0,8,6 +3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,3,2,1,0,0,0,0,0,0,0,1,0,2,0,0,0,2,0,35,4 +2,2,1,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,1,0,3,0,0,0,2,0,62,4 +2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,3,1,0,0,0,0,0,0,0,0,1,0,2,0,0,0,3,0,48,4 +3,3,2,0,1,0,0,0,2,2,1,0,0,0,0,0,2,1,3,3,3,2,1,0,0,1,0,0,0,0,0,2,0,30,1 +2,2,3,1,0,0,0,0,3,2,1,0,0,0,0,1,2,0,3,3,3,2,1,1,0,2,0,0,0,0,0,3,0,57,1 +1,2,2,1,1,0,0,0,2,2,1,0,0,1,0,0,2,0,2,3,3,3,2,1,0,2,0,0,0,0,0,2,0,62,1 +2,2,3,1,0,0,0,0,1,2,0,0,0,1,0,0,2,0,2,3,3,2,1,1,0,2,0,0,0,0,0,2,0,36,1 +3,2,2,2,0,0,0,0,2,1,0,0,0,1,0,0,2,0,3,2,3,2,2,1,0,2,0,0,0,0,0,3,0,18,1 +2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,3,0,0,0,2,0,25,2 +3,2,2,1,0,0,0,0,1,0,1,0,0,1,0,3,2,0,1,0,0,0,0,0,0,0,0,3,0,0,0,3,0,16,2 +2,2,1,0,1,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,50,4 +1,2,2,0,1,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,1,0,2,0,0,0,1,0,55,4 +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,27,4 +3,3,2,0,0,0,0,0,2,2,0,0,0,0,0,0,2,1,2,2,3,2,1,0,0,1,0,0,0,0,0,2,0,55,1 +2,3,3,1,0,0,0,0,2,1,0,0,0,0,0,0,3,0,2,2,2,3,0,1,0,2,0,0,0,0,0,2,0,22,1 +2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,2,2,1,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,70,2 +3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,1,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,22,2 +2,3,2,1,0,0,0,0,0,0,0,0,0,0,0,3,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,45,2 +2,1,2,1,0,2,0,2,0,0,0,2,0,0,0,2,2,0,1,0,0,0,0,0,2,0,2,0,2,0,0,3,3,40,3 +2,2,3,1,0,3,0,2,0,0,0,3,0,0,0,3,3,0,0,0,0,0,0,0,1,0,3,2,3,0,0,3,3,28,3 +3,2,2,1,0,2,0,3,0,0,0,2,0,0,0,2,2,1,1,0,0,0,0,0,2,0,3,1,2,0,0,3,3,36,3 +2,2,3,2,1,2,0,2,0,0,0,2,0,0,0,2,3,0,0,0,0,0,0,0,2,0,2,2,2,0,0,3,3,27,3 +2,2,2,0,1,0,0,0,1,1,0,0,0,0,0,0,2,1,2,3,3,2,0,2,0,1,0,0,0,0,0,2,0,42,1 +2,3,2,0,1,0,0,0,3,2,1,0,0,1,0,0,3,0,2,2,3,3,0,0,0,2,0,0,0,0,0,2,0,27,1 +2,2,3,1,0,0,0,0,2,2,0,0,0,0,0,0,3,1,3,3,2,2,2,1,0,3,0,0,0,0,0,2,0,50,1 +2,1,3,0,1,0,0,0,0,2,0,0,0,0,0,0,3,0,2,2,3,3,0,0,0,2,0,0,0,0,0,2,0,34,1 +2,1,0,2,0,0,0,0,0,0,0,0,0,0,3,1,2,1,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,8,5 +2,1,1,3,0,0,1,0,0,0,0,0,0,0,2,0,2,0,0,0,3,0,0,0,0,0,0,0,0,0,0,2,0,19,5 +1,1,2,2,0,0,0,0,1,0,0,0,1,0,3,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,36,5 +2,1,0,3,0,0,0,0,0,0,0,0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,70,5 +2,2,1,3,0,0,0,0,0,0,0,0,0,0,3,0,2,1,0,0,3,0,0,0,0,0,0,0,0,0,0,2,0,52,5 +2,2,3,3,1,2,0,1,0,0,0,2,0,0,0,2,2,0,1,0,0,0,0,0,1,0,2,0,2,0,0,2,3,25,3 +3,2,2,2,0,2,0,2,0,0,0,3,0,0,0,3,2,0,1,0,0,0,0,0,1,0,2,0,3,0,0,3,3,36,3 +2,2,2,3,1,2,0,1,0,0,0,2,0,0,0,2,2,0,1,0,0,0,0,0,1,0,2,0,3,0,0,1,2,50,3 +2,1,2,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,0,34,4 +3,1,2,1,0,0,0,0,2,3,0,0,0,0,0,0,2,0,2,3,2,2,0,3,0,2,0,0,0,0,0,2,0,17,1 +2,2,2,0,1,0,0,0,2,1,0,0,0,0,0,0,3,1,1,3,2,2,0,2,0,0,0,0,0,0,0,2,0,24,1 +2,1,1,0,1,0,0,0,0,0,0,0,0,0,0,3,1,0,0,0,0,0,0,0,0,1,0,3,0,0,0,2,0,22,4 +2,1,2,1,1,0,0,0,0,0,0,0,0,0,0,2,2,0,1,0,0,0,0,0,0,1,0,3,0,0,0,2,0,55,4 +2,1,1,0,1,0,0,0,0,0,0,0,0,0,0,3,2,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,12,4 +2,3,2,0,1,0,0,0,0,1,0,0,0,0,0,0,2,0,2,3,3,2,0,2,0,2,0,0,0,0,0,2,0,43,1 +3,2,2,0,0,0,0,0,0,1,1,0,0,0,0,0,3,0,2,2,3,2,0,1,0,2,0,0,0,0,0,2,0,50,1 +2,2,2,1,0,0,0,0,2,2,0,0,0,0,0,0,2,0,2,2,3,2,0,0,0,2,0,0,0,0,0,2,0,36,1 +2,2,3,3,2,3,0,1,0,0,0,2,0,0,0,3,2,0,1,0,0,0,0,0,2,0,3,0,3,0,0,2,3,26,3 +3,1,2,3,2,2,0,2,0,0,0,2,0,0,0,2,2,0,1,0,0,0,0,0,2,0,2,0,2,0,0,3,3,16,3 +2,2,2,3,2,3,0,2,0,0,0,2,0,0,0,2,2,0,0,0,0,0,0,0,3,0,2,0,2,0,0,2,3,32,3 +2,1,2,3,3,2,0,2,0,0,0,3,0,0,0,3,1,0,0,0,0,0,0,0,2,0,3,0,2,0,0,2,3,51,3 +2,2,3,2,2,3,0,1,0,0,0,2,0,0,0,3,3,0,1,0,0,0,0,0,2,0,3,0,3,0,0,3,2,56,3 +2,2,2,0,1,0,0,0,2,2,0,0,0,0,0,0,2,1,2,3,2,3,1,2,0,2,0,0,0,0,0,2,0,47,1 +2,2,3,1,0,0,0,0,2,1,0,0,0,0,0,0,2,2,3,3,3,2,0,1,0,2,0,0,0,0,0,2,0,51,1 +3,2,2,0,0,0,0,0,2,2,0,0,0,0,0,0,3,0,3,2,3,3,0,2,0,3,0,0,0,0,0,3,0,58,1 +2,2,3,0,0,0,0,0,3,0,0,0,0,0,0,0,3,2,2,2,3,2,0,0,0,1,0,0,0,0,0,2,0,27,1 +2,2,2,0,1,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,1,0,2,0,0,0,2,0,32,4 +2,1,1,0,1,0,0,0,0,0,0,0,1,0,0,3,2,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,27,4 +2,3,3,0,0,0,0,0,1,0,1,0,0,1,0,0,2,2,2,2,2,2,2,2,0,1,0,0,0,0,0,2,0,62,1 +2,2,3,0,1,0,0,0,3,0,0,0,0,2,0,0,1,1,2,2,2,3,0,2,0,1,0,0,0,0,0,2,0,53,1 +3,1,1,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,46,4 +2,1,2,3,2,2,0,3,0,0,0,2,1,0,0,2,2,0,1,0,0,0,0,0,2,0,2,1,2,0,0,2,3,37,3 +1,1,2,3,2,3,0,2,0,0,0,2,0,0,0,2,1,0,2,0,0,0,0,0,2,0,2,0,2,0,0,2,3,49,3 +2,1,0,1,0,0,0,0,0,0,0,0,0,1,0,2,1,0,1,0,0,0,0,0,0,1,0,3,0,0,0,2,0,18,4 +2,2,2,2,2,0,0,0,0,2,0,0,0,0,0,0,2,0,2,2,3,3,2,2,0,2,0,0,0,0,0,2,0,46,1 +2,1,2,0,0,0,0,0,2,0,0,0,0,1,0,0,2,1,2,3,2,3,0,0,0,3,0,0,0,0,0,0,0,33,1 +1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,22,4 +2,2,2,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,44,4 +1,0,0,3,0,0,0,0,0,0,0,0,1,0,3,2,3,0,0,0,2,0,0,0,0,0,0,0,0,0,0,3,0,36,5 +2,0,1,3,0,0,0,0,0,0,0,0,0,0,2,2,3,0,1,0,3,0,0,0,0,0,0,0,0,0,0,3,0,63,5 +3,2,2,0,0,0,0,0,2,2,0,0,0,0,0,0,3,0,3,2,3,2,0,1,0,2,0,0,0,0,0,1,0,56,1 +2,3,2,1,0,0,0,0,2,2,0,0,0,0,0,0,2,0,2,2,3,2,1,0,0,2,0,0,0,0,0,2,0,60,1 +2,1,0,0,0,0,0,0,0,0,0,0,1,0,2,2,3,0,0,0,2,0,0,0,0,0,0,1,0,0,0,2,0,42,5 +3,1,0,1,0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,2,0,32,5 +2,1,2,2,2,3,0,2,0,0,0,2,1,0,0,3,2,0,0,0,0,0,0,0,3,0,2,0,2,0,0,2,3,51,3 +2,2,3,0,0,0,0,0,2,2,0,0,0,1,0,0,2,0,2,3,2,3,0,2,0,2,0,0,0,0,0,2,0,33,1 +1,1,0,2,0,0,0,0,0,0,0,0,0,0,3,1,2,0,1,0,3,0,0,0,0,0,0,0,0,0,0,2,0,68,5 +2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,2,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,2,0,50,5 +2,2,2,0,0,0,1,0,1,0,1,0,0,0,0,2,2,1,0,0,0,0,0,0,0,0,0,1,0,3,2,2,0,9,6 +2,2,1,0,0,0,2,0,2,0,0,0,0,0,0,3,2,0,1,0,0,0,0,0,0,0,0,2,0,2,3,1,0,16,6 +2,2,2,1,1,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,35,4 +2,2,2,1,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,1,0,2,0,0,0,2,0,40,4 +2,2,0,1,0,0,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,1,0,2,2,2,0,22,6 +3,2,2,0,0,0,3,0,1,0,1,0,0,0,0,1,3,1,1,0,0,0,0,0,0,0,0,2,0,3,2,2,0,10,6 +2,2,1,0,0,0,2,0,2,0,0,0,0,0,0,3,2,0,1,0,0,0,0,0,0,0,0,3,0,2,2,2,0,7,6 +1,2,2,2,0,0,0,0,2,2,0,0,0,1,0,0,2,1,3,3,3,2,0,2,0,2,0,0,0,0,0,2,0,25,1 +2,2,2,3,2,0,0,0,2,3,1,0,0,1,0,0,2,2,2,2,2,2,0,2,0,3,0,0,0,0,0,2,0,9,1 +3,2,2,3,2,0,0,0,2,3,0,0,0,0,0,0,3,0,2,2,3,2,0,3,0,2,0,0,0,0,0,1,0,55,1 +1,1,1,2,0,0,0,0,0,0,0,0,0,0,3,2,2,0,0,0,2,0,0,0,0,0,0,1,0,0,0,2,0,45,5 +2,0,1,2,0,0,0,0,0,0,0,0,0,0,3,1,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,2,0,56,5 +2,3,2,3,2,0,0,0,3,2,0,0,0,1,0,0,3,2,3,2,2,2,0,3,0,3,0,0,0,0,0,0,0,36,1 +2,2,2,2,2,0,0,0,3,0,1,0,0,0,0,0,2,2,2,2,3,3,0,2,0,3,0,0,0,0,0,0,0,75,1 +2,2,2,0,1,0,0,0,0,1,0,0,0,1,0,0,2,0,2,3,2,3,2,1,0,1,0,0,0,0,0,2,0,45,1 +2,3,2,1,0,0,0,0,2,2,0,0,0,1,0,0,2,0,2,2,2,2,0,2,0,2,0,0,0,0,0,3,0,24,1 +2,2,0,0,0,0,0,0,0,0,0,0,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,40,2 +2,2,1,1,0,0,0,0,0,0,0,0,1,1,0,2,2,1,0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,25,2 +2,1,1,0,1,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,25,4 +3,2,1,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,36,4 +3,2,2,2,3,2,0,2,0,0,0,2,2,0,0,3,3,0,0,0,0,0,0,0,3,0,3,0,3,0,0,2,3,28,3 +2,1,3,1,2,3,0,2,0,0,0,2,0,0,0,3,2,0,0,0,0,0,0,0,3,0,2,0,1,0,0,2,3,50,3 +3,2,2,0,0,0,0,0,3,3,0,0,0,1,0,0,2,0,2,3,2,3,0,2,0,2,0,0,0,0,0,3,0,35,1 diff --git a/jvm-packages/xgboost4j-spark/src/test/scala/ml/dmlc/xgboost4j/scala/spark/XGBoostDFSuite.scala b/jvm-packages/xgboost4j-spark/src/test/scala/ml/dmlc/xgboost4j/scala/spark/XGBoostDFSuite.scala index 918b0c511..1734123e3 100644 --- a/jvm-packages/xgboost4j-spark/src/test/scala/ml/dmlc/xgboost4j/scala/spark/XGBoostDFSuite.scala +++ b/jvm-packages/xgboost4j-spark/src/test/scala/ml/dmlc/xgboost4j/scala/spark/XGBoostDFSuite.scala @@ -16,6 +16,11 @@ package ml.dmlc.xgboost4j.scala.spark +import java.io.File + +import scala.collection.mutable.ListBuffer +import scala.io.Source + import ml.dmlc.xgboost4j.java.{DMatrix => JDMatrix} import ml.dmlc.xgboost4j.scala.{DMatrix, XGBoost => ScalaXGBoost} @@ -60,7 +65,7 @@ class XGBoostDFSuite extends SharedSparkContext with Utils { } val trainingDF = buildTrainingDataframe() val xgBoostModelWithDF = XGBoost.trainWithDataFrame(trainingDF, paramMap, - round = round, nWorkers = numWorkers, useExternalMemory = false) + round = round, nWorkers = numWorkers) val testDF = trainingDF.sparkSession.createDataFrame(testSetItr.toList).toDF( "id", "features", "label") val predResultsFromDF = xgBoostModelWithDF.setExternalMemory(true).transform(testDF). @@ -83,7 +88,7 @@ class XGBoostDFSuite extends SharedSparkContext with Utils { val testItr = loadLabelPoints(getClass.getResource("/agaricus.txt.test").getFile).iterator val trainingDF = buildTrainingDataframe() val xgBoostModelWithDF = XGBoost.trainWithDataFrame(trainingDF, paramMap, - round = 5, nWorkers = numWorkers, useExternalMemory = false) + round = 5, nWorkers = numWorkers) val testSetItr = testItr.zipWithIndex.map { case (instance: LabeledPoint, id: Int) => (id, instance.features, instance.label) @@ -184,4 +189,38 @@ class XGBoostDFSuite extends SharedSparkContext with Utils { val xgbEstimatorCopy1 = xgbEstimator.copy(sparkParamMap.put(xgbEstimator.evalMetric, "logloss")) assert(xgbEstimatorCopy1.fromParamsToXGBParamMap("eval_metric") === "logloss") } + + private def convertCSVPointToLabelPoint(valueArray: Array[String]): LabeledPoint = { + val intValueArray = new Array[Double](valueArray.length) + intValueArray(valueArray.length - 2) = { + if (valueArray(valueArray.length - 2) == "?") { + 1 + } else { + 0 + } + } + intValueArray(valueArray.length - 1) = valueArray(valueArray.length - 1).toDouble - 1 + for (i <- 0 until intValueArray.length - 2) { + intValueArray(i) = valueArray(i).toDouble + } + LabeledPoint(intValueArray.last, new DenseVector(intValueArray.take(intValueArray.length - 1))) + } + + private def loadCSVPoints(filePath: String, zeroBased: Boolean = false): List[LabeledPoint] = { + val file = Source.fromFile(new File(filePath)) + val sampleList = new ListBuffer[LabeledPoint] + for (sample <- file.getLines()) { + sampleList += convertCSVPointToLabelPoint(sample.split(",")) + } + sampleList.toList + } + + test("multi_class classification test") { + val paramMap = Map("eta" -> "0.1", "max_depth" -> "6", "silent" -> "1", + "objective" -> "multi:softmax", "num_class" -> "6") + val testItr = loadCSVPoints(getClass.getResource("/dermatology.data").getFile).iterator + val trainingDF = buildTrainingDataframe() + XGBoost.trainWithDataFrame(trainingDF, paramMap, + round = 5, nWorkers = numWorkers) + } }