Skip to content

Commit 8883b25

Browse files
not using predictors with only one unique value
1 parent 47ab88a commit 8883b25

File tree

1 file changed

+27
-3
lines changed

1 file changed

+27
-3
lines changed

cpp/APLRRegressor.h

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class APLRRegressor
5050
void throw_error_if_validation_set_indexes_has_invalid_indexes(const VectorXd &y, const std::vector<size_t> &validation_set_indexes);
5151
void define_training_and_validation_sets(const MatrixXd &X,const VectorXd &y,const VectorXd &sample_weight, const std::vector<size_t> &validation_set_indexes);
5252
void initialize(const MatrixXd &X);
53+
bool check_if_base_term_has_only_one_unique_value(const MatrixXd &X, size_t base_term);
5354
void add_term_to_terms_eligible_current(Term &term);
5455
VectorXd calculate_neg_gradient_current(const VectorXd &y,const VectorXd &predictions_current);
5556
void execute_boosting_steps();
@@ -283,10 +284,14 @@ void APLRRegressor::initialize(const MatrixXd &X)
283284
null_predictions=VectorXd::Constant(y_train.size(),0);
284285

285286
terms_eligible_current.reserve(X.cols()*reserved_terms_times_num_x);
286-
for (size_t i = 0; i < static_cast<size_t>(X.cols()); ++i) //add each base term
287+
for (size_t i = 0; i < static_cast<size_t>(X.cols()); ++i)
287288
{
288-
Term copy_of_base_term{Term(i)};
289-
add_term_to_terms_eligible_current(copy_of_base_term);
289+
bool term_has_one_unique_value{check_if_base_term_has_only_one_unique_value(X, i)};
290+
if(!term_has_one_unique_value)
291+
{
292+
Term copy_of_base_term{Term(i)};
293+
add_term_to_terms_eligible_current(copy_of_base_term);
294+
}
290295
}
291296

292297
predictions_current=VectorXd::Constant(y_train.size(),0);
@@ -299,6 +304,25 @@ void APLRRegressor::initialize(const MatrixXd &X)
299304
neg_gradient_nullmodel_errors_sum=neg_gradient_nullmodel_errors.sum();
300305
}
301306

307+
bool APLRRegressor::check_if_base_term_has_only_one_unique_value(const MatrixXd &X, size_t base_term)
308+
{
309+
size_t rows{static_cast<size_t>(X.rows())};
310+
if(rows==1) return true;
311+
312+
bool term_has_one_unique_value{true};
313+
for (size_t i = 1; i < rows; ++i)
314+
{
315+
bool observation_is_equal_to_previous{check_if_approximately_equal(X.col(base_term)[i], X.col(base_term)[i-1])};
316+
if(!observation_is_equal_to_previous)
317+
{
318+
term_has_one_unique_value=false;
319+
break;
320+
}
321+
}
322+
323+
return term_has_one_unique_value;
324+
}
325+
302326
void APLRRegressor::add_term_to_terms_eligible_current(Term &term)
303327
{
304328
terms_eligible_current.push_back(term);

0 commit comments

Comments
 (0)