28
28
29
29
logging .getLogger ("report_creator" ).setLevel (logging .WARNING )
30
30
AUTOMLX_N_ALGOS_TUNED = 4
31
- AUTOMLX_DEFAULT_SCORE_METRIC = "neg_sym_mean_abs_percent_error"
31
+ AUTOMLX_DEFAULT_SCORE_METRIC = ['neg_sym_mean_abs_percent_error' ,
32
+ 'neg_mean_abs_percent_error' ,
33
+ 'neg_root_mean_squared_error' ]
32
34
33
35
34
36
class AutoMLXOperatorModel (ForecastOperatorBaseModel ):
@@ -45,10 +47,13 @@ def set_kwargs(self):
45
47
model_kwargs_cleaned ["n_algos_tuned" ] = model_kwargs_cleaned .get (
46
48
"n_algos_tuned" , AUTOMLX_N_ALGOS_TUNED
47
49
)
48
- model_kwargs_cleaned ["score_metric" ] = AUTOMLX_METRIC_MAP .get (
49
- self .spec .metric ,
50
- model_kwargs_cleaned .get ("score_metric" , AUTOMLX_DEFAULT_SCORE_METRIC ),
51
- )
50
+ metric_to_optimize = AUTOMLX_METRIC_MAP .get (self .spec .metric )
51
+ model_kwargs_cleaned ["score_metric" ] = AUTOMLX_DEFAULT_SCORE_METRIC
52
+ # The first score metric in the list will be the one for which the pipeline optimizes
53
+ if metric_to_optimize is not None :
54
+ model_kwargs_cleaned ["score_metric" ].remove (metric_to_optimize )
55
+ model_kwargs_cleaned ["score_metric" ].insert (0 , metric_to_optimize )
56
+
52
57
model_kwargs_cleaned .pop ("task" , None )
53
58
time_budget = model_kwargs_cleaned .pop ("time_budget" , - 1 )
54
59
model_kwargs_cleaned ["preprocessing" ] = (
@@ -70,7 +75,7 @@ def preprocess(self, data, series_id): # TODO: re-use self.le for explanations
70
75
@runtime_dependency (
71
76
module = "automlx" ,
72
77
err_msg = (
73
- "Please run `pip3 install oracle-automlx[forecasting]>=25.1.1 ` "
78
+ "Please run `pip3 install oracle-automlx[forecasting]>=25.3.0 ` "
74
79
"to install the required dependencies for automlx."
75
80
),
76
81
)
@@ -163,7 +168,7 @@ def _build_model(self) -> pd.DataFrame:
163
168
self .models [s_id ] = {}
164
169
self .models [s_id ]["model" ] = model
165
170
self .models [s_id ]["le" ] = self .le [s_id ]
166
- self .models [s_id ]["score" ] = self .get_validation_score_and_metric (model )
171
+ self .models [s_id ]["score" ] = self .get_all_metrics (model )
167
172
168
173
# In case of Naive model, model.forecast function call does not return confidence intervals.
169
174
if f"{ target } _ci_upper" not in summary_frame :
@@ -518,26 +523,27 @@ def explain_model(self):
518
523
)
519
524
logger .debug (f"Full Traceback: { traceback .format_exc ()} " )
520
525
521
- def get_validation_score_and_metric (self , model ):
526
+ def get_all_metrics (self , model ):
522
527
trials = model .completed_trials_summary_
523
528
model_params = model .selected_model_params_
524
529
if len (trials ) > 0 :
525
- score_col = [col for col in trials .columns if "Score" in col ][0 ]
526
- validation_score = trials [trials .Hyperparameters == model_params ][
527
- score_col
530
+ all_metrics = trials [trials .Hyperparameters == model_params ][
531
+ "All Metrics"
528
532
].iloc [0 ]
529
533
else :
530
- validation_score = 0
531
- return - 1 * validation_score
534
+ all_metrics = {}
535
+ reverse_map = {v : k for k , v in AUTOMLX_METRIC_MAP .items ()}
536
+ all_metrics = {reverse_map [key ]: - 1 * value for key , value in all_metrics .items () if key in reverse_map }
537
+ return all_metrics
532
538
533
539
def generate_train_metrics (self ) -> pd .DataFrame :
534
540
"""
535
- Generate Training Metrics when fitted data is not available.
541
+ Generate Training Metrics for Automlx
536
542
"""
537
543
total_metrics = pd .DataFrame ()
538
544
for s_id in self .forecast_output .list_series_ids ():
539
545
try :
540
- metrics = { self .spec . metric . upper (): self . models [s_id ]["score" ]}
546
+ metrics = self .models [s_id ]["score" ]
541
547
metrics_df = pd .DataFrame .from_dict (
542
548
metrics , orient = "index" , columns = [s_id ]
543
549
)
0 commit comments