Ejemplo n.º 1
0
/*
  The following shows how to apply a PCA transformation to a subset 
  of input variables.

  You need to prepare tmva_subset_root.pat. Copy tmva_root.pat and
  remove var2 on the Leaves: line. This will force the reader to read
  in only 3 variables: var1, var3, and var4.

  After you plot the results, you can see that only variables 
  var1, var3 and var4 have been decorrelated. Variable var2 shows
  substantial correlation with others.
*/
int spr_transform_2()
{
  // load lib
  gSystem->Load("/afs/cern.ch/user/n/narsky/w0/CMSSW_1_8_X_2007-11-09-0200/lib/slc4_ia32_gcc345/libPhysicsToolsStatPatternRecognition.so");
  
  // create main SPR object
  SprRootAdapter spr;

  // load training data
  spr.loadDataFromRoot("tmva_subset_root.pat","train");

  // split data into train/test
  spr.split(0.5,true);
  
  // choose classes
  spr.chooseClasses("0:1");
  
  // show how much data we have
  const int nClasses = spr.nClasses();
  char classes[nClasses][200];
  int events [nClasses];
  double weights [nClasses];
  spr.showDataInClasses(classes,events,weights,"train");
  plotClasses("SPR_Class_1","train",nClasses,classes,events,weights);
  spr.showDataInClasses(classes,events,weights,"test");
  plotClasses("SPR_Class_2","test",nClasses,classes,events,weights);

  // perform PCA
  int verbose = 0;
  spr.trainVarTransformer("PCA",verbose);
  spr.saveVarTransformer("pca.spr");

  // reload training and test data, now with all variables included
  spr.loadDataFromRoot("tmva_root.pat","train");
  spr.split(0.5,true);
  spr.chooseClasses("0:1");

  // compute correlations between variables before PCA transform
  const unsigned dim = spr.dim();
  double corr [dim*dim];
  char vars[dim][200];
  spr.vars(vars);
  spr.correlation(0,corr,"train");// background
  plotCorrelation("SPR_1B","background",dim,vars,corr);
  spr.correlation(1,corr,"train");// signal
  plotCorrelation("SPR_1S","signal",dim,vars,corr);

  // apply PCA transform
  spr.transform();

  // Plot correlations after PCA transform.
  spr.vars(vars);
  spr.correlation(0,corr,"train");// background
  plotCorrelation("SPR_2B","decorrelated background",dim,vars,corr);
  spr.correlation(1,corr,"train");// signal
  plotCorrelation("SPR_2S","decorrelated signal",dim,vars,corr);

  // exit
  return 0;
}
Ejemplo n.º 2
0
int spr_transform_1()
{
  // load lib
  gSystem->Load("/afs/cern.ch/user/n/narsky/w0/CMSSW_1_8_X_2007-11-29-1600/lib/slc4_ia32_gcc345/libPhysicsToolsStatPatternRecognition.so");
  
  // create main SPR object
  SprRootAdapter spr;

  // load training data
  spr.loadDataFromRoot("tmva_root.pat","train");

  // split data into train/test
  spr.split(0.5,true);
  
  // choose classes
  spr.chooseClasses("0:1");
  
  // show how much data we have
  const int nClasses = spr.nClasses();
  char classes[nClasses][200];
  int events [nClasses];
  double weights [nClasses];
  spr.showDataInClasses(classes,events,weights,"train");
  plotClasses("SPR_Class_1","train",nClasses,classes,events,weights);
  spr.showDataInClasses(classes,events,weights,"test");
  plotClasses("SPR_Class_2","test",nClasses,classes,events,weights);

  // compute correlations between variables
  const unsigned dim = spr.dim();
  double corr [dim*dim];
  char vars[dim][200];
  spr.vars(vars);
  spr.correlation(0,corr,"train");// background
  plotCorrelation("SPR_1B","background",dim,vars,corr);
  spr.correlation(1,corr,"train");// signal
  plotCorrelation("SPR_1S","signal",dim,vars,corr);

  // save original test data
  spr.saveTestData("test_orig.root");

  // perform PCA
  int verbose = 0;
  spr.trainVarTransformer("PCA",verbose);
  spr.transform();

  // Plot correlations after PCA transform.
  // Note that PCA transform does not change dimensionality.
  // But it changes variable names!
  spr.vars(vars);
  spr.correlation(0,corr,"train");// background
  plotCorrelation("SPR_2B","decorrelated background",dim,vars,corr);
  spr.correlation(1,corr,"train");// signal
  plotCorrelation("SPR_2S","decorrelated signal",dim,vars,corr);

  // save transformer to a file for future reference
  spr.saveVarTransformer("pca.spr");

  // select classifiers
  spr.addBoostedBinarySplits("splits",100,20);

  // train
  spr.train(verbose);
  
  // test
  spr.test();
  
  // get signal-vs-background curve for classifiers
  const int npts = 9;
  double signalEff [npts] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 };
  const int ntrained = spr.nTrained();
  double bgrndEff [npts*ntrained];
  double bgrndErr [npts*ntrained];
  double fom [npts*ntrained];
  char classifiers[ntrained][200];
  spr.allEffCurves(npts,signalEff,classifiers,bgrndEff,bgrndErr,fom);
  plotEffCurveMulti("SPR_3",ntrained,npts,signalEff,
		    classifiers,bgrndEff,bgrndErr,0);
  
  // save transformed test data with classifier responses
  spr.saveTestData("test_transformed.root");

  // exit
  return 0;
}