[jvm-packages] Avoid loosing precision when computing probabilities by converting to Double early (#3576)

This commit is contained in:
Matthew Tovbin 2018-08-13 14:05:07 -07:00 committed by Nan Zhu
parent ce0f0568a6
commit 2b7a1c5780

View File

@ -411,20 +411,15 @@ class XGBoostClassificationModel private[ml](
} }
val probabilityUDF = udf { probability: mutable.WrappedArray[Float] => val probabilityUDF = udf { probability: mutable.WrappedArray[Float] =>
if (numClasses == 2) { val prob = probability.map(_.toDouble).toArray
Vectors.dense(Array(1 - probability(0), probability(0)).map(_.toDouble)) val probabilities = if (numClasses == 2) Array(1.0 - prob(0), prob(0)) else prob
} else { Vectors.dense(probabilities)
Vectors.dense(probability.map(_.toDouble).toArray)
}
} }
val predictUDF = udf { probability: mutable.WrappedArray[Float] => val predictUDF = udf { probability: mutable.WrappedArray[Float] =>
// From XGBoost probability to MLlib prediction // From XGBoost probability to MLlib prediction
val probabilities = if (numClasses == 2) { val prob = probability.map(_.toDouble).toArray
Array(1 - probability(0), probability(0)).map(_.toDouble) val probabilities = if (numClasses == 2) Array(1.0 - prob(0), prob(0)) else prob
} else {
probability.map(_.toDouble).toArray
}
probability2prediction(Vectors.dense(probabilities)) probability2prediction(Vectors.dense(probabilities))
} }