Github user MechCoder commented on a diff in the pull request:

    https://github.com/apache/spark/pull/4906#discussion_r26551383
  
    --- Diff: 
mllib/src/main/scala/org/apache/spark/mllib/tree/model/treeEnsembleModels.scala 
---
    @@ -108,6 +110,58 @@ class GradientBoostedTreesModel(
       }
     
       override protected def formatVersion: String = 
TreeEnsembleModel.SaveLoadV1_0.thisFormatVersion
    +
    +  /**
    +   * Method to compute error or loss for every iteration of gradient 
boosting.
    +   * @param data RDD of [[org.apache.spark.mllib.regression.LabeledPoint]]
    +   * @param loss evaluation metric.
    +   * @return an array with index i having the losses or errors for the 
ensemble
    +   *         containing trees 1 to i + 1
    +   */
    +  def evaluateEachIteration(
    +      data: RDD[LabeledPoint],
    +      loss: Loss): Array[Double] = {
    +
    +    val sc = data.sparkContext
    +    val remappedData = algo match {
    +      case Classification => data.map(x => new LabeledPoint((x.label * 2) 
- 1, x.features))
    +      case _ => data
    +    }
    +
    +    val numIterations = trees.length
    +    val evaluationArray = Array.fill(numIterations)(0.0)
    +
    +    var predictionAndError: RDD[(Double, Double)] = remappedData.map { i =>
    +      val pred = treeWeights(0) * trees(0).predict(i.features)
    +      val error = loss.computeError(pred, i.label)
    +      (pred, error)
    +    }
    +    evaluationArray(0) = predictionAndError.values.mean()
    +
    +    // Avoid the model being copied across numIterations.
    +    val broadcastTrees = sc.broadcast(trees)
    +    val broadcastWeights = sc.broadcast(treeWeights)
    +
    +    (1 until numIterations).map { nTree =>
    +      predictionAndError = 
remappedData.zip(predictionAndError).mapPartitions { iter =>
    +        val currentTree = broadcastTrees.value(nTree)
    +        val currentTreeWeight = broadcastWeights.value(nTree)
    +        iter.map {
    +          case (point, (pred, error)) => {
    +            val newPred = pred + currentTree.predict(point.features) * 
currentTreeWeight
    --- End diff --
    
    I think this is more of a design problem. Do we want 
`evaluateEachIteration` to do the same thing as what the 
`GradientBoostingModel` does internally (since the algo is set to Regression 
explicitly)? I also think it might be confusing if users see that during 
classification problems, this method behaves in a different way as compared to 
internally. 


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to