PLearn 0.1
Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Static Protected Member Functions | Protected Attributes | Private Types | Private Member Functions | Private Attributes
PLearn::BinaryStump Class Reference

#include <BinaryStump.h>

Inheritance diagram for PLearn::BinaryStump:
Inheritance graph
[legend]
Collaboration diagram for PLearn::BinaryStump:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 BinaryStump ()
 Default constructor.
virtual void build ()
 Simply calls inherited::build() then build_().
virtual void makeDeepCopyFromShallowCopy (CopiesMap &copies)
 Transforms a shallow copy into a deep copy.
virtual string classname () const
virtual OptionListgetOptionList () const
virtual OptionMapgetOptionMap () const
virtual RemoteMethodMapgetRemoteMethodMap () const
virtual BinaryStumpdeepCopy (CopiesMap &copies) const
virtual int outputsize () const
 Returns the size of this learner's output, (which typically may depend on its inputsize(), targetsize() and set options).
virtual void forget ()
 (Re-)initializes the PLearner in its fresh state (that state may depend on the 'seed' option) And sets 'stage' back to 0 (this is the stage of a fresh learner!).
virtual void train ()
 The role of the train method is to bring the learner up to stage==nstages, updating the train_stats collector with training costs measured on-line in the process.
virtual void computeOutput (const Vec &input, Vec &output) const
 Computes the output from the input.
virtual void computeCostsFromOutputs (const Vec &input, const Vec &output, const Vec &target, Vec &costs) const
 Computes the costs from already computed output.
virtual TVec< string > getTestCostNames () const
 Returns the names of the costs computed by computeCostsFromOutpus (and thus the test method).
virtual TVec< string > getTrainCostNames () const
 Returns the names of the objective costs that the train method computes and for which it updates the VecStatsCollector train_stats.

Static Public Member Functions

static string _classname_ ()
static OptionList_getOptionList_ ()
static RemoteMethodMap_getRemoteMethodMap_ ()
static Object_new_instance_for_typemap_ ()
static bool _isa_ (const Object *o)
static void _static_initialize_ ()
static const PPathdeclaringFile ()

Public Attributes

bool one_hot_output

Static Public Attributes

static StaticInitializer _static_initializer_

Static Protected Member Functions

static void declareOptions (OptionList &ol)
 Declares this class' options.

Protected Attributes

int feature
int tag
real threshold

Private Types

typedef PLearner inherited

Private Member Functions

void build_ ()
 This does the actual building.

Private Attributes

TVec< pair< int, real > > sf

Detailed Description

Definition at line 52 of file BinaryStump.h.


Member Typedef Documentation

Reimplemented from PLearn::PLearner.

Definition at line 57 of file BinaryStump.h.


Constructor & Destructor Documentation

PLearn::BinaryStump::BinaryStump ( )

Default constructor.

Definition at line 130 of file BinaryStump.cc.

                        :
    feature(0),
    tag(0),
    threshold(0),
    one_hot_output(false)
{}

Member Function Documentation

string PLearn::BinaryStump::_classname_ ( ) [static]

Reimplemented from PLearn::PLearner.

Definition at line 145 of file BinaryStump.cc.

OptionList & PLearn::BinaryStump::_getOptionList_ ( ) [static]

Reimplemented from PLearn::PLearner.

Definition at line 145 of file BinaryStump.cc.

RemoteMethodMap & PLearn::BinaryStump::_getRemoteMethodMap_ ( ) [static]

Reimplemented from PLearn::PLearner.

Definition at line 145 of file BinaryStump.cc.

bool PLearn::BinaryStump::_isa_ ( const Object o) [static]

Reimplemented from PLearn::PLearner.

Definition at line 145 of file BinaryStump.cc.

Object * PLearn::BinaryStump::_new_instance_for_typemap_ ( ) [static]

Reimplemented from PLearn::Object.

Definition at line 145 of file BinaryStump.cc.

StaticInitializer BinaryStump::_static_initializer_ & PLearn::BinaryStump::_static_initialize_ ( ) [static]

Reimplemented from PLearn::PLearner.

Definition at line 145 of file BinaryStump.cc.

void PLearn::BinaryStump::build ( ) [virtual]

Simply calls inherited::build() then build_().

Reimplemented from PLearn::PLearner.

Definition at line 172 of file BinaryStump.cc.

References PLearn::PLearner::build(), and build_().

