// Divides output values of leaves to bag count. // This brings back the final scores generated by model on a same // range as when we didn't use bagging public void ScaleEnsembleLeaves(int numTrees, int bagSize, Ensemble ensemble) { int bagCount = GetBagCount(numTrees, bagSize); for (int t = 0; t < ensemble.NumTrees; t++) { RegressionTree tree = ensemble.GetTreeAt(t); tree.ScaleOutputsBy(1.0 / bagCount); } }
protected virtual double[] GetGradient(IChannel ch) { Contracts.AssertValue(ch); if (DropoutRate > 0) { if (_droppedScores == null) { _droppedScores = new double[TrainingScores.Scores.Length]; } else { Array.Clear(_droppedScores, 0, _droppedScores.Length); } if (_scores == null) { _scores = new double[TrainingScores.Scores.Length]; } int numberOfTrees = Ensemble.NumTrees; int[] droppedTrees = Enumerable.Range(0, numberOfTrees).Where(t => (DropoutRng.NextDouble() < DropoutRate)).ToArray(); _numberOfDroppedTrees = droppedTrees.Length; if ((_numberOfDroppedTrees == 0) && (numberOfTrees > 0)) { droppedTrees = new int[] { DropoutRng.Next(numberOfTrees) }; // force at least a single tree to be dropped _numberOfDroppedTrees = droppedTrees.Length; } ch.Trace("dropout: Dropping {0} trees of {1} for rate {2}", _numberOfDroppedTrees, numberOfTrees, DropoutRate); foreach (int i in droppedTrees) { double[] s = _treeScores[i]; for (int j = 0; j < _droppedScores.Length; j++) { _droppedScores[j] += s[j]; // summing up the weights of the dropped tree s[j] *= _numberOfDroppedTrees / (1.0 + _numberOfDroppedTrees); // rescaling the dropped tree } Ensemble.GetTreeAt(i).ScaleOutputsBy(_numberOfDroppedTrees / (1.0 + _numberOfDroppedTrees)); } for (int j = 0; j < _scores.Length; j++) { _scores[j] = TrainingScores.Scores[j] - _droppedScores[j]; TrainingScores.Scores[j] -= _droppedScores[j] / (1.0 + _numberOfDroppedTrees); } return(ObjectiveFunction.GetGradient(ch, _scores)); } else { return(ObjectiveFunction.GetGradient(ch, TrainingScores.Scores)); } }
private Ensemble GetEnsembleFromSolution(LassoFit fit, int solutionIdx, Ensemble originalEnsemble) { Ensemble ensemble = new Ensemble(); int weightsCount = fit.NumberOfWeights[solutionIdx]; for (int i = 0; i < weightsCount; i++) { double weight = fit.CompressedWeights[solutionIdx][i]; if (weight != 0) { RegressionTree tree = originalEnsemble.GetTreeAt(fit.Indices[i]); tree.Weight = weight; ensemble.AddTree(tree); } } ensemble.Bias = fit.Intercepts[solutionIdx]; return(ensemble); }