@@ -721,13 +721,27 @@ class RootMeanSquaredLogError(RegressionObjective):
721721
722722 def objective_function (self , y_true , y_predicted , X = None , sample_weight = None ):
723723 """Objective function for root mean squared log error for regression."""
724- return np .sqrt (
725- metrics .mean_squared_log_error (
726- y_true ,
727- y_predicted ,
728- sample_weight = sample_weight ,
729- ),
730- )
724+
725+ def rmsle (y_true , y_pred ):
726+ return np .sqrt (
727+ metrics .mean_squared_log_error (
728+ y_true ,
729+ y_pred ,
730+ sample_weight = sample_weight ,
731+ ),
732+ )
733+
734+ # Multiseries time series regression
735+ if isinstance (y_true , pd .DataFrame ):
736+ raw_rmsles = []
737+ for i in range (len (y_true .columns )):
738+ y_true_i = y_true .iloc [:, i ]
739+ y_predicted_i = y_predicted .iloc [:, i ]
740+ raw_rmsles .append (rmsle (y_true_i , y_predicted_i ))
741+ return np .mean (raw_rmsles )
742+
743+ # All univariate regression
744+ return rmsle (y_true , y_predicted )
731745
732746 @classproperty
733747 def positive_only (self ):
@@ -833,17 +847,13 @@ class MAPE(TimeSeriesRegressionObjective):
833847
834848 def objective_function (self , y_true , y_predicted , X = None , sample_weight = None ):
835849 """Objective function for mean absolute percentage error for time series regression."""
836- if ( y_true == 0 ). any () :
850+ if 0 in y_true . values :
837851 raise ValueError (
838852 "Mean Absolute Percentage Error cannot be used when "
839853 "targets contain the value 0." ,
840854 )
841- if isinstance (y_true , pd .Series ):
842- y_true = y_true .to_numpy ()
843- if isinstance (y_predicted , pd .Series ):
844- y_predicted = y_predicted .to_numpy ()
845- scaled_difference = (y_true - y_predicted ) / y_true
846- return np .abs (scaled_difference ).mean () * 100
855+ mape = MeanAbsolutePercentageError ()
856+ return mape (y_true , y_predicted ) * 100
847857
848858 @classproperty
849859 def positive_only (self ):
@@ -871,15 +881,11 @@ class SMAPE(TimeSeriesRegressionObjective):
871881
872882 def objective_function (self , y_true , y_predicted , X = None , sample_weight = None ):
873883 """Objective function for mean absolute percentage error for time series regression."""
874- if (( abs (y_true ) + abs (y_predicted )) == 0 ). any () :
884+ if 0 in ( abs (y_true ) + abs (y_predicted )). values :
875885 raise ValueError (
876886 "Symmetric Mean Absolute Percentage Error cannot be used when "
877887 "true and predicted targets both contain the value 0." ,
878888 )
879- if isinstance (y_true , pd .Series ):
880- y_true = y_true .to_numpy ()
881- if isinstance (y_predicted , pd .Series ):
882- y_predicted = y_predicted .to_numpy ()
883889
884890 smape = MeanAbsolutePercentageError (symmetric = True )
885891 return smape (y_true , y_predicted ) * 100
@@ -958,6 +964,16 @@ class MaxError(RegressionObjective):
958964
959965 def objective_function (self , y_true , y_predicted , X = None , sample_weight = None ):
960966 """Objective function for maximum residual error for regression."""
967+ # Multiseries time series regression
968+ if isinstance (y_true , pd .DataFrame ):
969+ raw_max_errors = []
970+ for i in range (len (y_true .columns )):
971+ y_true_i = y_true .iloc [:, i ]
972+ y_predicted_i = y_predicted .iloc [:, i ]
973+ raw_max_errors .append (metrics .max_error (y_true_i , y_predicted_i ))
974+ return np .mean (raw_max_errors )
975+
976+ # All other regression problems
961977 return metrics .max_error (y_true , y_predicted )
962978
963979
0 commit comments