Here is the call graph for this function:

void PLearn::BinaryStump::build_ ( ) [private]

This does the actual building.

Reimplemented from PLearn::PLearner.

Definition at line 170 of file BinaryStump.cc.

Referenced by build().

{}

Here is the caller graph for this function:

string PLearn::BinaryStump::classname ( ) const [virtual]

Reimplemented from PLearn::Object.

Definition at line 145 of file BinaryStump.cc.

void PLearn::BinaryStump::computeCostsFromOutputs ( const Vec input,
const Vec output,
const Vec target,
Vec costs 
) const [virtual]

Computes the costs from already computed output.

Implements PLearn::PLearner.

Definition at line 409 of file BinaryStump.cc.

References PLearn::argmin(), PLearn::fast_exact_is_equal(), PLearn::is_equal(), one_hot_output, PLERROR, and PLearn::TVec< T >::resize().

{
    costs.resize(1);

    if(!fast_exact_is_equal(target[0], 0) &&
       !fast_exact_is_equal(target[0], 1))
        PLERROR("In BinaryStump:computeCostsFromOutputs() : "
                "target should be either 1 or 0");

    real predict = one_hot_output ? argmin(output) : output[0];
    costs[0] = !is_equal(predict, target[0]); 
}                                

Here is the call graph for this function:

void PLearn::BinaryStump::computeOutput ( const Vec input,
Vec output 
) const [virtual]

Computes the output from the input.

Reimplemented from PLearn::PLearner.

Definition at line 395 of file BinaryStump.cc.

References feature, one_hot_output, outputsize(), PLearn::TVec< T >::resize(), tag, and threshold.

{
    output.resize(outputsize());
    int predict = input[feature] < threshold ? tag : 1 - tag;
    if (one_hot_output) {
        output[predict] = 1;
        output[1 - predict] = 0;
    } else
        output[0] = predict;
}    

Here is the call graph for this function:

void PLearn::BinaryStump::declareOptions ( OptionList ol) [static, protected]

Declares this class' options.

Reimplemented from PLearn::PLearner.

Definition at line 150 of file BinaryStump.cc.

References PLearn::OptionBase::buildoption, PLearn::declareOption(), PLearn::PLearner::declareOptions(), feature, PLearn::OptionBase::learntoption, one_hot_output, tag, and threshold.

{
    declareOption(ol, "one_hot_output", &BinaryStump::one_hot_output,
                  OptionBase::buildoption,
        "If set to 1, the output will be a two-dimensional one-hot vector\n"
        "instead of just a single number.");

    declareOption(ol, "feature", &BinaryStump::feature, OptionBase::learntoption,
                  "Feature tested by the stump");

    declareOption(ol, "threshold", &BinaryStump::threshold, 
                  OptionBase::learntoption,
                  "Threshold for decision");

    declareOption(ol, "tag", &BinaryStump::tag, OptionBase::learntoption,
                  "Tag assigned when feature is lower than the threshold");

    inherited::declareOptions(ol);
}

Here is the call graph for this function:

static const PPath& PLearn::BinaryStump::declaringFile ( ) [inline, static]

Reimplemented from PLearn::PLearner.

Definition at line 120 of file BinaryStump.h.

BinaryStump * PLearn::BinaryStump::deepCopy ( CopiesMap copies) const [virtual]

Reimplemented from PLearn::PLearner.

Definition at line 145 of file BinaryStump.cc.

void PLearn::BinaryStump::forget ( ) [virtual]

(Re-)initializes the PLearner in its fresh state (that state may depend on the 'seed' option) And sets 'stage' back to 0 (this is the stage of a fresh learner!).

Reimplemented from PLearn::PLearner.

Definition at line 202 of file BinaryStump.cc.

References feature, PLearn::PLearner::stage, tag, and threshold.

{
    stage = 0;
    feature = 0;
    tag = 0;
    threshold = 0;
}
OptionList & PLearn::BinaryStump::getOptionList ( ) const [virtual]

Reimplemented from PLearn::Object.

Definition at line 145 of file BinaryStump.cc.

OptionMap & PLearn::BinaryStump::getOptionMap ( ) const [virtual]

Reimplemented from PLearn::Object.

Definition at line 145 of file BinaryStump.cc.

RemoteMethodMap & PLearn::BinaryStump::getRemoteMethodMap ( ) const [virtual]

