@@ -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)
0 commit comments