Skip to content

Commit 742c90a

Browse files
improved convergence when family is mae
1 parent 52440bc commit 742c90a

File tree

3 files changed

+10
-8
lines changed

3 files changed

+10
-8
lines changed

cpp/APLRRegressor.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class APLRRegressor
6363
void initialize(const std::vector<size_t> &prioritized_predictors_indexes, const std::vector<int> &monotonic_constraints);
6464
bool check_if_base_term_has_only_one_unique_value(size_t base_term);
6565
void add_term_to_terms_eligible_current(Term &term);
66-
VectorXd calculate_neg_gradient_current();
66+
VectorXd calculate_neg_gradient_current(const VectorXd &sample_weight_train);
6767
void execute_boosting_steps();
6868
void execute_boosting_step(size_t boosting_step);
6969
std::vector<size_t> find_terms_eligible_current_indexes_for_a_base_term(size_t base_term);
@@ -580,7 +580,7 @@ void APLRRegressor::add_term_to_terms_eligible_current(Term &term)
580580
terms_eligible_current.push_back(term);
581581
}
582582

583-
VectorXd APLRRegressor::calculate_neg_gradient_current()
583+
VectorXd APLRRegressor::calculate_neg_gradient_current(const VectorXd &sample_weight_train)
584584
{
585585
VectorXd output;
586586
if(family=="gaussian")
@@ -609,7 +609,10 @@ VectorXd APLRRegressor::calculate_neg_gradient_current()
609609
}
610610
}
611611
else if(family=="mae")
612-
output=(y_train.array() - predictions_current.array()).sign();
612+
{
613+
double mae{calculate_errors(y_train,predictions_current,sample_weight_train,"mae").mean()};
614+
output=(y_train.array() - predictions_current.array()).sign()*mae;
615+
}
613616

614617
if(link_function!="identity")
615618
output=output.array()*differentiate_predictions().array();
@@ -700,7 +703,7 @@ void APLRRegressor::update_linear_predictor_and_predictions()
700703

701704
void APLRRegressor::update_gradient_and_errors()
702705
{
703-
neg_gradient_current=calculate_neg_gradient_current();
706+
neg_gradient_current=calculate_neg_gradient_current(sample_weight_train);
704707
neg_gradient_nullmodel_errors_sum=calculate_sum_error(calculate_errors(neg_gradient_current,linear_predictor_null_model,sample_weight_train,FAMILY_GAUSSIAN));
705708
}
706709

cpp/test ALRRegressor mae.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,8 @@ int main()
4040

4141
//Fitting
4242
//model.fit(X_train,y_train);
43-
//model.fit(X_train,y_train,sample_weight);
44-
//model.fit(X_train,y_train,sample_weight,{},{0,1,2,3,4,5,10,static_cast<size_t>(y_train.size()-1)});
4543
model.fit(X_train,y_train,sample_weight);
44+
//model.fit(X_train,y_train,sample_weight,{},{0,1,2,3,4,5,10,static_cast<size_t>(y_train.size()-1)});
4645
std::cout<<"feature importance\n"<<model.feature_importance<<"\n\n";
4746

4847
VectorXd predictions{model.predict(X_test)};
@@ -52,7 +51,7 @@ int main()
5251
save_as_csv_file("data/output.csv",predictions);
5352

5453
std::cout<<predictions.mean()<<"\n\n";
55-
tests.push_back(is_approximately_equal(predictions.mean(),23.5594,0.00001));
54+
tests.push_back(is_approximately_equal(predictions.mean(),23.6839,0.00001));
5655

5756
//Test summary
5857
std::cout<<"\n\nTest summary\n"<<"Passed "<<std::accumulate(tests.begin(),tests.end(),0)<<" out of "<<tests.size()<<" tests.";

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='2.4.0',
18+
version='2.5.0',
1919
description='Automatic Piecewise Linear Regression',
2020
ext_modules=[sfc_module],
2121
author="Mathias von Ottenbreit",

0 commit comments

Comments
 (0)