Reimplemented from PLearn::Object.

Definition at line 145 of file BinaryStump.cc.

TVec< string > PLearn::BinaryStump::getTestCostNames ( ) const [virtual]

Returns the names of the costs computed by computeCostsFromOutpus (and thus the test method).

Implements PLearn::PLearner.

Definition at line 426 of file BinaryStump.cc.

References getTrainCostNames().

{
    return getTrainCostNames();
}

Here is the call graph for this function:

TVec< string > PLearn::BinaryStump::getTrainCostNames ( ) const [virtual]

Returns the names of the objective costs that the train method computes and for which it updates the VecStatsCollector train_stats.

Implements PLearn::PLearner.

Definition at line 434 of file BinaryStump.cc.

References PLearn::TVec< T >::append(), and PLearn::TVec< T >::isEmpty().

Referenced by getTestCostNames().

{
    static TVec<string> costs;
    if (costs.isEmpty())
        costs.append("binary_class_error");
    return costs;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void PLearn::BinaryStump::makeDeepCopyFromShallowCopy ( CopiesMap copies) [virtual]

Transforms a shallow copy into a deep copy.

Reimplemented from PLearn::PLearner.

Definition at line 182 of file BinaryStump.cc.

References PLearn::PLearner::makeDeepCopyFromShallowCopy().

Here is the call graph for this function:

int PLearn::BinaryStump::outputsize ( ) const [virtual]

Returns the size of this learner's output, (which typically may depend on its inputsize(), targetsize() and set options).

Implements PLearn::PLearner.

Definition at line 191 of file BinaryStump.cc.

References one_hot_output.

Referenced by computeOutput().

{
    if (one_hot_output)
        return 2;
    else
        return 1;
}

Here is the caller graph for this function:

void PLearn::BinaryStump::train ( ) [virtual]

The role of the train method is to bring the learner up to stage==nstages, updating the train_stats collector with training costs measured on-line in the process.

Implements PLearn::PLearner.

Definition at line 213 of file BinaryStump.cc.

References d, PLearn::endl(), PLearn::fast_exact_is_equal(), feature, PLearn::TVec< T >::fill(), PLearn::TVec< T >::first(), i, PLearn::PLearner::inputsize(), PLearn::PLearner::inputsize_, j, PLearn::TVec< T >::length(), PLearn::VMat::length(), n, PLERROR, PLearn::qsort_vec(), PLearn::PLearner::report_progress, PLearn::TVec< T >::resize(), PLearn::safeflog(), sf, tag, PLearn::PLearner::targetsize_, threshold, PLearn::PLearner::train_set, PLearn::PLearner::train_stats, and PLearn::PLearner::verbosity.

{

    if(!train_set)
        PLERROR("In BinaryStump:train() : train_set not specified");

    if(!train_stats)  // make a default stats collector, in case there's none
        train_stats = new VecStatsCollector();
    train_stats->forget();

    int n = train_set->length();
    sf.resize(n);
    //static Vec input; input.resize(inputsize());
    //static Vec target; target.resize(targetsize());
    real input;
    //real weight;
    Vec train_target(n);
    TVec< pair<int,int> > buffer((int)(n*safeflog(n)));

    static Vec example_weights; example_weights.resize(n);

    // Extracting weights
    if(train_set->weightsize() > 0)
    {
        for (int i=0; i<n; ++i) 
        {
            //train_set->getExample(i, input, target, weight);
            //example_weights[i]=weight;
            example_weights[i]= train_set->get(i,inputsize_+targetsize_);
        }
    }
    else
    {
        example_weights.fill(1.0/n);
    }

    for (int i=0; i<n; ++i) 
    {
        train_target[i]= train_set->get(i,inputsize_);
        if(!fast_exact_is_equal(train_target[i], 0) &&
           !fast_exact_is_equal(train_target[i], 1))
            PLERROR("In BinaryStump:train() : target should be either 1 or 0");
    }

    // Choosing best stump

    real best_error = 0;

    {
        real w_sum_1 = 0;
        real w_sum_error = 0;
        real w_sum = 0;

        for(int i=0; i<n; i++)
        {
            w_sum += example_weights[i];
            //train_set->getExample(i,input,target,weight);
            //if(target[0] == 1)
            if(fast_exact_is_equal(train_target[i], 1))
                w_sum_1 += example_weights[i];
        }

        if(w_sum_1 > w_sum - w_sum_1)
        {
            tag = 0;
            w_sum_error = w_sum - w_sum_1;
        }
        else
        {
            tag = 1;
            w_sum_error = w_sum_1;
        }
  
        best_error = w_sum_error;

        // We choose as the first stump to consider, the stump that classifies
        // in the most frequent class
        // every points which have their first coordinate greater than
        // the smallest value for this coordinate in the training set MINUS ONE.
        // This approximatly corresponds to classify any points to the most
        // frequent class.

        feature = 0;
        threshold = sf[0].second-1;  // TODO Why? (done below already?)
        PP<ProgressBar> pb;
        if(report_progress)
            pb = new ProgressBar("Finding best stump",inputsize()*sf.length());
        int prog = 0;
        for(int d=0; d<inputsize(); d++)
        {

            // Copying input
            for(int j=0; j<n; j++)
            {
                //train_set->getExample(j,input, target, weight);
                input = train_set->get(j,d);
                //if(target[0] != 0 & target[0] != 1)
                sf[j].first = j;
                //sf[j].second = input[d];
                sf[j].second = input;
            }
      

      
            // Sorting features
            //for(int i=0; i<sf.length();i++)
            qsort_vec(sf,buffer);
      
            if(d==0) { // initialize threshold
                threshold = sf[0].second-1; 
                DBG_MODULE_LOG << "Initializing threshold <- " << threshold <<
                    endl;
            }

            real w_sum_l_1 = 0;
            real w_sum_l = 0;

            for(int i=0; i<sf.length()-1; i++)
            {

                real f1 = sf[i].second;
                real f2 = sf[i+1].second;

                //train_set->getExample(sf[i].first,input,target,weight);
                //target = train_set->getExample(sf[i].first,inputsize_);
                //real classe = target[0];
                real classe = train_target[sf[i].first];
                if(fast_exact_is_equal(classe, 1))
                    w_sum_l_1+=example_weights[sf[i].first];
                w_sum_l += example_weights[sf[i].first];

                if(fast_exact_is_equal(f1, f2))
                    continue;

                real w_sum_error_1 = w_sum_l - w_sum_l_1 + w_sum_1 - w_sum_l_1;
                real c_w_sum_error = 0;
                if(w_sum_error_1 > w_sum - w_sum_error_1)
                {
                    c_w_sum_error = w_sum - w_sum_error_1;
        
                }
                else
                {
                    c_w_sum_error = w_sum_error_1;
                }
      
                // We choose the first stump that minimizes the
                // weighted error.
                if (best_error > c_w_sum_error)
                {
                    best_error = c_w_sum_error;
          
                    tag = w_sum_error_1 > w_sum - w_sum_error_1 ? 0 : 1;
                    threshold = (f1+f2)/2;
                    DBG_MODULE_LOG << "Updating treshold <- " << threshold <<
                        " (c_w_sum_error = " << c_w_sum_error <<
                        ", best_error = " << best_error << ")" << endl;

                    feature = d;
                } else {
                    DBG_MODULE_LOG << "No update (c_w_sum_error = " <<
                        c_w_sum_error << ", best_error = " << best_error << ")"
                        << endl;
                }
            }
            prog++;
            if(report_progress) pb->update(prog);
        }
    }
  
    Vec costs(1); costs[0] = best_error;
    train_stats->update(costs);
    train_stats->finalize();
    if(verbosity > 1)
        cout << "Weighted error = " << best_error << endl;
    sf = TVec< pair<int, real> >(0);
}

Here is the call graph for this function:


Member Data Documentation

Reimplemented from PLearn::PLearner.

Definition at line 120 of file BinaryStump.h.

Definition at line 66 of file BinaryStump.h.

Referenced by computeOutput(), declareOptions(), forget(), and train().

Definition at line 76 of file BinaryStump.h.

Referenced by computeCostsFromOutputs(), computeOutput(), declareOptions(), and outputsize().

TVec< pair<int, real> > PLearn::BinaryStump::sf [private]

Definition at line 58 of file BinaryStump.h.

Referenced by train().

Definition at line 67 of file BinaryStump.h.

Referenced by computeOutput(), declareOptions(), forget(), and train().

Definition at line 68 of file BinaryStump.h.

Referenced by computeOutput(), declareOptions(), forget(), and train().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines