Skip to content

Commit

Permalink
update shared ptr ...
Browse files Browse the repository at this point in the history
  • Loading branch information
schalkdaniel committed Jan 23, 2019
1 parent 4e182d5 commit aad84a8
Show file tree
Hide file tree
Showing 22 changed files with 156 additions and 195 deletions.
2 changes: 1 addition & 1 deletion DESCRIPTION
@@ -1,7 +1,7 @@
Package: compboost
Type: Package
Title: C++ Implementation of Component-Wise Boosting
Version: 0.1.0
Version: 0.1.1
Authors@R: c(
person(given = "Daniel", family = "Schalk", email = "daniel.schalk@stat.uni-muenchen.de", role = c("aut", "cre"), comment = c(ORCID = "0000-0003-0950-1947")),
person(given = "Janek", family = "Thomas", email = "janek.thomas@stat.uni-muenchen.de", role = "aut", comment = c(ORCID = "0000-0003-4511-6245")),
Expand Down
2 changes: 2 additions & 0 deletions NEWS.md
@@ -1,3 +1,5 @@
## compboost 0.1.1

- **23.01.2019** \
**Style**: Change `.` to `_`, e.g. change `n.knots` to `n_knots`, to be more consistent with `C++` syntax.

Expand Down
2 changes: 1 addition & 1 deletion R/RcppExports.R
Expand Up @@ -1060,7 +1060,7 @@ NULL
#'
#' oob_list = list(data_source1, data_source2)
#'
#' set_seed(123)
#' set.seed(123)
#' y_oob = rnorm(10)
#'
#' # Used loss:
Expand Down
2 changes: 1 addition & 1 deletion README.Rmd
Expand Up @@ -42,7 +42,7 @@ For an introduction and overview about the functionality visit the [project page
#### CRAN version:

```r
instlal.packages("compboost")
install.packages("compboost")
```

#### Developer version:
Expand Down
56 changes: 27 additions & 29 deletions README.md
Expand Up @@ -30,10 +30,10 @@ install.packages("compboost")
devtools::install_github("schalkdaniel/compboost")
```

Examples [![Binder](http://mybinder.org/badge.svg)](http://beta.mybinder.org/v2/gh/schalkdaniel/compboost/master?filepath=./binder/tutorial_intro.ipynb)
--------------------------------------------------------------------------------------------------------------------------------------------------------
Examples
--------

This examples are rendered using <code>compboost 0.1.0</code>.
This examples are rendered using <code>compboost 0.1.1</code>.

To be as flexible as possible one should use the `R6` API do define base-learner, losses, stopping criteria, or optimizer as desired. Another option is to use wrapper functions as described on the [project page](https://schalkdaniel.github.io/compboost/).

Expand All @@ -42,23 +42,23 @@ library(compboost)

# Check installed version:
packageVersion("compboost")
#> [1] '0.1.0'
#> [1] '0.1.1'

# Load data set with binary classification task:
data(PimaIndiansDiabetes, package = "mlbench")
# Create categorical feature:
PimaIndiansDiabetes$pregnant.cat = ifelse(PimaIndiansDiabetes$pregnant == 0, "no", "yes")
PimaIndiansDiabetes$pregnant_cat = ifelse(PimaIndiansDiabetes$pregnant == 0, "no", "yes")

# Define Compboost object:
cboost = Compboost$new(data = PimaIndiansDiabetes, target = "diabetes", loss = LossBinomial$new())
cboost
#>
#> Component-Wise Gradient Boosting
#>
#> Trained on PimaIndiansDiabetes with target diabetes
#> Number of base-learners: 0
#> Learning rate: 0.05
#> Iterations: 0
#> Positive class: neg
#>
#> LossBinomial Loss:
#>
Expand All @@ -67,41 +67,40 @@ cboost
#>

# Add p-spline base-learner with default parameter:
cboost$addBaselearner(feature = "pressure", id = "spline", bl.factory = BaselearnerPSpline)
cboost$addBaselearner(feature = "pressure", id = "spline", bl_factory = BaselearnerPSpline)

# Add another p-spline learner with custom parameters:
cboost$addBaselearner(feature = "age", id = "spline", bl.factory = BaselearnerPSpline, degree = 3,
n.knots = 10, penalty = 4, differences = 2)
cboost$addBaselearner(feature = "age", id = "spline", bl_factory = BaselearnerPSpline, degree = 3,
n_knots = 10, penalty = 4, differences = 2)

# Add categorical feature (as single linear base-learner):
cboost$addBaselearner(feature = "pregnant.cat", id = "category", bl.factory = BaselearnerPolynomial,
cboost$addBaselearner(feature = "pregnant_cat", id = "category", bl_factory = BaselearnerPolynomial,
degree = 1, intercept = FALSE)

# Check all registered base-learner:
cboost$getBaselearnerNames()
#> [1] "pressure_spline" "age_spline"
#> [3] "pregnant.cat_yes_category" "pregnant.cat_no_category"
#> [3] "pregnant_cat_yes_category" "pregnant_cat_no_category"

# Train model:
cboost$train(1000L, trace = 200L)
#> 1/1000: risk = 0.66
#> 200/1000: risk = 0.58
#> 400/1000: risk = 0.57
#> 600/1000: risk = 0.57
#> 800/1000: risk = 0.57
#> 1000/1000: risk = 0.57
#> 1/1000 risk = 0.68
#> 200/1000 risk = 0.65
#> 400/1000 risk = 0.64
#> 600/1000 risk = 0.64
#> 800/1000 risk = 0.64
#> 1000/1000 risk = 0.64
#>
#>
#> Train 1000 iterations in 0 Seconds.
#> Final risk based on the train set: 0.57
#> Final risk based on the train set: 0.64
cboost
#> Component-Wise Gradient Boosting
#>
#> Trained on PimaIndiansDiabetes with target diabetes
#> Number of base-learners: 4
#> Learning rate: 0.05
#> Iterations: 1000
#> Positive class: neg
#> Offset: 0.3118
#>
#> LossBinomial Loss:
Expand All @@ -112,20 +111,20 @@ cboost

cboost$getBaselearnerNames()
#> [1] "pressure_spline" "age_spline"
#> [3] "pregnant.cat_yes_category" "pregnant.cat_no_category"
#> [3] "pregnant_cat_yes_category" "pregnant_cat_no_category"

selected.features = cboost$getSelectedBaselearner()
table(selected.features)
#> selected.features
#> age_spline pregnant.cat_no_category pressure_spline
#> 434 150 416
selected_features = cboost$getSelectedBaselearner()
table(selected_features)
#> selected_features
#> age_spline pregnant_cat_no_category pressure_spline
#> 448 130 422

params = cboost$getEstimatedCoef()
str(params)
#> List of 4
#> $ age_spline : num [1:14, 1] 2.99 1.501 0.588 -0.535 -0.119 ...
#> $ pregnant.cat_no_category: num [1, 1] -0.299
#> $ pressure_spline : num [1:24, 1] -0.8087 -0.4274 -0.0602 0.2226 0.3368 ...
#> $ age_spline : num [1:14, 1] 3.717 1.5152 0.669 -0.6627 -0.0277 ...
#> $ pregnant_cat_no_category: num [1, 1] -0.41
#> $ pressure_spline : num [1:24, 1] -0.969 -0.403 0.14 0.537 0.644 ...
#> $ offset : num 0.312

cboost$train(3000)
Expand All @@ -141,7 +140,6 @@ cboost$plot("age_spline", iters = c(100, 500, 1000, 2000, 3000)) +
<p align="center">
<img src="Readme_files/cboost-1.png" width="70%" />
</p>

Benchmark
---------

Expand Down
Binary file modified Readme_files/cboost-1.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion man/LoggerOobRisk.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 12 additions & 12 deletions src/baselearner.cpp
Expand Up @@ -28,15 +28,15 @@ namespace blearner {

// Copy (or initialize) the members in new copied class:
void Baselearner::copyMembers (const arma::mat& parameter0,
const std::string& blearner_identifier0, data::Data* data0)
const std::string& blearner_identifier0, std::shared_ptr<data::Data> data0)
{
parameter = parameter0;
blearner_identifier = blearner_identifier0;
data_ptr = data0;
}

// Set the data pointer:
void Baselearner::setData (data::Data* data)
void Baselearner::setData (std::shared_ptr<data::Data> data)
{
data_ptr = data;
}
Expand Down Expand Up @@ -106,7 +106,7 @@ Baselearner::~Baselearner ()
// BaselearnerPolynomial:
// -----------------------

BaselearnerPolynomial::BaselearnerPolynomial (data::Data* data, const std::string& identifier,
BaselearnerPolynomial::BaselearnerPolynomial (std::shared_ptr<data::Data> data, const std::string& identifier,
const unsigned int& degree, const bool& intercept)
: degree ( degree ),
intercept ( intercept )
Expand Down Expand Up @@ -185,7 +185,7 @@ arma::mat BaselearnerPolynomial::predict () const
return data_ptr->getData() * parameter;
}
}
arma::mat BaselearnerPolynomial::predict (data::Data* newdata) const
arma::mat BaselearnerPolynomial::predict (std::shared_ptr<data::Data> newdata) const
{
return instantiateData(newdata->getData()) * parameter;
}
Expand Down Expand Up @@ -222,7 +222,7 @@ BaselearnerPolynomial::~BaselearnerPolynomial () {}
* Finally we get a \f$9 - (p + 1)\f$ splines for which we can calculate the
* base.
*
* \param data `data::Data*` Target data used for training etc.
* \param data `std::shared_ptr<data::Data>` Target data used for training etc.
* \param identifier `std::string` Identifier for one specific baselearner
* \param degree `unsigned int` Polynomial degree of the splines
* \param n_knots `unsigned int` Number of inner knots used
Expand All @@ -233,7 +233,7 @@ BaselearnerPolynomial::~BaselearnerPolynomial () {}
* penalty matrix.
*/

BaselearnerPSpline::BaselearnerPSpline (data::Data* data, const std::string& identifier,
BaselearnerPSpline::BaselearnerPSpline (std::shared_ptr<data::Data> data, const std::string& identifier,
const unsigned int& degree, const unsigned int& n_knots, const double& penalty,
const unsigned int& differences, const bool& use_sparse_matrices)
: degree ( degree ),
Expand Down Expand Up @@ -327,11 +327,11 @@ arma::mat BaselearnerPSpline::predict () const
/**
* \brief Predict on newdata
*
* \param newdata `data::Data*` new source data object
* \param newdata `std::shared_ptr<data::Data>` new source data object
*
* \returns `arma::mat` of predicted values
*/
arma::mat BaselearnerPSpline::predict (data::Data* newdata) const
arma::mat BaselearnerPSpline::predict (std::shared_ptr<data::Data> newdata) const
{
return instantiateData(newdata->getData()) * parameter;
}
Expand All @@ -344,7 +344,7 @@ BaselearnerPSpline::~BaselearnerPSpline () {}
// BaselearnerCustom:
// -----------------------

BaselearnerCustom::BaselearnerCustom (data::Data* data, const std::string& identifier,
BaselearnerCustom::BaselearnerCustom (std::shared_ptr<data::Data> data, const std::string& identifier,
Rcpp::Function instantiateDataFun, Rcpp::Function trainFun, Rcpp::Function predictFun,
Rcpp::Function extractParameter)
: instantiateDataFun ( instantiateDataFun ),
Expand Down Expand Up @@ -392,7 +392,7 @@ arma::mat BaselearnerCustom::predict () const
return Rcpp::as<arma::mat>(out);
}

arma::mat BaselearnerCustom::predict (data::Data* newdata) const
arma::mat BaselearnerCustom::predict (std::shared_ptr<data::Data> newdata) const
{
Rcpp::NumericMatrix out = predictFun(model, instantiateData(newdata->getData()));
return Rcpp::as<arma::mat>(out);
Expand All @@ -405,7 +405,7 @@ BaselearnerCustom::~BaselearnerCustom () {}
// BaselearnerCustomCpp:
// -----------------------

BaselearnerCustomCpp::BaselearnerCustomCpp (data::Data* data, const std::string& identifier,
BaselearnerCustomCpp::BaselearnerCustomCpp (std::shared_ptr<data::Data> data, const std::string& identifier,
SEXP instantiateDataFun0, SEXP trainFun0, SEXP predictFun0)
{
// Called from parent class 'Baselearner':
Expand Down Expand Up @@ -457,7 +457,7 @@ arma::mat BaselearnerCustomCpp::predict () const
return predictFun (data_ptr->getData(), parameter);
}

arma::mat BaselearnerCustomCpp::predict (data::Data* newdata) const
arma::mat BaselearnerCustomCpp::predict (std::shared_ptr<data::Data> newdata) const
{
arma::mat temp_mat = instantiateData(newdata->getData());
return predictFun (temp_mat, parameter);
Expand Down
24 changes: 12 additions & 12 deletions src/baselearner.h
Expand Up @@ -44,7 +44,7 @@ class Baselearner
arma::mat getParameter () const;

virtual arma::mat predict () const = 0;
virtual arma::mat predict (data::Data*) const = 0;
virtual arma::mat predict (std::shared_ptr<data::Data>) const = 0;

// Specify how the data has to be transformed. E. g. for splines a mapping
// to the higher dimension space. The overloading function with the
Expand All @@ -54,14 +54,14 @@ class Baselearner
// Clone function (in some places needed e.g. "optimizer.cpp") and a copy
// function which is called by clone to avoid copy and pasting of the
// protected members:
void copyMembers (const arma::mat&, const std::string&, data::Data*);
void copyMembers (const arma::mat&, const std::string&, std::shared_ptr<data::Data>);
virtual Baselearner* clone () = 0;

// Within 'setData' the pointer will be setted, while 'instantiateData'
// overwrite the object on which 'data_ptr' points. This guarantees that
// the data is just stored once in the factory and then called by reference
// within the baselearner:
void setData (data::Data*);
void setData (std::shared_ptr<data::Data>);
// arma::mat getData () const;

// Get data identifier stored within the data object:
Expand All @@ -86,7 +86,7 @@ class Baselearner
arma::mat parameter;
std::string blearner_identifier;
std::string blearner_type;
data::Data* data_ptr;
std::shared_ptr<data::Data> data_ptr;
// std::string data_identifier;

};
Expand All @@ -112,7 +112,7 @@ class BaselearnerPolynomial : public Baselearner
public:

// (data pointer, data identifier, baselearner identifier, degree)
BaselearnerPolynomial (data::Data*, const std::string&, const unsigned int&, const bool&);
BaselearnerPolynomial (std::shared_ptr<data::Data>, const std::string&, const unsigned int&, const bool&);

Baselearner* clone ();

Expand All @@ -121,7 +121,7 @@ class BaselearnerPolynomial : public Baselearner

void train (const arma::mat&);
arma::mat predict () const;
arma::mat predict (data::Data*) const;
arma::mat predict (std::shared_ptr<data::Data>) const;

~BaselearnerPolynomial ();

Expand Down Expand Up @@ -169,7 +169,7 @@ class BaselearnerPSpline : public Baselearner

public:
/// Default constructor of `BaselearnerPSpline` class
BaselearnerPSpline (data::Data*, const std::string&, const unsigned int&,
BaselearnerPSpline (std::shared_ptr<data::Data>, const std::string&, const unsigned int&,
const unsigned int&, const double&, const unsigned int&, const bool&);

/// Clean copy of baselearner
Expand All @@ -185,7 +185,7 @@ class BaselearnerPSpline : public Baselearner
arma::mat predict () const;

/// Predict on newdata
arma::mat predict (data::Data*) const;
arma::mat predict (std::shared_ptr<data::Data>) const;


/// Destructor
Expand Down Expand Up @@ -216,7 +216,7 @@ class BaselearnerCustom : public Baselearner
// (data pointer, data identifier, baselearner identifier, R function for
// data instantiation, R function for training, R function for prediction,
// R function to extract parameter):
BaselearnerCustom (data::Data*, const std::string&, Rcpp::Function,
BaselearnerCustom (std::shared_ptr<data::Data>, const std::string&, Rcpp::Function,
Rcpp::Function, Rcpp::Function, Rcpp::Function);

// Copy constructor:
Expand All @@ -227,7 +227,7 @@ class BaselearnerCustom : public Baselearner

void train (const arma::mat&);
arma::mat predict () const;
arma::mat predict (data::Data*) const;
arma::mat predict (std::shared_ptr<data::Data>) const;

~BaselearnerCustom ();

Expand Down Expand Up @@ -262,7 +262,7 @@ class BaselearnerCustomCpp : public Baselearner
// (data pointer, data identifier, baselearner identifier, R function for
// data instantiation, R function for training, R function for prediction,
// R function to extract parameter):
BaselearnerCustomCpp (data::Data*, const std::string&, SEXP, SEXP, SEXP);
BaselearnerCustomCpp (std::shared_ptr<data::Data>, const std::string&, SEXP, SEXP, SEXP);

// Copy constructor:
Baselearner* clone ();
Expand All @@ -272,7 +272,7 @@ class BaselearnerCustomCpp : public Baselearner

void train (const arma::mat&);
arma::mat predict () const;
arma::mat predict (data::Data*) const;
arma::mat predict (std::shared_ptr<data::Data>) const;

~BaselearnerCustomCpp ();
};
Expand Down

0 comments on commit aad84a8

Please sign in to comment.