Skip to content

Commit 01d634b

Browse files
fixed bug that sometimes caused unnecessarily complex interactions
1 parent f0fe771 commit 01d634b

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

cpp/APLRRegressor.h

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ class APLRRegressor
8989
void update_coefficients_for_all_steps();
9090
void print_final_summary();
9191
void find_optimal_m_and_update_model_accordingly();
92+
void remove_redundant_terms();
93+
void remove_unused_terms();
9294
void name_terms(const MatrixXd &X, const std::vector<std::string> &X_names);
9395
void calculate_feature_importance_on_validation_set();
9496
void find_min_and_max_training_predictions_or_responses();
@@ -245,6 +247,8 @@ void APLRRegressor::fit(const MatrixXd &X,const VectorXd &y,const VectorXd &samp
245247
update_coefficients_for_all_steps();
246248
print_final_summary();
247249
find_optimal_m_and_update_model_accordingly();
250+
remove_redundant_terms();
251+
remove_unused_terms();
248252
revert_scaling_if_using_log_link_function();
249253
name_terms(X, X_names);
250254
calculate_feature_importance_on_validation_set();
@@ -1325,8 +1329,42 @@ void APLRRegressor::find_optimal_m_and_update_model_accordingly()
13251329
terms[i].coefficient = terms[i].coefficient_steps[best_boosting_step_index];
13261330
}
13271331
m_optimal=best_boosting_step_index+1;
1332+
}
13281333

1329-
//Removing unused terms
1334+
void APLRRegressor::remove_redundant_terms()
1335+
{
1336+
for(size_t i = 0; i < terms.size(); ++i)
1337+
{
1338+
for(size_t j = 0; j < terms.size(); ++j)
1339+
{
1340+
bool term_is_used{!is_approximately_zero(terms[i].coefficient)};
1341+
bool other_term_is_used{!is_approximately_zero(terms[j].coefficient)};
1342+
if(i!=j && term_is_used && other_term_is_used && terms[i].equals_not_comparing_given_terms(terms[i],terms[j]))
1343+
{
1344+
VectorXd values_i{terms[i].calculate(X_train)};
1345+
VectorXd values_j{terms[j].calculate(X_train)};
1346+
bool terms_are_similar{values_i==values_j};
1347+
if(terms_are_similar)
1348+
{
1349+
if(terms[i].get_interaction_level()>terms[j].get_interaction_level())
1350+
{
1351+
terms[j].coefficient+=terms[i].coefficient;
1352+
terms[i].coefficient=0;
1353+
break;
1354+
}
1355+
else
1356+
{
1357+
terms[i].coefficient+=terms[j].coefficient;
1358+
terms[j].coefficient=0;
1359+
}
1360+
}
1361+
}
1362+
}
1363+
}
1364+
}
1365+
1366+
void APLRRegressor::remove_unused_terms()
1367+
{
13301368
std::vector<Term> terms_new;
13311369
terms_new.reserve(terms.size());
13321370
for (size_t i = 0; i < terms.size(); ++i)

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
setuptools.setup(
1717
name='aplr',
18-
version='6.5.0',
18+
version='6.5.1',
1919
description='Automatic Piecewise Linear Regression',
2020
ext_modules=[sfc_module],
2121
author="Mathias von Ottenbreit",

0 commit comments

Comments
 (0)