1#ifndef FSTREGRESSORRIDGE_H
2#define FSTREGRESSORRIDGE_H
118template<
class RETURNTYPE,
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
119class Regressor_Ridge :
public Clonable_Impl<Regressor_Ridge<RETURNTYPE,DATATYPE,REALTYPE,IDXTYPE,DIMTYPE,SUBSET,DATAACCESSOR>,Regressor<RETURNTYPE,DIMTYPE,SUBSET,DATAACCESSOR> > {
141 virtual bool predict(RETURNTYPE &depvar,
const PPattern &pattern)
override;
149 virtual std::ostream&
print(std::ostream& os)
const override {os <<
"Regressor_Ridge(lambda=" <<
_lambda <<
")";
return os;}
159 std::vector<REALTYPE>
_w;
162 std::vector<REALTYPE>
_A;
163 std::vector<REALTYPE>
_b;
164 std::vector<REALTYPE>
_Z;
165 std::vector<REALTYPE>
_yv;
174 else dep=(REALTYPE)cls;
181template<
class RETURNTYPE,
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
184 notify(
"Regressor_Ridge::initialize().");
186 assert(da->getNoOfFeatures()>0);
192template<
class RETURNTYPE,
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
195 notify(
"Regressor_Ridge::train().");
198 assert(
_features==da->getNoOfFeatures());
199 assert(sub->get_n_raw()==da->getNoOfFeatures());
203 for(DIMTYPE fsel : sub->selected_features()) {
216 [
this](
const auto *pat,
const DIMTYPE c){_Z.push_back(1.0); REALTYPE dep; dependent_from(pat,c,dep); _yv.push_back(dep);});
217 if(N==0)
return false;
222 _A.assign(dp1*dp1,0.0);
224 for(std::size_t n=0;n<N;n++)
226 const REALTYPE *z=&
_Z[n*dp1];
227 const REALTYPE y=
_yv[n];
228 for(std::size_t
f1=0;
f1<dp1;
f1++)
231 for(std::size_t f2=0;f2<=
f1;f2++)
_A[
f1*dp1+f2]+=z[
f1]*z[f2];
234 for(std::size_t j=0;j<dp1*dp1;j++)
_A[j]/=(REALTYPE)N;
235 for(std::size_t f=0;f<dp1;f++)
_b[f]/=(REALTYPE)N;
236 for(std::size_t f=0;f<d;f++)
_A[f*dp1+f]+=
_lambda;
240 _A[d*dp1+d]+=(REALTYPE)1e-10;
249template<
class RETURNTYPE,
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
254 assert(
_w.size()==d+1);
257 depvar=(RETURNTYPE)v;
261template<
class RETURNTYPE,
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
267 notify(
"Regressor_Ridge::test().");
268 std::vector<std::pair<RETURNTYPE,RETURNTYPE>> pairs;
270 if(pairs.empty())
return false;
273 for(
const auto &pr : pairs)
275 if(label_mode) {
if(std::fabs((REALTYPE)pr.first-(REALTYPE)pr.second)<0.5) errsum+=1;}
276 else errsum+=-std::fabs((REALTYPE)pr.first-(REALTYPE)pr.second);
278 result=errsum/(RETURNTYPE)pairs.size();
282template<
class RETURNTYPE,
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
287 typename DATAACCESSOR::PPattern p1;
289 const DIMTYPE _feats=da->getNoOfFeatures();
292 for(DIMTYPE c_test=0;c_test<da->getNoOfClasses();c_test++)
294 da->setClass(c_test);
295 for(
const auto &blk : da->blocks(
TEST)) { p1=blk.data; s1=blk.size;
300 if(!
predict(predval,&p1[i1*_feats]))
return false;
301 pairs.push_back(std::make_pair((RETURNTYPE)depval,predval));
303 da->setClass(c_test);
309template<
class RETURNTYPE,
typename DATATYPE,
typename REALTYPE,
typename IDXTYPE,
typename DIMTYPE,
class SUBSET,
class DATAACCESSOR>
314 std::vector<std::pair<RETURNTYPE,RETURNTYPE>> pairs;
CRTP mixin implementing the Clonable protocol for a concrete class.
Definition clonable.hpp:184
Closed-form ridge regression (L2-regularized least squares) for wrapper-based feature selection.
Definition regressor_ridge.hpp:119
virtual bool test(RETURNTYPE &result, const PDataAccessor da) override
Scores the designated test data with the regressor's own default measure, oriented higher-is-better (...
Definition regressor_ridge.hpp:262
std::vector< REALTYPE > _b
d+1 right-hand side
Definition regressor_ridge.hpp:163
Regressor< RETURNTYPE, DIMTYPE, SUBSET, DATAACCESSOR > parent
the immediate abstract base
Definition regressor_ridge.hpp:121
std::vector< REALTYPE > _mean
standardization shift per subset position
Definition regressor_ridge.hpp:157
DIMTYPE _dep_var_idx
dependent-variable data column, or an out-of-range sentinel ((DIMTYPE)-1 by default) meaning "use the...
Definition regressor_ridge.hpp:152
std::vector< DIMTYPE > _index
subset position -> raw feature index (first d entries valid)
Definition regressor_ridge.hpp:156
void set_dependent_index(const DIMTYPE depvaridx)
Chooses the dependent variable: a raw data column index, or any out-of-range value (the (DIMTYPE)-1 d...
Definition regressor_ridge.hpp:135
virtual std::ostream & print(std::ostream &os) const override
writes a human-readable identification of the object; base default writes nothing
Definition regressor_ridge.hpp:149
Clonable_Impl< Regressor_Ridge, parent > parent_impl
implements clone() via the (implicit, member-wise) copy-constructor - all members are value-semantic
Definition regressor_ridge.hpp:122
std::vector< REALTYPE > _yv
N dependent values.
Definition regressor_ridge.hpp:165
void set_lambda(const REALTYPE l)
Definition regressor_ridge.hpp:129
DIMTYPE _subfeatures
d = features used by the current model (dependent column excluded)
Definition regressor_ridge.hpp:155
std::vector< REALTYPE > _scale
standardization scale per subset position (1 for constant features)
Definition regressor_ridge.hpp:158
std::vector< REALTYPE > _w
d weights + bias at [d]
Definition regressor_ridge.hpp:159
bool collect_predictions(const PDataAccessor da, std::vector< std::pair< RETURNTYPE, RETURNTYPE > > &pairs)
the shared test-part (dependent,prediction) enumeration behind test() and test_metric()
Definition regressor_ridge.hpp:283
std::vector< REALTYPE > _Z
N x (d+1) standardized design.
Definition regressor_ridge.hpp:164
DIMTYPE _features
raw feature count recorded by initialize(), for sizing _index and for dependent_from()'s column-vs-la...
Definition regressor_ridge.hpp:154
void initialize(const PDataAccessor da)
records data shape, allocates the index buffer
Definition regressor_ridge.hpp:182
std::shared_ptr< DATAACCESSOR > PDataAccessor
shared pointer to the data accessor supplying train/test blocks
Definition regressor_ridge.hpp:123
virtual bool train(const PDataAccessor da, const PSubset sub) override
Definition regressor_ridge.hpp:193
std::vector< REALTYPE > _A
(d+1)x(d+1) normal-equation matrix, row-major
Definition regressor_ridge.hpp:162
DATAACCESSOR::PPattern PPattern
one data sample as exposed by DATAACCESSOR (a raw pointer to its feature vector)
Definition regressor_ridge.hpp:125
virtual bool test_metric(RETURNTYPE &result, const PDataAccessor da, const Metric_Spec< RETURNTYPE > &spec) override
Definition regressor_ridge.hpp:310
bool dependent_from(const PPattern &pat, const DIMTYPE cls, REALTYPE &dep) const
Definition regressor_ridge.hpp:171
virtual bool predict(RETURNTYPE &depvar, const PPattern &pattern) override
Definition regressor_ridge.hpp:250
REALTYPE _lambda
L2 penalty weight; set by set_lambda().
Definition regressor_ridge.hpp:151
std::shared_ptr< SUBSET > PSubset
shared pointer to the feature subset being trained/evaluated on
Definition regressor_ridge.hpp:124
abstract class, defines interface for Regressor implementations (mainly to be used in wrappers)
Definition regressor.hpp:102
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
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
std::size_t standardize_design(const std::shared_ptr< DATAACCESSOR > &da, const DIMTYPE classes, const std::size_t d, const std::size_t zstride, const std::vector< DIMTYPE > &index, std::vector< REALTYPE > &Z, std::vector< REALTYPE > &mean, std::vector< REALTYPE > &scale, AFTERPATTERN after_pattern)
Definition dense_train_tools.hpp:84
@ TEST
the split's test part
Definition data_accessor.hpp:86
bool cholesky_factor(std::vector< REALTYPE > &A, const std::size_t m)
Definition dense_train_tools.hpp:133
void cholesky_solve(const std::vector< REALTYPE > &A, const std::size_t m, const REALTYPE *rhs, const bool negate_rhs, REALTYPE *out)
Definition dense_train_tools.hpp:156
@ f1
classification, two-class data: F1 of the positive class, which is Metric_Spec::f1_positive (class in...
Definition wrapper_metrics.hpp:63
bool metric_from_predictions(RETURNTYPE &result, const Wrapper_Metric metric, const std::vector< std::pair< RETURNTYPE, RETURNTYPE > > &pairs)
Definition wrapper_metrics.hpp:245
Defines interface for regressor implementations.
configuration of the wrapper metric; immutable during search, copied by criterion clones (thread-safe...
Definition wrapper_metrics.hpp:73
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
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