00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <vector>
00029
00030 #include "TMVA/ResultsRegression.h"
00031 #include "TMVA/MsgLogger.h"
00032 #include "TMVA/DataSet.h"
00033
00034
00035 TMVA::ResultsRegression::ResultsRegression( const DataSetInfo* dsi )
00036 : Results( dsi ),
00037 fLogger( new MsgLogger("ResultsRegression", kINFO) )
00038 {
00039
00040 }
00041
00042
00043 TMVA::ResultsRegression::~ResultsRegression()
00044 {
00045
00046 delete fLogger;
00047 }
00048
00049
00050 void TMVA::ResultsRegression::SetValue( std::vector<Float_t>& value, Int_t ievt )
00051 {
00052 if (ievt >= (Int_t)fRegValues.size()) fRegValues.resize( ievt+1 );
00053 fRegValues[ievt] = value;
00054 }
00055
00056
00057 TH1F* TMVA::ResultsRegression::QuadraticDeviation( UInt_t tgtNum , Bool_t truncate, Double_t truncvalue )
00058 {
00059 DataSet* ds = GetDataSet();
00060 ds->SetCurrentType( GetTreeType() );
00061 const DataSetInfo* dsi = GetDataSetInfo();
00062 TString name( Form("tgt_%d",tgtNum) );
00063 VariableInfo vinf = dsi->GetTargetInfo(tgtNum);
00064 Float_t xmin=0., xmax=0.;
00065 if (truncate){
00066 xmax = truncvalue;
00067 }
00068 else{
00069 for (Int_t ievt=0; ievt<ds->GetNEvents(); ievt++) {
00070 Event* ev = ds->GetEvent(ievt);
00071 std::vector<Float_t> regVal = fRegValues.at(ievt);
00072 Float_t val = regVal.at( tgtNum ) - ev->GetTarget( tgtNum );
00073 val *= val;
00074 xmax = val> xmax? val: xmax;
00075 }
00076 }
00077 xmax *= 1.1;
00078 Int_t nbins = 500;
00079 TH1F* h = new TH1F( name, name, nbins, xmin, xmax);
00080 h->SetDirectory(0);
00081 h->GetXaxis()->SetTitle("Quadratic Deviation");
00082 h->GetYaxis()->SetTitle("Weighted Entries");
00083
00084 for (Int_t ievt=0; ievt<ds->GetNEvents(); ievt++) {
00085 Event* ev = ds->GetEvent(ievt);
00086 std::vector<Float_t> regVal = fRegValues.at(ievt);
00087 Float_t val = regVal.at( tgtNum ) - ev->GetTarget( tgtNum );
00088 val *= val;
00089 Float_t weight = ev->GetWeight();
00090 if (!truncate || val<=truncvalue ) h->Fill( val, weight);
00091 }
00092 return h;
00093 }
00094
00095
00096 TH2F* TMVA::ResultsRegression::DeviationAsAFunctionOf( UInt_t varNum, UInt_t tgtNum )
00097 {
00098 DataSet* ds = GetDataSet();
00099 ds->SetCurrentType( GetTreeType() );
00100
00101 TString name( Form("tgt_%d_var_%d",tgtNum, varNum) );
00102 const DataSetInfo* dsi = GetDataSetInfo();
00103 Float_t xmin, xmax;
00104 Bool_t takeTargets = kFALSE;
00105 if (varNum >= dsi->GetNVariables()) {
00106 takeTargets = kTRUE;
00107 varNum -= dsi->GetNVariables();
00108 }
00109 if (!takeTargets) {
00110 VariableInfo vinf = dsi->GetVariableInfo(varNum);
00111 xmin = vinf.GetMin();
00112 xmax = vinf.GetMax();
00113
00114 for (Int_t ievt=0; ievt<ds->GetNEvents(); ievt++) {
00115 Event* ev = ds->GetEvent(ievt);
00116 Float_t val = ev->GetValue(varNum);
00117
00118 if (val < xmin ) xmin = val;
00119 if (val > xmax ) xmax = val;
00120 }
00121
00122 }
00123 else {
00124 VariableInfo vinf = dsi->GetTargetInfo(varNum);
00125 xmin = vinf.GetMin();
00126 xmax = vinf.GetMax();
00127
00128 for (Int_t ievt=0; ievt<ds->GetNEvents(); ievt++) {
00129 Event* ev = ds->GetEvent(ievt);
00130 Float_t val = ev->GetTarget(varNum);
00131
00132 if (val < xmin ) xmin = val;
00133 if (val > xmax ) xmax = val;
00134 }
00135 }
00136
00137 Float_t ymin = FLT_MAX;
00138 Float_t ymax = -FLT_MAX;
00139
00140 for (Int_t ievt=0; ievt<ds->GetNEvents(); ievt++) {
00141 Event* ev = ds->GetEvent(ievt);
00142 std::vector<Float_t> regVal = fRegValues.at(ievt);
00143
00144 Float_t diff = regVal.at( tgtNum ) - ev->GetTarget( tgtNum );
00145 if (diff < ymin ) ymin = diff;
00146 if (diff > ymax ) ymax = diff;
00147 }
00148
00149 Int_t nxbins = 50;
00150 Int_t nybins = 50;
00151
00152 Float_t epsilon = TMath::Abs(xmax-xmin)/((Float_t)nxbins-1);
00153 xmin -= 1.01*epsilon;
00154 xmax += 1.01*epsilon;
00155
00156 epsilon = (ymax-ymin)/((Float_t)nybins-1);
00157 ymin -= 1.01*epsilon;
00158 ymax += 1.01*epsilon;
00159
00160
00161 TH2F* h = new TH2F( name, name, nxbins, xmin, xmax, nybins, ymin, ymax );
00162 h->SetDirectory(0);
00163
00164 h->GetXaxis()->SetTitle( (takeTargets ? dsi->GetTargetInfo(varNum).GetTitle() : dsi->GetVariableInfo(varNum).GetTitle() ) );
00165 TString varName( dsi->GetTargetInfo(tgtNum).GetTitle() );
00166 TString yName( varName+TString("_{regression} - ") + varName+TString("_{true}") );
00167 h->GetYaxis()->SetTitle( yName );
00168
00169 for (Int_t ievt=0; ievt<ds->GetNEvents(); ievt++) {
00170 Event* ev = ds->GetEvent(ievt);
00171 std::vector<Float_t> regVal = fRegValues.at(ievt);
00172
00173 Float_t xVal = (takeTargets?ev->GetTarget( varNum ):ev->GetValue( varNum ));
00174 Float_t yVal = regVal.at( tgtNum ) - ev->GetTarget( tgtNum );
00175
00176 h->Fill( xVal, yVal );
00177 }
00178
00179 return h;
00180 }
00181
00182
00183 void TMVA::ResultsRegression::CreateDeviationHistograms( TString prefix )
00184 {
00185 Log() << kINFO << "Create variable histograms" << Endl;
00186 const DataSetInfo* dsi = GetDataSetInfo();
00187
00188 for (UInt_t ivar = 0; ivar < dsi->GetNVariables(); ivar++) {
00189 for (UInt_t itgt = 0; itgt < dsi->GetNTargets(); itgt++) {
00190 TH2F* h = DeviationAsAFunctionOf( ivar, itgt );
00191 TString name( Form("%s_reg_var%d_rtgt%d",prefix.Data(),ivar,itgt) );
00192 h->SetName( name );
00193 h->SetTitle( name );
00194 Store( h );
00195 }
00196 }
00197 Log() << kINFO << "Create regression target histograms" << Endl;
00198 for (UInt_t ivar = 0; ivar < dsi->GetNTargets(); ivar++) {
00199 for (UInt_t itgt = 0; itgt < dsi->GetNTargets(); itgt++) {
00200 TH2F* h = DeviationAsAFunctionOf( dsi->GetNVariables()+ivar, itgt );
00201 TString name( Form("%s_reg_tgt%d_rtgt%d",prefix.Data(),ivar,itgt) );
00202 h->SetName( name );
00203 h->SetTitle( name );
00204 Store( h );
00205 }
00206 }
00207
00208 Log() << kINFO << "Create regression average deviation" << Endl;
00209 for (UInt_t itgt = 0; itgt < dsi->GetNTargets(); itgt++) {
00210 TH1F* h = QuadraticDeviation(itgt);
00211 TString name( Form("%s_Quadr_Deviation_target_%d_",prefix.Data(),itgt) );
00212 h->SetName( name );
00213 h->SetTitle( name );
00214 Double_t yq[1], xq[]={0.9};
00215 h->GetQuantiles(1,yq,xq);
00216 Store( h );
00217
00218 TH1F* htrunc = QuadraticDeviation(itgt, true, yq[0]);
00219 TString name2( Form("%s_Quadr_Dev_best90perc_target_%d_",prefix.Data(),itgt) );
00220 htrunc->SetName( name2 );
00221 htrunc->SetTitle( name2 );
00222 Store( htrunc );
00223 }
00224 Log() << kINFO << "Results created" << Endl;
00225 }