59 TMVA::ExpectedErrorPruneTool::ExpectedErrorPruneTool() :
61 fDeltaPruneStrength(0),
63 fLogger( new MsgLogger(
"ExpectedErrorPruneTool") )
68 TMVA::ExpectedErrorPruneTool::~ExpectedErrorPruneTool()
76 TMVA::ExpectedErrorPruneTool::CalculatePruningInfo( DecisionTree* dt,
77 const IPruneTool::EventSample* validationSample,
83 Log() << kWARNING <<
"Sorry automatic pruning strength determination is not implemented yet" << Endl;
85 if( dt == NULL || (IsAutomatic() && validationSample == NULL) ) {
91 fNodePurityLimit = dt->GetNodePurityLimit();
94 Log() << kFATAL <<
"Sorry automatic pruning strength determination is not implemented yet" << Endl;
164 FindListOfNodes( (DecisionTreeNode*)dt->GetRoot() );
165 return new PruningInfo( -1.0, fPruneStrength, fPruneSequence );
172 void TMVA::ExpectedErrorPruneTool::FindListOfNodes( DecisionTreeNode* node )
174 TMVA::DecisionTreeNode *l = (TMVA::DecisionTreeNode*)node->GetLeft();
175 TMVA::DecisionTreeNode *r = (TMVA::DecisionTreeNode*)node->GetRight();
176 if (node->GetNodeType() == 0 && !(node->IsTerminal())) {
177 this->FindListOfNodes(l);
178 this->FindListOfNodes(r);
179 if (this->GetSubTreeError(node) >= this->GetNodeError(node)) {
181 fPruneSequence.push_back(node);
190 Double_t TMVA::ExpectedErrorPruneTool::GetSubTreeError( DecisionTreeNode* node )
const
192 DecisionTreeNode *l = (DecisionTreeNode*)node->GetLeft();
193 DecisionTreeNode *r = (DecisionTreeNode*)node->GetRight();
194 if (node->GetNodeType() == 0 && !(node->IsTerminal())) {
195 Double_t subTreeError =
196 (l->GetNEvents() * this->GetSubTreeError(l) +
197 r->GetNEvents() * this->GetSubTreeError(r)) /
202 return this->GetNodeError(node);
216 Double_t TMVA::ExpectedErrorPruneTool::GetNodeError( DecisionTreeNode *node )
const
218 Double_t errorRate = 0;
220 Double_t nEvts = node->GetNEvents();
224 if (node->GetPurity() > fNodePurityLimit) f = node->GetPurity();
225 else f = (1-node->GetPurity());
227 Double_t df = TMath::Sqrt(f*(1-f)/nEvts);
229 errorRate = std::min(1.0,(1.0 - (f-fPruneStrength*df)));