|
|
@ -19,6 +19,7 @@ limitations under the License. */
|
|
|
|
#include "paddle/parameter/Argument.h"
|
|
|
|
#include "paddle/parameter/Argument.h"
|
|
|
|
#include "paddle/pserver/ParameterClient2.h"
|
|
|
|
#include "paddle/pserver/ParameterClient2.h"
|
|
|
|
#include "paddle/utils/ClassRegistrar.h"
|
|
|
|
#include "paddle/utils/ClassRegistrar.h"
|
|
|
|
|
|
|
|
#include "paddle/utils/Error.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace paddle {
|
|
|
|
namespace paddle {
|
|
|
|
|
|
|
|
|
|
|
@ -117,12 +118,105 @@ public:
|
|
|
|
|
|
|
|
|
|
|
|
static ClassRegistrar<Evaluator> registrar_;
|
|
|
|
static ClassRegistrar<Evaluator> registrar_;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief getNames will return all field names of current evaluator.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* The format of name is `evaluator_name.evaluator_fields`. If the evaluator
|
|
|
|
|
|
|
|
* has multiple field, the name could be `evaluator_name.field1`. For example
|
|
|
|
|
|
|
|
* the PrecisionRecallEvaluator contains `precision`, `recall` fields. The get
|
|
|
|
|
|
|
|
* names will return `precision_recall_evaluator.precision`,
|
|
|
|
|
|
|
|
* `precision_recall_evaluator.recal`, etc.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* Also, if current Evaluator is a combined evaluator. getNames will return
|
|
|
|
|
|
|
|
* all names of all evaluators inside the combined evaluator.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param names [out]: the field names of current evaluator.
|
|
|
|
|
|
|
|
* @note Never clear the names parameter inside getNames.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
virtual void getNames(std::vector<std::string>* names) {
|
|
|
|
|
|
|
|
names->push_back(config_.name());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief getValue will return the current evaluate value of one field.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param name: The field name of current evaluator.
|
|
|
|
|
|
|
|
* @param err [out]: The error state.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return The evaluate value(metric).
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
virtual real getValue(const std::string& name, Error* err) const {
|
|
|
|
|
|
|
|
if (name != config_.name()) {
|
|
|
|
|
|
|
|
*err = Error("no such name of evaluator %s", name.c_str());
|
|
|
|
|
|
|
|
return .0f;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return this->getValueImpl();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief getType will return the evaluator type by field name.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* Evaluate Type is the current type of evaluator in string. Such as 'auc',
|
|
|
|
|
|
|
|
* 'precision_recall'. In combined evaluator, different name may get different
|
|
|
|
|
|
|
|
* evaluate type because it could be evaluated by different evaluator inside.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param name: The field name of current Evaluator.
|
|
|
|
|
|
|
|
* @param err: The error state. nullptr means don't care.
|
|
|
|
|
|
|
|
* @return the evaluator type string.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
virtual std::string getType(const std::string& name, Error* err) const {
|
|
|
|
|
|
|
|
if (name != config_.name()) {
|
|
|
|
|
|
|
|
*err = Error("no such name of evaluator %s", name.c_str());
|
|
|
|
|
|
|
|
return std::string();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return this->getTypeImpl();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief getValueImpl The simplest way to define getValue result. If this
|
|
|
|
|
|
|
|
* evaluator doesn't contain multiple fields, and do not throw any error, just
|
|
|
|
|
|
|
|
* implemented this method to get the evaluate result(metric).
|
|
|
|
|
|
|
|
* @return Evaluate result(metric).
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
virtual real getValueImpl() const {
|
|
|
|
|
|
|
|
return numSamples_ != .0 ? totalScore_ / numSamples_ : .0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief getTypeImpl The simplest way to define getType result. If this
|
|
|
|
|
|
|
|
* evaluator doesn't combine many evaluators, the get type should only return
|
|
|
|
|
|
|
|
* itself type.
|
|
|
|
|
|
|
|
* @return Evaluator type.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
virtual std::string getTypeImpl() const { return "base"; }
|
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
protected:
|
|
|
|
EvaluatorConfig config_;
|
|
|
|
EvaluatorConfig config_;
|
|
|
|
double numSamples_;
|
|
|
|
double numSamples_;
|
|
|
|
double totalScore_;
|
|
|
|
double totalScore_;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief The NotGetableEvaluator class is the base class of evaluator that
|
|
|
|
|
|
|
|
* cannot get value in runtime. The most NotGetableEvaluator is Printer
|
|
|
|
|
|
|
|
* Evaluator, which is only used to debug network configuration.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
class NotGetableEvaluator : public Evaluator {
|
|
|
|
|
|
|
|
// Evaluator interface
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
void getNames(std::vector<std::string>* names) {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
real getValue(const std::string& name, Error* err) const {
|
|
|
|
|
|
|
|
*err = Error("Not implemented");
|
|
|
|
|
|
|
|
return .0f;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string getType(const std::string& name, Error* err) const {
|
|
|
|
|
|
|
|
*err = Error("Not implemented");
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class DummyEvaluator : public Evaluator {
|
|
|
|
class DummyEvaluator : public Evaluator {
|
|
|
|
public:
|
|
|
|
public:
|
|
|
|
DummyEvaluator() {}
|
|
|
|
DummyEvaluator() {}
|
|
|
@ -135,6 +229,10 @@ public:
|
|
|
|
}
|
|
|
|
}
|
|
|
|
virtual void finish() {}
|
|
|
|
virtual void finish() {}
|
|
|
|
virtual void printStats(std::ostream&) const {}
|
|
|
|
virtual void printStats(std::ostream&) const {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Evaluator interface
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
std::string getTypeImpl() const;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @brief evaluate AUC using colIdx-th column as prediction.
|
|
|
|
* @brief evaluate AUC using colIdx-th column as prediction.
|
|
|
@ -191,6 +289,11 @@ private:
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
double calcAuc() const;
|
|
|
|
double calcAuc() const;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Evaluator interface
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
real getValueImpl() const;
|
|
|
|
|
|
|
|
std::string getTypeImpl() const;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -223,6 +326,10 @@ private:
|
|
|
|
real* clickData,
|
|
|
|
real* clickData,
|
|
|
|
real* pvData,
|
|
|
|
real* pvData,
|
|
|
|
size_t size);
|
|
|
|
size_t size);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Evaluator interface
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
std::string getTypeImpl() const;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @brief precision, recall and f1 score Evaluator
|
|
|
|
* @brief precision, recall and f1 score Evaluator
|
|
|
@ -272,6 +379,20 @@ private:
|
|
|
|
IVectorPtr cpuLabel_;
|
|
|
|
IVectorPtr cpuLabel_;
|
|
|
|
MatrixPtr cpuWeight_;
|
|
|
|
MatrixPtr cpuWeight_;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct PrintStatsInfo {
|
|
|
|
|
|
|
|
double precision;
|
|
|
|
|
|
|
|
double recall;
|
|
|
|
|
|
|
|
double f1;
|
|
|
|
|
|
|
|
double macroAvgPrecision;
|
|
|
|
|
|
|
|
double macroAvgRecall;
|
|
|
|
|
|
|
|
double macroAvgF1Score;
|
|
|
|
|
|
|
|
double microAvgPrecision;
|
|
|
|
|
|
|
|
double microAvgRecall;
|
|
|
|
|
|
|
|
double microAvgF1Score;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool getStatsInfo(PrintStatsInfo* info) const;
|
|
|
|
|
|
|
|
|
|
|
|
void calcStatsInfo(const MatrixPtr& output,
|
|
|
|
void calcStatsInfo(const MatrixPtr& output,
|
|
|
|
const IVectorPtr& label,
|
|
|
|
const IVectorPtr& label,
|
|
|
|
const MatrixPtr& weight);
|
|
|
|
const MatrixPtr& weight);
|
|
|
@ -303,6 +424,15 @@ private:
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mutable std::unordered_map<std::string, real> values_;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void storeLocalValues() const;
|
|
|
|
|
|
|
|
// Evaluator interface
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
void getNames(std::vector<std::string>* names);
|
|
|
|
|
|
|
|
real getValue(const std::string& name, Error* err) const;
|
|
|
|
|
|
|
|
std::string getType(const std::string& name, Error* err) const;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
@ -349,8 +479,7 @@ public:
|
|
|
|
virtual void finish() { calc(predictArray_); }
|
|
|
|
virtual void finish() { calc(predictArray_); }
|
|
|
|
|
|
|
|
|
|
|
|
virtual void printStats(std::ostream& os) const {
|
|
|
|
virtual void printStats(std::ostream& os) const {
|
|
|
|
os << " pos/neg"
|
|
|
|
os << " pos/neg=" << this->getValueImpl();
|
|
|
|
<< "=" << pairArray_[0] / ((pairArray_[1] <= 0) ? 1.0 : pairArray_[1]);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
virtual void distributeEval(ParameterClient2* client) {
|
|
|
|
virtual void distributeEval(ParameterClient2* client) {
|
|
|
@ -366,6 +495,13 @@ private:
|
|
|
|
IVectorPtr cpuLabel_;
|
|
|
|
IVectorPtr cpuLabel_;
|
|
|
|
IVectorPtr cpuInfo_;
|
|
|
|
IVectorPtr cpuInfo_;
|
|
|
|
MatrixPtr cpuWeight_;
|
|
|
|
MatrixPtr cpuWeight_;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Evaluator interface
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
real getValueImpl() const {
|
|
|
|
|
|
|
|
return pairArray_[0] / ((pairArray_[1] <= 0) ? 1.0 : pairArray_[1]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string getTypeImpl() const;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace paddle
|
|
|
|
} // namespace paddle
|
|
|
|