111 fROC(
kTRUE), fSilentFile(theTargetFile == nullptr), fJobName(jobName), fAnalysisType(
Types::kClassification),
112 fModelPersistence(
kTRUE)
144 DeclareOptionRef(color,
"Color",
"Flag for coloured screen output (default: True, if in batch mode: False)");
147 "List of transformations to test; formatting example: \"Transformations=I;D;P;U;G,D\", for identity, "
148 "decorrelation, PCA, Uniform and Gaussianisation followed by decorrelation transformations");
152 "Batch mode: boolean silent flag inhibiting any output from TMVA after the creation of the factory "
153 "class object (default: False)");
155 "Draw progress bar to display training, testing and evaluation schedule (default: True)");
157 "Option to save the trained model in xml file or using serialization");
161 "Set the analysis type (Classification, Regression, Multiclass, Auto) (default: Auto)");
185 if (analysisType ==
"classification")
187 else if (analysisType ==
"regression")
189 else if (analysisType ==
"multiclass")
191 else if (analysisType ==
"auto")
202 fSilentFile(
kTRUE), fJobName(jobName), fAnalysisType(
Types::kClassification), fModelPersistence(
kTRUE)
234 DeclareOptionRef(color,
"Color",
"Flag for coloured screen output (default: True, if in batch mode: False)");
237 "List of transformations to test; formatting example: \"Transformations=I;D;P;U;G,D\", for identity, "
238 "decorrelation, PCA, Uniform and Gaussianisation followed by decorrelation transformations");
242 "Batch mode: boolean silent flag inhibiting any output from TMVA after the creation of the factory "
243 "class object (default: False)");
245 "Draw progress bar to display training, testing and evaluation schedule (default: True)");
247 "Option to save the trained model in xml file or using serialization");
251 "Set the analysis type (Classification, Regression, Multiclass, Auto) (default: Auto)");
275 if (analysisType ==
"classification")
277 else if (analysisType ==
"regression")
279 else if (analysisType ==
"multiclass")
281 else if (analysisType ==
"auto")
304 std::vector<TMVA::VariableTransformBase *>::iterator trfIt = fDefaultTrfs.begin();
305 for (; trfIt != fDefaultTrfs.end(); ++trfIt)
308 this->DeleteAllMethods();
322 std::map<TString, MVector *>::iterator itrMap;
324 for (itrMap = fMethodsMap.begin(); itrMap != fMethodsMap.end(); ++itrMap) {
325 MVector *methods = itrMap->second;
327 MVector::iterator itrMethod = methods->begin();
328 for (; itrMethod != methods->end(); ++itrMethod) {
329 Log() << kDEBUG <<
"Delete method: " << (*itrMethod)->GetName() <<
Endl;
357 if (fModelPersistence)
376 if (fMethodsMap.find(datasetname) != fMethodsMap.end()) {
377 if (GetMethod(datasetname, methodTitle) != 0) {
378 Log() << kFATAL <<
"Booking failed since method with title <" << methodTitle <<
"> already exists "
379 <<
"in with DataSet Name <" << loader->
GetName() <<
"> " <<
Endl;
383 Log() << kHEADER <<
"Booking method: " <<
gTools().
Color(
"bold")
391 conf->
DeclareOptionRef(boostNum = 0,
"Boost_num",
"Number of times the classifier will be boosted");
396 if (fModelPersistence) {
401 if (fileDir[fileDir.
Length() - 1] !=
'/')
413 Log() << kDEBUG <<
"Boost Number is " << boostNum <<
" > 0: train boosted classifier" <<
Endl;
417 Log() << kFATAL <<
"Method with type kBoost cannot be casted to MethodCategory. /Factory" <<
Endl;
420 if (fModelPersistence)
425 methBoost->
SetFile(fgTargetFile);
437 Log() << kFATAL <<
"Method with type kCategory cannot be casted to MethodCategory. /Factory"
441 if (fModelPersistence)
445 methCat->
SetFile(fgTargetFile);
451 Log() << kWARNING <<
"Method " << method->
GetMethodTypeName() <<
" is not capable of handling ";
462 if (fModelPersistence)
475 if (fMethodsMap.find(datasetname) == fMethodsMap.end()) {
477 fMethodsMap[datasetname] = mvector;
479 fMethodsMap[datasetname]->push_back(method);
495 std::string methodTypeName = std::string(
Types::Instance().GetMethodName(methodType).Data());
501 if (method ==
nullptr)
505 Log() << kERROR <<
"Cannot handle category methods for now." <<
Endl;
509 if (fModelPersistence) {
514 if (fileDir[fileDir.
Length() - 1] !=
'/')
520 if (fModelPersistence)
536 if (HasMethod(datasetname, methodTitle) != 0) {
537 Log() << kFATAL <<
"Booking failed since method with title <" << methodTitle <<
"> already exists "
538 <<
"in with DataSet Name <" << loader->
GetName() <<
"> " <<
Endl;
541 Log() << kINFO <<
"Booked classifier \"" << method->
GetMethodName() <<
"\" of type: \""
544 if (fMethodsMap.count(datasetname) == 0) {
546 fMethodsMap[datasetname] = mvector;
549 fMethodsMap[datasetname]->push_back(method);
559 if (fMethodsMap.find(datasetname) == fMethodsMap.end())
562 MVector *methods = fMethodsMap.find(datasetname)->second;
564 MVector::const_iterator itrMethod;
566 for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
579 if (fMethodsMap.find(datasetname) == fMethodsMap.end())
582 std::string methodName = methodTitle.
Data();
583 auto isEqualToMethodName = [&methodName](
TMVA::IMethod *
m) {
return (0 == methodName.compare(
m->
GetName())); };
586 Bool_t isMethodNameExisting = std::any_of(methods->begin(), methods->end(), isEqualToMethodName);
588 return isMethodNameExisting;
597 if (!RootBaseDir()->GetDirectory(fDataSetInfo.
GetName()))
598 RootBaseDir()->mkdir(fDataSetInfo.
GetName());
602 RootBaseDir()->cd(fDataSetInfo.
GetName());
648 processTrfs = fTransformations;
651 std::vector<TMVA::TransformationHandler *> trfs;
655 std::vector<TString>::iterator trfsDefIt = trfsDef.begin();
656 for (; trfsDefIt != trfsDef.end(); ++trfsDefIt) {
661 Log() << kDEBUG <<
"current transformation string: '" << trfS.
Data() <<
"'" <<
Endl;
665 identityTrHandler = trfs.back();
671 std::vector<TMVA::TransformationHandler *>::iterator trfIt = trfs.begin();
673 for (; trfIt != trfs.end(); ++trfIt) {
675 (*trfIt)->SetRootDir(RootBaseDir()->GetDirectory(fDataSetInfo.
GetName()));
676 (*trfIt)->CalcTransformations(inputEvents);
678 if (identityTrHandler)
682 for (trfIt = trfs.begin(); trfIt != trfs.end(); ++trfIt)
695 std::map<TString, MVector *>::iterator itrMap;
696 std::map<TString, Double_t> TunedParameters;
697 for (itrMap = fMethodsMap.begin(); itrMap != fMethodsMap.end(); ++itrMap) {
698 MVector *methods = itrMap->second;
700 MVector::iterator itrMethod;
703 for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
707 Log() << kFATAL <<
"Dynamic cast to MethodBase failed" <<
Endl;
708 return TunedParameters;
712 Log() << kWARNING <<
"Method " << mva->
GetMethodName() <<
" not trained (training tree has less entries ["
717 Log() << kINFO <<
"Optimize method: " << mva->
GetMethodName() <<
" for "
720 : (fAnalysisType ==
Types::kMulticlass ?
"Multiclass classification" :
"Classification"))
724 Log() << kINFO <<
"Optimization of tuning parameters finished for Method:" << mva->
GetName() <<
Endl;
728 return TunedParameters;
755 if (fMethodsMap.find(datasetname) == fMethodsMap.end()) {
756 Log() << kERROR <<
Form(
"DataSet = %s not found in methods map.", datasetname.
Data()) <<
Endl;
760 if (!this->HasMethod(datasetname, theMethodName)) {
761 Log() << kERROR <<
Form(
"Method = %s not found with Dataset = %s ", theMethodName.
Data(), datasetname.
Data())
767 if (allowedAnalysisTypes.count(this->fAnalysisType) == 0) {
768 Log() << kERROR <<
Form(
"Can only generate ROC curves for analysis type kClassification and kMulticlass.")
781 <<
Form(
"Given class number (iClass = %i) does not exist. There are %i classes in dataset.", iClass,
791 std::vector<Bool_t> *mvaResTypes =
dynamic_cast<ResultsClassification *
>(results)->GetValueVectorTypes();
792 std::vector<Float_t> mvaResWeights;
795 mvaResWeights.reserve(eventCollection.size());
796 for (
auto ev : eventCollection) {
797 mvaResWeights.push_back(ev->GetWeight());
800 rocCurve =
new TMVA::ROCCurve(*mvaRes, *mvaResTypes, mvaResWeights);
803 std::vector<Float_t> mvaRes;
804 std::vector<Bool_t> mvaResTypes;
805 std::vector<Float_t> mvaResWeights;
807 std::vector<std::vector<Float_t>> *rawMvaRes =
dynamic_cast<ResultsMulticlass *
>(results)->GetValueVector();
812 mvaRes.reserve(rawMvaRes->size());
813 for (
auto item : *rawMvaRes) {
814 mvaRes.push_back(item[iClass]);
818 mvaResTypes.reserve(eventCollection.size());
819 mvaResWeights.reserve(eventCollection.size());
820 for (
auto ev : eventCollection) {
821 mvaResTypes.push_back(ev->GetClass() == iClass);
822 mvaResWeights.push_back(ev->GetWeight());
825 rocCurve =
new TMVA::ROCCurve(mvaRes, mvaResTypes, mvaResWeights);
855 if (fMethodsMap.find(datasetname) == fMethodsMap.end()) {
856 Log() << kERROR <<
Form(
"DataSet = %s not found in methods map.", datasetname.
Data()) <<
Endl;
860 if (!this->HasMethod(datasetname, theMethodName)) {
861 Log() << kERROR <<
Form(
"Method = %s not found with Dataset = %s ", theMethodName.
Data(), datasetname.
Data())
867 if (allowedAnalysisTypes.count(this->fAnalysisType) == 0) {
868 Log() << kERROR <<
Form(
"Can only generate ROC integral for analysis type kClassification. and kMulticlass.")
876 <<
Form(
"ROCCurve object was not created in Method = %s not found with Dataset = %s ", theMethodName.
Data(),
906 return GetROCCurve((
TString)loader->
GetName(), theMethodName, setTitles, iClass,
type);
926 if (fMethodsMap.find(datasetname) == fMethodsMap.end()) {
927 Log() << kERROR <<
Form(
"DataSet = %s not found in methods map.", datasetname.
Data()) <<
Endl;
931 if (!this->HasMethod(datasetname, theMethodName)) {
932 Log() << kERROR <<
Form(
"Method = %s not found with Dataset = %s ", theMethodName.
Data(), datasetname.
Data())
938 if (allowedAnalysisTypes.count(this->fAnalysisType) == 0) {
939 Log() << kERROR <<
Form(
"Can only generate ROC curves for analysis type kClassification and kMulticlass.")
949 <<
Form(
"ROCCurve object was not created in Method = %s not found with Dataset = %s ", theMethodName.
Data(),
1002 MVector *methods = fMethodsMap[datasetname.
Data()];
1003 for (
auto *method_raw : *methods) {
1005 if (method ==
nullptr) {
1014 <<
Form(
"Given class number (iClass = %i) does not exist. There are %i classes in dataset.", iClass,
1022 TGraph *graph = this->GetROCCurve(datasetname, methodName,
false, iClass,
type);
1029 multigraph->
Add(graph);
1033 Log() << kERROR <<
Form(
"No metohds have class %i defined.", iClass) <<
Endl;
1070 if (fMethodsMap.find(datasetname) == fMethodsMap.end()) {
1071 Log() << kERROR <<
Form(
"DataSet = %s not found in methods map.", datasetname.
Data()) <<
Endl;
1079 TMultiGraph *multigraph = this->GetROCCurveAsMultiGraph(datasetname, iClass,
type);
1082 multigraph->
Draw(
"AL");
1096 canvas->
BuildLegend(0.15, 0.15, 0.35, 0.3,
"MVA Method");
1111 if (fMethodsMap.empty()) {
1112 Log() << kINFO <<
"...nothing found to train" <<
Endl;
1118 Log() << kDEBUG <<
"Train all methods for "
1124 std::map<TString, MVector *>::iterator itrMap;
1126 for (itrMap = fMethodsMap.begin(); itrMap != fMethodsMap.end(); ++itrMap) {
1127 MVector *methods = itrMap->second;
1128 MVector::iterator itrMethod;
1131 for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
1140 Log() << kFATAL <<
"No input data for the training provided!" <<
Endl;
1144 Log() << kFATAL <<
"You want to do regression training without specifying a target." <<
Endl;
1147 Log() << kFATAL <<
"You want to do classification training, but specified less than two classes." <<
Endl;
1150 if (!IsSilentFile())
1154 Log() << kWARNING <<
"Method " << mva->
GetMethodName() <<
" not trained (training tree has less entries ["
1159 Log() << kHEADER <<
"Train method: " << mva->
GetMethodName() <<
" for "
1162 : (fAnalysisType ==
Types::kMulticlass ?
"Multiclass classification" :
"Classification"))
1165 Log() << kHEADER <<
"Training finished" <<
Endl <<
Endl;
1172 Log() << kINFO <<
"Ranking input variables (method specific)..." <<
Endl;
1173 for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
1178 const Ranking *ranking = (*itrMethod)->CreateRanking();
1182 Log() << kINFO <<
"No variable ranking supplied by classifier: "
1189 if (!IsSilentFile()) {
1190 for (
UInt_t i = 0; i < methods->size(); i++) {
1195 m->fTrainHistory.SaveHistory(
m->GetMethodName());
1203 if (fModelPersistence) {
1205 Log() << kHEADER <<
"=== Destroy and recreate all methods via weight files for testing ===" <<
Endl <<
Endl;
1207 if (!IsSilentFile())
1208 RootBaseDir()->cd();
1211 for (
UInt_t i = 0; i < methods->size(); i++) {
1218 TString weightfile =
m->GetWeightFileName();
1225 TString testvarName =
m->GetTestvarName();
1230 Types::Instance().GetMethodName(methodType).Data(), dataSetInfo, weightfile));
1234 Log() << kFATAL <<
"Method with type kCategory cannot be casted to MethodCategory. /Factory" <<
Endl;
1242 m->SetWeightFileDir(wfileDir);
1243 m->SetModelPersistence(fModelPersistence);
1244 m->SetSilentFile(IsSilentFile());
1245 m->SetAnalysisType(fAnalysisType);
1247 m->ReadStateFromFile();
1248 m->SetTestvarName(testvarName);
1267 if (fMethodsMap.empty()) {
1268 Log() << kINFO <<
"...nothing found to test" <<
Endl;
1271 std::map<TString, MVector *>::iterator itrMap;
1273 for (itrMap = fMethodsMap.begin(); itrMap != fMethodsMap.end(); ++itrMap) {
1274 MVector *methods = itrMap->second;
1275 MVector::iterator itrMethod;
1278 for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
1284 Log() << kHEADER <<
"Test method: " << mva->
GetMethodName() <<
" for "
1287 : (analysisType ==
Types::kMulticlass ?
"Multiclass classification" :
"Classification"))
1298 if (methodTitle !=
"") {
1299 IMethod *method = GetMethod(datasetname, methodTitle);
1303 Log() << kWARNING <<
"<MakeClass> Could not find classifier \"" << methodTitle <<
"\" in list" <<
Endl;
1308 MVector *methods = fMethodsMap.find(datasetname)->second;
1309 MVector::const_iterator itrMethod;
1310 for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
1314 Log() << kINFO <<
"Make response class for classifier: " << method->
GetMethodName() <<
Endl;
1326 if (methodTitle !=
"") {
1327 IMethod *method = GetMethod(datasetname, methodTitle);
1331 Log() << kWARNING <<
"<PrintHelpMessage> Could not find classifier \"" << methodTitle <<
"\" in list" <<
Endl;
1336 MVector *methods = fMethodsMap.find(datasetname)->second;
1337 MVector::const_iterator itrMethod;
1338 for (itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
1342 Log() << kINFO <<
"Print help message for classifier: " << method->
GetMethodName() <<
Endl;
1353 Log() << kINFO <<
"Evaluating all variables..." <<
Endl;
1360 this->BookMethod(loader,
"Variable", s);
1372 if (fMethodsMap.empty()) {
1373 Log() << kINFO <<
"...nothing found to evaluate" <<
Endl;
1376 std::map<TString, MVector *>::iterator itrMap;
1378 for (itrMap = fMethodsMap.begin(); itrMap != fMethodsMap.end(); ++itrMap) {
1379 MVector *methods = itrMap->second;
1389 Int_t nmeth_used[2] = {0, 0};
1391 std::vector<std::vector<TString>> mname(2);
1392 std::vector<std::vector<Double_t>> sig(2), sep(2), roc(2);
1393 std::vector<std::vector<Double_t>> eff01(2), eff10(2), eff30(2), effArea(2);
1394 std::vector<std::vector<Double_t>> eff01err(2), eff10err(2), eff30err(2);
1395 std::vector<std::vector<Double_t>> trainEff01(2), trainEff10(2), trainEff30(2);
1397 std::vector<std::vector<Float_t>> multiclass_testEff;
1398 std::vector<std::vector<Float_t>> multiclass_trainEff;
1399 std::vector<std::vector<Float_t>> multiclass_testPur;
1400 std::vector<std::vector<Float_t>> multiclass_trainPur;
1402 std::vector<std::vector<Float_t>> train_history;
1405 std::vector<TMatrixD> multiclass_trainConfusionEffB01;
1406 std::vector<TMatrixD> multiclass_trainConfusionEffB10;
1407 std::vector<TMatrixD> multiclass_trainConfusionEffB30;
1408 std::vector<TMatrixD> multiclass_testConfusionEffB01;
1409 std::vector<TMatrixD> multiclass_testConfusionEffB10;
1410 std::vector<TMatrixD> multiclass_testConfusionEffB30;
1412 std::vector<std::vector<Double_t>> biastrain(1);
1413 std::vector<std::vector<Double_t>> biastest(1);
1414 std::vector<std::vector<Double_t>> devtrain(1);
1415 std::vector<std::vector<Double_t>> devtest(1);
1416 std::vector<std::vector<Double_t>> rmstrain(1);
1417 std::vector<std::vector<Double_t>> rmstest(1);
1418 std::vector<std::vector<Double_t>> minftrain(1);
1419 std::vector<std::vector<Double_t>> minftest(1);
1420 std::vector<std::vector<Double_t>> rhotrain(1);
1421 std::vector<std::vector<Double_t>> rhotest(1);
1424 std::vector<std::vector<Double_t>> biastrainT(1);
1425 std::vector<std::vector<Double_t>> biastestT(1);
1426 std::vector<std::vector<Double_t>> devtrainT(1);
1427 std::vector<std::vector<Double_t>> devtestT(1);
1428 std::vector<std::vector<Double_t>> rmstrainT(1);
1429 std::vector<std::vector<Double_t>> rmstestT(1);
1430 std::vector<std::vector<Double_t>> minftrainT(1);
1431 std::vector<std::vector<Double_t>> minftestT(1);
1440 for (MVector::iterator itrMethod = methods->begin(); itrMethod != methods->end(); ++itrMethod) {
1445 theMethod->
SetFile(fgTargetFile);
1448 methodsNoCuts.push_back(*itrMethod);
1451 doRegression =
kTRUE;
1453 Log() << kINFO <<
"Evaluate regression method: " << theMethod->
GetMethodName() <<
Endl;
1458 Log() << kINFO <<
"TestRegression (testing)" <<
Endl;
1460 biastest[0].push_back(bias);
1461 devtest[0].push_back(dev);
1462 rmstest[0].push_back(rms);
1463 minftest[0].push_back(mInf);
1464 rhotest[0].push_back(rho);
1465 biastestT[0].push_back(biasT);
1466 devtestT[0].push_back(devT);
1467 rmstestT[0].push_back(rmsT);
1468 minftestT[0].push_back(mInfT);
1470 Log() << kINFO <<
"TestRegression (training)" <<
Endl;
1472 biastrain[0].push_back(bias);
1473 devtrain[0].push_back(dev);
1474 rmstrain[0].push_back(rms);
1475 minftrain[0].push_back(mInf);
1476 rhotrain[0].push_back(rho);
1477 biastrainT[0].push_back(biasT);
1478 devtrainT[0].push_back(devT);
1479 rmstrainT[0].push_back(rmsT);
1480 minftrainT[0].push_back(mInfT);
1484 if (!IsSilentFile()) {
1485 Log() << kDEBUG <<
"\tWrite evaluation histograms to file" <<
Endl;
1493 doMulticlass =
kTRUE;
1494 Log() << kINFO <<
"Evaluate multiclass classification method: " << theMethod->
GetMethodName() <<
Endl;
1513 if (!IsSilentFile()) {
1514 Log() << kDEBUG <<
"\tWrite evaluation histograms to file" <<
Endl;
1537 eff01err[isel].push_back(err);
1539 eff10err[isel].push_back(err);
1541 eff30err[isel].push_back(err);
1544 trainEff01[isel].push_back(
1551 if (!IsSilentFile()) {
1552 Log() << kDEBUG <<
"\tWrite evaluation histograms to file" <<
Endl;
1560 std::vector<TString> vtemps = mname[0];
1561 std::vector<std::vector<Double_t>> vtmp;
1562 vtmp.push_back(devtest[0]);
1563 vtmp.push_back(devtrain[0]);
1564 vtmp.push_back(biastest[0]);
1565 vtmp.push_back(biastrain[0]);
1566 vtmp.push_back(rmstest[0]);
1567 vtmp.push_back(rmstrain[0]);
1568 vtmp.push_back(minftest[0]);
1569 vtmp.push_back(minftrain[0]);
1570 vtmp.push_back(rhotest[0]);
1571 vtmp.push_back(rhotrain[0]);
1572 vtmp.push_back(devtestT[0]);
1573 vtmp.push_back(devtrainT[0]);
1574 vtmp.push_back(biastestT[0]);
1575 vtmp.push_back(biastrainT[0]);
1576 vtmp.push_back(rmstestT[0]);
1577 vtmp.push_back(rmstrainT[0]);
1578 vtmp.push_back(minftestT[0]);
1579 vtmp.push_back(minftrainT[0]);
1582 devtest[0] = vtmp[0];
1583 devtrain[0] = vtmp[1];
1584 biastest[0] = vtmp[2];
1585 biastrain[0] = vtmp[3];
1586 rmstest[0] = vtmp[4];
1587 rmstrain[0] = vtmp[5];
1588 minftest[0] = vtmp[6];
1589 minftrain[0] = vtmp[7];
1590 rhotest[0] = vtmp[8];
1591 rhotrain[0] = vtmp[9];
1592 devtestT[0] = vtmp[10];
1593 devtrainT[0] = vtmp[11];
1594 biastestT[0] = vtmp[12];
1595 biastrainT[0] = vtmp[13];
1596 rmstestT[0] = vtmp[14];
1597 rmstrainT[0] = vtmp[15];
1598 minftestT[0] = vtmp[16];
1599 minftrainT[0] = vtmp[17];
1600 }
else if (doMulticlass) {
1607 for (
Int_t k = 0; k < 2; k++) {
1608 std::vector<std::vector<Double_t>> vtemp;
1609 vtemp.push_back(effArea[k]);
1610 vtemp.push_back(eff10[k]);
1611 vtemp.push_back(eff01[k]);
1612 vtemp.push_back(eff30[k]);
1613 vtemp.push_back(eff10err[k]);
1614 vtemp.push_back(eff01err[k]);
1615 vtemp.push_back(eff30err[k]);
1616 vtemp.push_back(trainEff10[k]);
1617 vtemp.push_back(trainEff01[k]);
1618 vtemp.push_back(trainEff30[k]);
1619 vtemp.push_back(sig[k]);
1620 vtemp.push_back(sep[k]);
1621 vtemp.push_back(roc[k]);
1622 std::vector<TString> vtemps = mname[k];
1624 effArea[k] = vtemp[0];
1625 eff10[k] = vtemp[1];
1626 eff01[k] = vtemp[2];
1627 eff30[k] = vtemp[3];
1628 eff10err[k] = vtemp[4];
1629 eff01err[k] = vtemp[5];
1630 eff30err[k] = vtemp[6];
1631 trainEff10[k] = vtemp[7];
1632 trainEff01[k] = vtemp[8];
1633 trainEff30[k] = vtemp[9];
1647 if (fCorrelations) {
1648 const Int_t nmeth = methodsNoCuts.size();
1651 if (!doRegression && !doMulticlass) {
1657 std::vector<Double_t> rvec;
1664 std::vector<TString> *theVars =
new std::vector<TString>;
1665 std::vector<ResultsClassification *> mvaRes;
1666 for (MVector::iterator itrMethod = methodsNoCuts.begin(); itrMethod != methodsNoCuts.end();
1671 theVars->push_back(
m->GetTestvarName());
1672 rvec.push_back(
m->GetSignalReferenceCut());
1673 theVars->back().ReplaceAll(
"MVA_",
"");
1692 for (
Int_t im = 0; im < nmeth; im++) {
1696 Log() << kWARNING <<
"Found NaN return value in event: " << ievt <<
" for method \""
1697 << methodsNoCuts[im]->GetName() <<
"\"" <<
Endl;
1702 for (
Int_t iv = 0; iv < nvar; iv++)
1713 for (
Int_t im = 0; im < nmeth; im++) {
1714 for (
Int_t jm = im; jm < nmeth; jm++) {
1715 if ((dvec[im] - rvec[im]) * (dvec[jm] - rvec[jm]) > 0) {
1716 (*theMat)(im, jm)++;
1718 (*theMat)(jm, im)++;
1738 if (corrMatS != 0 && corrMatB != 0) {
1743 for (
Int_t im = 0; im < nmeth; im++) {
1744 for (
Int_t jm = 0; jm < nmeth; jm++) {
1745 mvaMatS(im, jm) = (*corrMatS)(im, jm);
1746 mvaMatB(im, jm) = (*corrMatB)(im, jm);
1751 std::vector<TString> theInputVars;
1754 for (
Int_t iv = 0; iv < nvar; iv++) {
1756 for (
Int_t jm = 0; jm < nmeth; jm++) {
1757 varmvaMatS(iv, jm) = (*corrMatS)(nmeth + iv, jm);
1758 varmvaMatB(iv, jm) = (*corrMatB)(nmeth + iv, jm);
1763 Log() << kINFO <<
Endl;
1765 <<
"Inter-MVA correlation matrix (signal):" <<
Endl;
1767 Log() << kINFO <<
Endl;
1770 <<
"Inter-MVA correlation matrix (background):" <<
Endl;
1772 Log() << kINFO <<
Endl;
1776 <<
"Correlations between input variables and MVA response (signal):" <<
Endl;
1778 Log() << kINFO <<
Endl;
1781 <<
"Correlations between input variables and MVA response (background):" <<
Endl;
1783 Log() << kINFO <<
Endl;
1786 <<
"<TestAllMethods> cannot compute correlation matrices" <<
Endl;
1790 <<
"The following \"overlap\" matrices contain the fraction of events for which " <<
Endl;
1792 <<
"the MVAs 'i' and 'j' have returned conform answers about \"signal-likeness\"" <<
Endl;
1794 <<
"An event is signal-like, if its MVA output exceeds the following value:" <<
Endl;
1797 <<
"which correspond to the working point: eff(signal) = 1 - eff(background)" <<
Endl;
1800 if (nmeth != (
Int_t)methods->size())
1802 <<
"Note: no correlations and overlap with cut method are provided at present" <<
Endl;
1805 Log() << kINFO <<
Endl;
1807 <<
"Inter-MVA overlap matrix (signal):" <<
Endl;
1809 Log() << kINFO <<
Endl;
1812 <<
"Inter-MVA overlap matrix (background):" <<
Endl;
1835 Log() << kINFO <<
Endl;
1837 "--------------------------------------------------------------------------------------------------";
1838 Log() << kINFO <<
"Evaluation results ranked by smallest RMS on test sample:" <<
Endl;
1839 Log() << kINFO <<
"(\"Bias\" quotes the mean deviation of the regression from true target." <<
Endl;
1840 Log() << kINFO <<
" \"MutInf\" is the \"Mutual Information\" between regression and target." <<
Endl;
1841 Log() << kINFO <<
" Indicated by \"_T\" are the corresponding \"truncated\" quantities ob-" <<
Endl;
1842 Log() << kINFO <<
" tained when removing events deviating more than 2sigma from average.)" <<
Endl;
1843 Log() << kINFO << hLine <<
Endl;
1846 Log() << kINFO << hLine <<
Endl;
1848 for (
Int_t i = 0; i < nmeth_used[0]; i++) {
1855 (
const char *)mname[0][i], biastest[0][i], biastestT[0][i], rmstest[0][i], rmstestT[0][i],
1856 minftest[0][i], minftestT[0][i])
1859 Log() << kINFO << hLine <<
Endl;
1860 Log() << kINFO <<
Endl;
1861 Log() << kINFO <<
"Evaluation results ranked by smallest RMS on training sample:" <<
Endl;
1862 Log() << kINFO <<
"(overtraining check)" <<
Endl;
1863 Log() << kINFO << hLine <<
Endl;
1865 <<
"DataSet Name: MVA Method: <Bias> <Bias_T> RMS RMS_T | MutInf MutInf_T"
1867 Log() << kINFO << hLine <<
Endl;
1869 for (
Int_t i = 0; i < nmeth_used[0]; i++) {
1875 (
const char *)mname[0][i], biastrain[0][i], biastrainT[0][i], rmstrain[0][i], rmstrainT[0][i],
1876 minftrain[0][i], minftrainT[0][i])
1879 Log() << kINFO << hLine <<
Endl;
1880 Log() << kINFO <<
Endl;
1881 }
else if (doMulticlass) {
1887 "-------------------------------------------------------------------------------------------------------";
1926 TString header1 =
TString::Format(
"%-15s%-15s%-15s%-15s%-15s%-15s",
"Dataset",
"MVA Method",
"ROC AUC",
"Sig eff@B=0.01",
1927 "Sig eff@B=0.10",
"Sig eff@B=0.30");
1928 TString header2 =
TString::Format(
"%-15s%-15s%-15s%-15s%-15s%-15s",
"Name:",
"/ Class:",
"test (train)",
"test (train)",
1929 "test (train)",
"test (train)");
1930 Log() << kINFO <<
Endl;
1931 Log() << kINFO <<
"1-vs-rest performance metrics per class" <<
Endl;
1932 Log() << kINFO << hLine <<
Endl;
1933 Log() << kINFO <<
Endl;
1934 Log() << kINFO <<
"Considers the listed class as signal and the other classes" <<
Endl;
1935 Log() << kINFO <<
"as background, reporting the resulting binary performance." <<
Endl;
1936 Log() << kINFO <<
"A score of 0.820 (0.850) means 0.820 was acheived on the" <<
Endl;
1937 Log() << kINFO <<
"test set and 0.850 on the training set." <<
Endl;
1939 Log() << kINFO <<
Endl;
1940 Log() << kINFO << header1 <<
Endl;
1941 Log() << kINFO << header2 <<
Endl;
1942 for (
Int_t k = 0; k < 2; k++) {
1943 for (
Int_t i = 0; i < nmeth_used[k]; i++) {
1945 mname[k][i].ReplaceAll(
"Variable_",
"");
1948 const TString datasetName = itrMap->first;
1949 const TString mvaName = mname[k][i];
1952 if (theMethod == 0) {
1956 Log() << kINFO <<
Endl;
1958 Log() << kINFO << row <<
Endl;
1959 Log() << kINFO <<
"------------------------------" <<
Endl;
1962 for (
UInt_t iClass = 0; iClass < numClasses; ++iClass) {
1981 effB10Cmp.
Data(), effB30Cmp.
Data());
1982 Log() << kINFO << row <<
Endl;
1984 delete rocCurveTrain;
1985 delete rocCurveTest;
1989 Log() << kINFO <<
Endl;
1990 Log() << kINFO << hLine <<
Endl;
1991 Log() << kINFO <<
Endl;
2005 for (
UInt_t iCol = 0; iCol < numClasses; ++iCol) {
2009 stream << kINFO << header <<
Endl;
2010 stream << kINFO << headerInfo <<
Endl;
2012 for (
UInt_t iRow = 0; iRow < numClasses; ++iRow) {
2013 stream << kINFO <<
TString::Format(
" %-14s", classnames[iRow].Data());
2015 for (
UInt_t iCol = 0; iCol < numClasses; ++iCol) {
2019 Double_t trainValue = matTraining[iRow][iCol];
2020 Double_t testValue = matTesting[iRow][iCol];
2025 stream << kINFO <<
Endl;
2029 Log() << kINFO <<
Endl;
2030 Log() << kINFO <<
"Confusion matrices for all methods" <<
Endl;
2031 Log() << kINFO << hLine <<
Endl;
2032 Log() << kINFO <<
Endl;
2033 Log() << kINFO <<
"Does a binary comparison between the two classes given by a " <<
Endl;
2034 Log() << kINFO <<
"particular row-column combination. In each case, the class " <<
Endl;
2035 Log() << kINFO <<
"given by the row is considered signal while the class given " <<
Endl;
2036 Log() << kINFO <<
"by the column index is considered background." <<
Endl;
2037 Log() << kINFO <<
Endl;
2038 for (
UInt_t iMethod = 0; iMethod < methods->size(); ++iMethod) {
2040 if (theMethod ==
nullptr) {
2045 std::vector<TString> classnames;
2046 for (
UInt_t iCls = 0; iCls < numClasses; ++iCls) {
2050 <<
"=== Showing confusion matrix for method : " <<
Form(
"%-15s", (
const char *)mname[0][iMethod])
2052 Log() << kINFO <<
"(Signal Efficiency for Background Efficiency 0.01%)" <<
Endl;
2053 Log() << kINFO <<
"---------------------------------------------------" <<
Endl;
2054 printMatrix(multiclass_testConfusionEffB01[iMethod], multiclass_trainConfusionEffB01[iMethod], classnames,
2056 Log() << kINFO <<
Endl;
2058 Log() << kINFO <<
"(Signal Efficiency for Background Efficiency 0.10%)" <<
Endl;
2059 Log() << kINFO <<
"---------------------------------------------------" <<
Endl;
2060 printMatrix(multiclass_testConfusionEffB10[iMethod], multiclass_trainConfusionEffB10[iMethod], classnames,
2062 Log() << kINFO <<
Endl;
2064 Log() << kINFO <<
"(Signal Efficiency for Background Efficiency 0.30%)" <<
Endl;
2065 Log() << kINFO <<
"---------------------------------------------------" <<
Endl;
2066 printMatrix(multiclass_testConfusionEffB30[iMethod], multiclass_trainConfusionEffB30[iMethod], classnames,
2068 Log() << kINFO <<
Endl;
2070 Log() << kINFO << hLine <<
Endl;
2071 Log() << kINFO <<
Endl;
2076 Log().EnableOutput();
2079 TString hLine =
"------------------------------------------------------------------------------------------"
2080 "-------------------------";
2081 Log() << kINFO <<
"Evaluation results ranked by best signal efficiency and purity (area)" <<
Endl;
2082 Log() << kINFO << hLine <<
Endl;
2083 Log() << kINFO <<
"DataSet MVA " <<
Endl;
2084 Log() << kINFO <<
"Name: Method: ROC-integ" <<
Endl;
2089 Log() << kDEBUG << hLine <<
Endl;
2090 for (
Int_t k = 0; k < 2; k++) {
2091 if (k == 1 && nmeth_used[k] > 0) {
2092 Log() << kINFO << hLine <<
Endl;
2093 Log() << kINFO <<
"Input Variables: " <<
Endl << hLine <<
Endl;
2095 for (
Int_t i = 0; i < nmeth_used[k]; i++) {
2096 TString datasetName = itrMap->first;
2097 TString methodName = mname[k][i];
2104 if (theMethod == 0) {
2110 std::vector<Bool_t> *mvaResType =
2114 if (mvaResType->size() != 0) {
2115 rocIntegral = GetROCIntegral(datasetName, methodName);
2118 if (sep[k][i] < 0 || sig[k][i] < 0) {
2120 Log() << kINFO <<
Form(
"%-13s %-15s: %#1.3f", datasetName.
Data(), methodName.
Data(), effArea[k][i])
2132 Log() << kINFO <<
Form(
"%-13s %-15s: %#1.3f", datasetName.
Data(), methodName.
Data(), rocIntegral)
2146 Log() << kINFO << hLine <<
Endl;
2147 Log() << kINFO <<
Endl;
2148 Log() << kINFO <<
"Testing efficiency compared to training efficiency (overtraining check)" <<
Endl;
2149 Log() << kINFO << hLine <<
Endl;
2151 <<
"DataSet MVA Signal efficiency: from test sample (from training sample) "
2153 Log() << kINFO <<
"Name: Method: @B=0.01 @B=0.10 @B=0.30 "
2155 Log() << kINFO << hLine <<
Endl;
2156 for (
Int_t k = 0; k < 2; k++) {
2157 if (k == 1 && nmeth_used[k] > 0) {
2158 Log() << kINFO << hLine <<
Endl;
2159 Log() << kINFO <<
"Input Variables: " <<
Endl << hLine <<
Endl;
2161 for (
Int_t i = 0; i < nmeth_used[k]; i++) {
2163 mname[k][i].ReplaceAll(
"Variable_",
"");
2169 <<
Form(
"%-20s %-15s: %#1.3f (%#1.3f) %#1.3f (%#1.3f) %#1.3f (%#1.3f)",
2171 trainEff01[k][i], eff10[k][i], trainEff10[k][i], eff30[k][i], trainEff30[k][i])
2175 Log() << kINFO << hLine <<
Endl;
2176 Log() << kINFO <<
Endl;
2178 if (
gTools().CheckForSilentOption(GetOptions()))
2179 Log().InhibitOutput();
2182 if (!IsSilentFile()) {
2183 std::list<TString> datasets;
2184 for (
Int_t k = 0; k < 2; k++) {
2185 for (
Int_t i = 0; i < nmeth_used[k]; i++) {
2191 if (std::find(datasets.begin(), datasets.end(), theMethod->
fDataSetInfo.
GetName()) == datasets.end()) {
2208 const char *theOption)
2210 fModelPersistence =
kFALSE;
2211 fSilentFile =
kTRUE;
2215 if (vitype == VIType::kShort)
2216 return EvaluateImportanceShort(loader, theMethod, methodTitle, theOption);
2217 else if (vitype == VIType::kAll)
2218 return EvaluateImportanceAll(loader, theMethod, methodTitle, theOption);
2219 else if (vitype == VIType::kRandom) {
2220 if ( nbits > 10 && nbits < 30) {
2222 return EvaluateImportanceRandom(loader,
static_cast<UInt_t>( pow(2, nbits) ), theMethod, methodTitle, theOption);
2223 }
else if (nbits < 10) {
2224 Log() << kERROR <<
"Error in Variable Importance: Random mode require more that 10 variables in the dataset."
2226 }
else if (nbits > 30) {
2227 Log() << kERROR <<
"Error in Variable Importance: Number of variables is too large for Random mode"
2237 const char *theOption)
2248 Log() << kERROR <<
"Number of combinations is too large , is 2^" << nbits <<
Endl;
2252 Log() << kWARNING <<
"Number of combinations is very large , is 2^" << nbits <<
Endl;
2254 uint64_t range =
static_cast<uint64_t
>(pow(2, nbits));
2258 std::vector<Double_t> importances(nbits);
2260 std::vector<Double_t> ROC(range);
2262 for (
int i = 0; i < nbits; i++)
2266 for (
x = 1;
x < range;
x++) {
2268 std::bitset<VIBITS> xbitset(
x);
2287 BookMethod(seedloader, theMethod, methodTitle, theOption);
2292 EvaluateAllMethods();
2295 ROC[
x] = GetROCIntegral(xbitset.to_string(), methodTitle);
2303 this->DeleteAllMethods();
2305 fMethodsMap.clear();
2309 for (
x = 0;
x < range;
x++) {
2311 for (uint32_t i = 0; i <
VIBITS; ++i) {
2312 if (
x & (uint64_t(1) << i)) {
2313 y =
x & ~(uint64_t(1) << i);
2314 std::bitset<VIBITS> ybitset(
y);
2318 uint32_t ny =
static_cast<uint32_t
>( log(
x -
y) / 0.693147 ) ;
2320 importances[ny] = SROC - 0.5;
2326 importances[ny] += SROC - SSROC;
2331 std::cout <<
"--- Variable Importance Results (All)" << std::endl;
2332 return GetImportance(nbits, importances, varNames);
2335static uint64_t
sum(uint64_t i)
2338 if (i > 62)
return 0;
2339 return static_cast<uint64_t
>( std::pow(2, i + 1)) - 1;
2349 const char *theOption)
2359 Log() << kERROR <<
"Number of combinations is too large , is 2^" << nbits <<
Endl;
2362 long int range =
sum(nbits);
2365 std::vector<Double_t> importances(nbits);
2366 for (
int i = 0; i < nbits; i++)
2373 std::bitset<VIBITS> xbitset(
x);
2375 Log() << kFATAL <<
"Error: need at least one variable.";
2390 BookMethod(seedloader, theMethod, methodTitle, theOption);
2395 EvaluateAllMethods();
2398 SROC = GetROCIntegral(xbitset.to_string(), methodTitle);
2406 this->DeleteAllMethods();
2407 fMethodsMap.clear();
2411 for (uint32_t i = 0; i <
VIBITS; ++i) {
2412 if (
x & (uint64_t(1) << i)) {
2413 y =
x & ~(uint64_t(1) << i);
2414 std::bitset<VIBITS> ybitset(
y);
2418 uint32_t ny =
static_cast<uint32_t
>(log(
x -
y) / 0.693147);
2420 importances[ny] = SROC - 0.5;
2436 BookMethod(subseedloader, theMethod, methodTitle, theOption);
2441 EvaluateAllMethods();
2444 SSROC = GetROCIntegral(ybitset.to_string(), methodTitle);
2445 importances[ny] += SROC - SSROC;
2452 delete subseedloader;
2453 this->DeleteAllMethods();
2454 fMethodsMap.clear();
2457 std::cout <<
"--- Variable Importance Results (Short)" << std::endl;
2458 return GetImportance(nbits, importances, varNames);
2464 TString methodTitle,
const char *theOption)
2475 long int range = pow(2, nbits);
2478 std::vector<Double_t> importances(nbits);
2479 for (
int i = 0; i < nbits; i++)
2486 std::bitset<32> xbitset(
x);
2503 BookMethod(seedloader, theMethod, methodTitle, theOption);
2508 EvaluateAllMethods();
2511 SROC = GetROCIntegral(xbitset.to_string(), methodTitle);
2520 this->DeleteAllMethods();
2521 fMethodsMap.clear();
2525 for (uint32_t i = 0; i < 32; ++i) {
2526 if (
x & (uint64_t(1) << i)) {
2527 y =
x & ~(uint64_t(1) << i);
2528 std::bitset<32> ybitset(
y);
2534 importances[ny] = SROC - 0.5;
2551 BookMethod(subseedloader, theMethod, methodTitle, theOption);
2556 EvaluateAllMethods();
2559 SSROC = GetROCIntegral(ybitset.to_string(), methodTitle);
2560 importances[ny] += SROC - SSROC;
2565 dynamic_cast<TMVA::MethodBase *
>(fMethodsMap[ybitset.to_string().c_str()][0][0]);
2569 delete subseedloader;
2570 this->DeleteAllMethods();
2571 fMethodsMap.clear();
2575 std::cout <<
"--- Variable Importance Results (Random)" << std::endl;
2576 return GetImportance(nbits, importances, varNames);
2583 TH1F *vih1 =
new TH1F(
"vih1",
"", nbits, 0, nbits);
2588 for (
int i = 0; i < nbits; i++) {
2589 normalization = normalization + importances[i];
2597 std::vector<Double_t> x_ie(nbits), y_ie(nbits);
2598 for (
Int_t i = 1; i < nbits + 1; i++) {
2599 x_ie[i - 1] = (i - 1) * 1.;
2600 roc = 100.0 * importances[i - 1] / normalization;
2602 std::cout <<
"--- " << varNames[i - 1] <<
" = " << roc <<
" %" << std::endl;
2606 TGraph *g_ie =
new TGraph(nbits + 2, &x_ie[0], &y_ie[0]);
void printMatrix(const TMatrixD &mat)
write a matrix
int Int_t
Signed integer 4 bytes (int)
float Float_t
Float 4 bytes (float)
double Double_t
Double 8 bytes.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
TMatrixT< Double_t > TMatrixD
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
R__EXTERN TStyle * gStyle
R__EXTERN TSystem * gSystem
virtual void SetTitleOffset(Float_t offset=1)
Set distance between the axis and the axis title.
virtual void SetTitleSize(Float_t size=0.04)
Set size of axis title.
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual void SetBinLabel(Int_t bin, const char *label)
Set label for bin.
void CenterTitle(Bool_t center=kTRUE)
Center axis title.
virtual void SetRangeUser(Double_t ufirst, Double_t ulast)
Set the viewing range for the axis from ufirst to ulast (in user coordinates, that is,...
static Int_t GetColor(const char *hexcolor)
Static method returning color number for color specified by hex color string of form: "#rrggbb",...
A file, usually with extension .root, that stores data and code in the form of serialized objects in ...
A TGraph is an object made of two arrays X and Y with npoints each.
TAxis * GetXaxis() const
Get x axis of the graph.
TAxis * GetYaxis() const
Get y axis of the graph.
void SetTitle(const char *title="") override
Change (i.e.
1-D histogram with a float per channel (see TH1 documentation)
virtual void SetDirectory(TDirectory *dir)
By default, when a histogram is created, it is added to the list of histogram objects in the current ...
void SetTitle(const char *title) override
Change/set the title.
virtual void LabelsOption(Option_t *option="h", Option_t *axis="X")
Sort bins with labels or set option(s) to draw axis with labels.
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
virtual void SetBarWidth(Float_t width=0.5)
Set the width of bars as fraction of the bin width for drawing mode "B".
Service class for 2-D histogram classes.
IMethod * Create(const std::string &name, const TString &job, const TString &title, DataSetInfo &dsi, const TString &option)
creates the method if needed based on the method name using the creator function the factory has stor...
static ClassifierFactory & Instance()
access to the ClassifierFactory singleton creates the instance if needed
TString fWeightFileDirPrefix
void SetDrawProgressBar(Bool_t d)
void SetUseColor(Bool_t uc)
class TMVA::Config::VariablePlotting fVariablePlotting
void SetConfigDescription(const char *d)
OptionBase * DeclareOptionRef(T &ref, const TString &name, const TString &desc="")
void AddPreDefVal(const T &)
void SetConfigName(const char *n)
virtual void ParseOptions()
options parser
const TString & GetOptions() const
MsgLogger * fLogger
! message logger
void CheckForUnusedOptions() const
checks for unused options in option string
void PrepareTrainingAndTestTree(const TCut &cut, const TString &splitOpt)
prepare the training and test trees -> same cuts for signal and background
DataSetInfo & GetDataSetInfo()
void AddVariable(const TString &expression, const TString &title, const TString &unit, char type='F', Double_t min=0, Double_t max=0)
user inserts discriminating variable in data set info
Class that contains all the data information.
UInt_t GetNVariables() const
const TMatrixD * CorrelationMatrix(const TString &className) const
UInt_t GetNClasses() const
const TString & GetSplitOptions() const
UInt_t GetNTargets() const
DataSet * GetDataSet() const
returns data set
TH2 * CreateCorrelationMatrixHist(const TMatrixD *m, const TString &hName, const TString &hTitle) const
std::vector< TString > GetListOfVariables() const
returns list of variables
const char * GetName() const override
Returns name of object.
ClassInfo * GetClassInfo(Int_t clNum) const
const TCut & GetCut(Int_t i) const
VariableInfo & GetVariableInfo(Int_t i)
Bool_t IsSignal(const Event *ev) const
DataSetManager * GetDataSetManager()
DataInputHandler & DataInput()
Class that contains all the data information.
Long64_t GetNEvtSigTest()
return number of signal test events in dataset
TTree * GetTree(Types::ETreeType type)
create the test/trainings tree with all the variables, the weights, the classes, the targets,...
const Event * GetEvent() const
returns event without transformations
Long64_t GetNEvents(Types::ETreeType type=Types::kMaxTreeType) const
Results * GetResults(const TString &, Types::ETreeType type, Types::EAnalysisType analysistype)
Long64_t GetNTrainingEvents() const
void SetCurrentType(Types::ETreeType type) const
const std::vector< Event * > & GetEventCollection(Types::ETreeType type=Types::kMaxTreeType) const
Long64_t GetNEvtBkgdTest()
return number of background test events in dataset
Float_t GetValue(UInt_t ivar) const
return value of i'th variable
static void SetIsTraining(Bool_t)
when this static function is called, it sets the flag whether events with negative event weight shoul...
TString const & tString() const
void PrintHelpMessage(const TString &datasetname, const TString &methodTitle="") const
Print predefined help message of classifier.
Bool_t fCorrelations
! enable to calculate correlations
std::vector< IMethod * > MVector
void TrainAllMethods()
Iterates through all booked methods and calls training.
Bool_t Verbose(void) const
void WriteDataInformation(DataSetInfo &fDataSetInfo)
Factory(TString theJobName, TFile *theTargetFile, TString theOption="")
Standard constructor.
void TestAllMethods()
Evaluates all booked methods on the testing data and adds the output to the Results in the corresponi...
Bool_t fVerbose
! verbose mode
void EvaluateAllMethods(void)
Iterates over all MVAs that have been booked, and calls their evaluation methods.
TH1F * EvaluateImportanceRandom(DataLoader *loader, UInt_t nseeds, Types::EMVA theMethod, TString methodTitle, const char *theOption="")
TH1F * GetImportance(const int nbits, std::vector< Double_t > importances, std::vector< TString > varNames)
Bool_t fROC
! enable to calculate ROC values
void EvaluateAllVariables(DataLoader *loader, TString options="")
Iterates over all MVA input variables and evaluates them.
TString fVerboseLevel
! verbosity level, controls granularity of logging
TMultiGraph * GetROCCurveAsMultiGraph(DataLoader *loader, UInt_t iClass, Types::ETreeType type=Types::kTesting)
Generate a collection of graphs, for all methods for a given class.
TH1F * EvaluateImportance(DataLoader *loader, VIType vitype, Types::EMVA theMethod, TString methodTitle, const char *theOption="")
Evaluate Variable Importance.
Double_t GetROCIntegral(DataLoader *loader, TString theMethodName, UInt_t iClass=0, Types::ETreeType type=Types::kTesting)
Calculate the integral of the ROC curve, also known as the area under curve (AUC),...
virtual ~Factory()
Destructor.
MethodBase * BookMethod(DataLoader *loader, MethodName theMethodName, TString methodTitle, TString theOption="")
Books an MVA classifier or regression method.
virtual void MakeClass(const TString &datasetname, const TString &methodTitle="") const
MethodBase * BookMethodWeightfile(DataLoader *dataloader, TMVA::Types::EMVA methodType, const TString &weightfile)
Adds an already constructed method to be managed by this factory.
Bool_t fModelPersistence
! option to save the trained model in xml file or using serialization
std::map< TString, Double_t > OptimizeAllMethods(TString fomType="ROCIntegral", TString fitType="FitGA")
Iterates through all booked methods and sees if they use parameter tuning and if so does just that,...
ROCCurve * GetROC(DataLoader *loader, TString theMethodName, UInt_t iClass=0, Types::ETreeType type=Types::kTesting)
Private method to generate a ROCCurve instance for a given method.
TH1F * EvaluateImportanceShort(DataLoader *loader, Types::EMVA theMethod, TString methodTitle, const char *theOption="")
Types::EAnalysisType fAnalysisType
! the training type
Bool_t HasMethod(const TString &datasetname, const TString &title) const
Checks whether a given method name is defined for a given dataset.
TGraph * GetROCCurve(DataLoader *loader, TString theMethodName, Bool_t setTitles=kTRUE, UInt_t iClass=0, Types::ETreeType type=Types::kTesting)
Argument iClass specifies the class to generate the ROC curve in a multiclass setting.
TH1F * EvaluateImportanceAll(DataLoader *loader, Types::EMVA theMethod, TString methodTitle, const char *theOption="")
void SetVerbose(Bool_t v=kTRUE)
TFile * fgTargetFile
! ROOT output file
IMethod * GetMethod(const TString &datasetname, const TString &title) const
Returns pointer to MVA that corresponds to given method title.
void DeleteAllMethods(void)
Delete methods.
TString fTransformations
! list of transformations to test
void Greetings()
Print welcome message.
Interface for all concrete MVA method implementations.
virtual void PrintHelpMessage() const =0
virtual Bool_t HasAnalysisType(Types::EAnalysisType type, UInt_t numberClasses, UInt_t numberTargets)=0
virtual void MakeClass(const TString &classFileName=TString("")) const =0
Virtual base Class for all MVA method.
void PrintHelpMessage() const override
prints out method-specific help method
virtual Double_t GetSeparation(TH1 *, TH1 *) const
compute "separation" defined as
const char * GetName() const override
void SetSilentFile(Bool_t status)
void SetWeightFileDir(TString fileDir)
set directory of weight file
virtual void TestRegression(Double_t &bias, Double_t &biasT, Double_t &dev, Double_t &devT, Double_t &rms, Double_t &rmsT, Double_t &mInf, Double_t &mInfT, Double_t &corr, Types::ETreeType type)
calculate <sum-of-deviation-squared> of regression output versus "true" value from test sample
virtual void DeclareCompatibilityOptions()
options that are used ONLY for the READER to ensure backward compatibility they are hence without any...
TString GetMethodTypeName() const
Bool_t DoMulticlass() const
virtual Double_t GetSignificance() const
compute significance of mean difference
Types::EAnalysisType GetAnalysisType() const
virtual TMatrixD GetMulticlassConfusionMatrix(Double_t effB, Types::ETreeType type)
Construct a confusion matrix for a multiclass classifier.
virtual void WriteEvaluationHistosToFile(Types::ETreeType treetype)
writes all MVA evaluation histograms to file
virtual void TestMulticlass()
test multiclass classification
void SetupMethod()
setup of methods
virtual Double_t GetEfficiency(const TString &, Types::ETreeType, Double_t &err)
fill background efficiency (resp.
virtual void SetAnalysisType(Types::EAnalysisType type)
const TString & GetMethodName() const
Bool_t DoRegression() const
void ProcessSetup()
process all options the "CheckForUnusedOptions" is done in an independent call, since it may be overr...
virtual Double_t GetTrainingEfficiency(const TString &)
DataSetInfo & DataInfo() const
virtual void TestClassification()
initialization
void AddOutput(Types::ETreeType type, Types::EAnalysisType analysisType)
void MakeClass(const TString &classFileName=TString("")) const override
create reader class for method (classification only at present)
void ReadStateFromFile()
Function to write options and weights to file.
virtual std::map< TString, Double_t > OptimizeTuningParameters(TString fomType="ROCIntegral", TString fitType="FitGA")
call the Optimizer with the set of parameters and ranges that are meant to be tuned.
DataSetInfo & fDataSetInfo
! the data set information (sometimes needed)
Types::EMVA GetMethodType() const
void SetFile(TFile *file)
void SetModelPersistence(Bool_t status)
virtual Double_t GetROCIntegral(TH1D *histS, TH1D *histB) const
calculate the area (integral) under the ROC curve as a overall quality measure of the classification
virtual void CheckSetup()
check may be overridden by derived class (sometimes, eg, fitters are used which can only be implement...
Class for boosting a TMVA method.
void SetBoostedMethodName(TString methodName)
DataSetManager * fDataSetManager
DSMTEST.
Class for categorizing the phase space.
DataSetManager * fDataSetManager
ostringstream derivative to redirect and format output
void SetMinType(EMsgType minType)
void SetSource(const std::string &source)
static void InhibitOutput()
Double_t GetEffSForEffB(Double_t effB, const UInt_t num_points=41)
Calculate the signal efficiency (sensitivity) for a given background efficiency (sensitivity).
Double_t GetROCIntegral(const UInt_t points=41)
Calculates the ROC integral (AUC)
TGraph * GetROCCurve(const UInt_t points=100)
Returns a new TGraph containing the ROC curve.
Ranking for variables in method (implementation)
virtual void Print() const
get maximum length of variable names
Class that is the base-class for a vector of result.
Class which takes the results of a multiclass classification.
Class that is the base-class for a vector of result.
Singleton class for Global types used by TMVA.
static Types & Instance()
The single instance of "Types" if existing already, or create it (Singleton)
const TString & GetLabel() const
A TMultiGraph is a collection of TGraph (or derived) objects.
TList * GetListOfGraphs() const
virtual void Add(TGraph *graph, Option_t *chopt="")
Add a new graph to the list of graphs.
TH1F * GetHistogram()
Returns a pointer to the histogram used to draw the axis.
void Draw(Option_t *chopt="") override
Draw this multigraph with its current attributes.
TAxis * GetYaxis()
Get y axis of the graph.
TAxis * GetXaxis()
Get x axis of the graph.
TObject * Clone(const char *newname="") const override
Make a clone of an object using the Streamer facility.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
const char * GetName() const override
Returns name of object.
virtual const char * GetName() const
Returns name of object.
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
Write this object to the current directory.
@ kOverwrite
overwrite existing object with same name
void SetGrid(Int_t valuex=1, Int_t valuey=1) override
TLegend * BuildLegend(Double_t x1=0.3, Double_t y1=0.21, Double_t x2=0.3, Double_t y2=0.21, const char *title="", Option_t *option="") override
Build a legend from the graphical objects in the pad.
Principal Components Analysis (PCA)
virtual void AddRow(const Double_t *x)
Add a data point and update the covariance matrix.
const TMatrixD * GetCovarianceMatrix() const
Return the covariance matrix.
virtual void MakePrincipals()
Perform the principal components analysis.
Random number generator class based on M.
virtual UInt_t Integer(UInt_t imax)
Returns a random integer uniformly distributed on the interval [ 0, imax-1 ].
void ToLower()
Change string to lower-case.
int CompareTo(const char *cs, ECaseCompare cmp=kExact) const
Compare a string to char *cs2.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
void SetTitleXOffset(Float_t offset=1)
virtual int MakeDirectory(const char *name)
Make a directory.
Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0) override
Write this object to the current directory.
void DataLoaderCopy(TMVA::DataLoader *des, TMVA::DataLoader *src)
void CreateVariableTransforms(const TString &trafoDefinition, TMVA::DataSetInfo &dataInfo, TMVA::TransformationHandler &transformationHandler, TMVA::MsgLogger &log)
MsgLogger & Endl(MsgLogger &ml)
static uint64_t sum(uint64_t i)
const Int_t MinNoTrainingEvents