96template<
class RETURNTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
97class Classifier :
public Clonable {
100 typedef std::shared_ptr<SUBSET>
const PSubset;
121 virtual bool classify_scores(std::vector<RETURNTYPE> &scores,
const PPattern &pattern) {(void)scores; (void)pattern;
return false;}
147 Classifier*
clone()
const override =0;
148 Classifier*
sharing_clone()
const override {
throw fst_error(
"Classifier::sharing_clone() not supported, use Classifier::clone() instead.");}
149 Classifier*
stateless_clone()
const override {
throw fst_error(
"Classifier::stateless_clone() not supported, use Classifier::clone() instead.");}
152template<
class RETURNTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
156 notify(
"Classifier::test().");
158 typename DATAACCESSOR::PPattern p;
159 unsigned long long count=0, correct=0;
161 const DIMTYPE stride=da->getNoOfFeatures();
162 for(DIMTYPE c_test=0;c_test<da->getNoOfClasses();c_test++)
164 da->setClass(c_test);
165 for(
const auto &blk : da->blocks(
TEST)) { p=blk.data;
const auto s=blk.size;
166 for(
auto i=
decltype(s){0};i<s;i++)
168 if(!
classify(clstmp,&p[(std::size_t)i*stride]))
return false;
169 if(clstmp==c_test) correct++;
172 da->setClass(c_test);
175 if(count==0)
return false;
176 result=(RETURNTYPE)correct/(RETURNTYPE)count;
180template<
class RETURNTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
187 classes=da->getNoOfClasses();
188 if(classes<2)
return false;
189 confusion.assign((
size_t)classes*(
size_t)classes,(RETURNTYPE)0.0);
190 typename DATAACCESSOR::PPattern p;
191 unsigned long long count=0;
193 const DIMTYPE stride=da->getNoOfFeatures();
194 for(DIMTYPE c_test=0;c_test<classes;c_test++)
196 da->setClass(c_test);
197 for(
const auto &blk : da->blocks(
TEST)) { p=blk.data;
const auto s=blk.size;
198 for(
auto i=
decltype(s){0};i<s;i++)
200 if(!
classify(clstmp,&p[(std::size_t)i*stride]))
return false;
201 if(clstmp>=classes) clstmp=(c_test+1)%classes;
202 confusion[(size_t)c_test*(
size_t)classes+(size_t)clstmp]+=1.0;
205 da->setClass(c_test);
211template<
class RETURNTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
216 const DIMTYPE classes=da->getNoOfClasses();
217 if(classes!=2)
return false;
219 std::vector<RETURNTYPE> sc;
220 typename DATAACCESSOR::PPattern p;
221 const DIMTYPE stride=da->getNoOfFeatures();
222 for(DIMTYPE c_test=0;c_test<classes;c_test++)
224 da->setClass(c_test);
225 for(
const auto &blk : da->blocks(
TEST)) { p=blk.data;
const auto s=blk.size;
226 for(
auto i=
decltype(s){0};i<s;i++)
228 if(!
classify_scores(sc,&p[(std::size_t)i*stride]) || sc.size()<2)
return false;
229 scores.push_back(std::make_pair(sc[1]-sc[0],c_test));
231 da->setClass(c_test);
234 return !scores.empty();
237template<
class RETURNTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
242 classes=da->getNoOfClasses();
243 if(classes<2)
return false;
244 scores.clear(); labels.clear();
245 std::vector<RETURNTYPE> sc;
246 typename DATAACCESSOR::PPattern p;
247 const DIMTYPE stride=da->getNoOfFeatures();
248 for(DIMTYPE c_test=0;c_test<classes;c_test++)
250 da->setClass(c_test);
251 for(
const auto &blk : da->blocks(
TEST)) { p=blk.data;
const auto s=blk.size;
252 for(
auto i=
decltype(s){0};i<s;i++)
254 if(!
classify_scores(sc,&p[(std::size_t)i*stride]) || sc.size()<(
size_t)classes)
return false;
255 for(DIMTYPE c=0;c<classes;c++) scores.push_back(sc[c]);
256 labels.push_back(c_test);
258 da->setClass(c_test);
261 return !labels.empty();
264template<
class RETURNTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
270 if(da->getNoOfClasses()==2) {
271 std::vector<std::pair<RETURNTYPE,DIMTYPE>> scores;
275 std::vector<RETURNTYPE> scores;
276 std::vector<DIMTYPE> labels;
281 std::vector<RETURNTYPE> confusion;
abstract class, defines interface for classifier implementations (mainly to be used in wrappers)
Definition classifier.hpp:97
virtual bool test_metric(RETURNTYPE &result, const PDataAccessor da, const Metric_Spec< RETURNTYPE > &spec)
Definition classifier.hpp:265
Classifier * clone() const override=0
Classifier * stateless_clone() const override
Definition classifier.hpp:149
virtual bool classify(DIMTYPE &cls, const PPattern &pattern)=0
std::shared_ptr< DATAACCESSOR > PDataAccessor
shared pointer to the data accessor supplying train/test blocks
Definition classifier.hpp:99
virtual bool classify_scores(std::vector< RETURNTYPE > &scores, const PPattern &pattern)
Definition classifier.hpp:121
Classifier * sharing_clone() const override
Definition classifier.hpp:148
virtual bool test_confusion(std::vector< RETURNTYPE > &confusion, DIMTYPE &classes, const PDataAccessor da)
Definition classifier.hpp:181
virtual bool test(RETURNTYPE &result, const PDataAccessor da)
Definition classifier.hpp:153
virtual bool test_scores_matrix(std::vector< RETURNTYPE > &scores, std::vector< DIMTYPE > &labels, DIMTYPE &classes, const PDataAccessor da)
Definition classifier.hpp:238
std::shared_ptr< SUBSET > const PSubset
shared pointer to the (fixed, non-reassignable) feature subset being evaluated
Definition classifier.hpp:100
virtual bool train(const PDataAccessor da, const PSubset sub)=0
learns from designated training part of data
DATAACCESSOR::PPattern PPattern
one data sample as exposed by DATAACCESSOR (a raw pointer to its feature vector)
Definition classifier.hpp:101
virtual bool test_scores(std::vector< std::pair< RETURNTYPE, DIMTYPE > > &scores, const PDataAccessor da)
Definition classifier.hpp:212
FST4 specific error passing class.
Definition error.hpp:61
Defines interface for classes that may need to get cloned.
FST4 specific error passing class.
The Feature Selection Toolbox 4 library: every library component – data access, criteria and classifi...
Definition data_accessor.hpp:80
bool metric_from_confusion(RETURNTYPE &result, const Wrapper_Metric metric, const std::vector< RETURNTYPE > &confusion, const DIMTYPE classes, const std::vector< RETURNTYPE > &class_weights, const DIMTYPE f1_positive=1)
Definition wrapper_metrics.hpp:126
void notify(const std::string msg)
Prints msg followed by a newline via syncout::print(); a no-op unless the preprocessor macro DEBUG is...
Definition global.hpp:112
@ TEST
the split's test part
Definition data_accessor.hpp:86
@ auc
classification: two-class data = area under the ROC curve (exact rank statistic, midrank ties); K>2 =...
Definition wrapper_metrics.hpp:65
bool auc_macro_from_scores(RETURNTYPE &result, const std::vector< RETURNTYPE > &scores, const std::vector< DIMTYPE > &labels, const DIMTYPE classes)
Definition wrapper_metrics.hpp:222
bool auc_from_scores(RETURNTYPE &result, std::vector< std::pair< RETURNTYPE, DIMTYPE > > &scores)
Definition wrapper_metrics.hpp:190
configuration of the wrapper metric; immutable during search, copied by criterion clones (thread-safe...
Definition wrapper_metrics.hpp:73
std::vector< RETURNTYPE > class_weights
Definition wrapper_metrics.hpp:82
bool is_regression_metric() const
true for the three regression metrics (r2/neg_rmse/neg_mae), false for the classification metrics
Definition wrapper_metrics.hpp:85
Wrapper_Metric metric
which metric to compute; accuracy = the default path served by Classifier::test()
Definition wrapper_metrics.hpp:74
unsigned int f1_positive
class index the f1 metric scores as positive (two-class data; --f1-positive). Affects f1 ONLY - f1-ma...
Definition wrapper_metrics.hpp:83
bool is_default() const
true iff this spec is the plain unweighted accuracy path (f1_positive is irrelevant unless metric==f1...
Definition wrapper_metrics.hpp:84
Wrapper criterion metrics beyond accuracy (balanced accuracy, F1, AUC, class weights,...