# Copyright 2025 Sergio Nava Muñoz and Mario Graff Guerrero
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from functools import wraps
from sklearn import metrics
from CompStats.interface import Perf
from CompStats.utils import metrics_docs
########################################################
#################### Classification ####################
########################################################
[docs]
@metrics_docs(hy_name='y_pred', attr_name='score_func')
def accuracy_score(y_true, *y_pred,
normalize=True, sample_weight=None,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""accuracy_score"""
@wraps(metrics.accuracy_score)
def inner(y, hy):
return metrics.accuracy_score(y, hy,
normalize=normalize,
sample_weight=sample_weight)
return Perf(y_true, *y_pred, score_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='score_func')
def balanced_accuracy_score(y_true, *y_pred,
sample_weight=None, adjusted=False,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""balanced_accuracy_score"""
@wraps(metrics.balanced_accuracy_score)
def inner(y, hy):
return metrics.balanced_accuracy_score(y, hy,
adjusted=adjusted,
sample_weight=sample_weight)
return Perf(y_true, *y_pred, score_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_score', attr_name='score_func')
def top_k_accuracy_score(y_true, *y_score, k=2,
normalize=True, sample_weight=None,
labels=None,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""top_k_accuracy_score"""
@wraps(metrics.top_k_accuracy_score)
def inner(y, hy):
return metrics.top_k_accuracy_score(y, hy, k=k,
normalize=normalize, sample_weight=sample_weight,
labels=labels)
return Perf(y_true, *y_score, score_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_score', attr_name='score_func')
def average_precision_score(y_true, *y_score,
average='macro',
sample_weight=None,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""average_precision_score"""
@wraps(metrics.average_precision_score)
def inner(y, hy):
return metrics.average_precision_score(y, hy,
average=average,
sample_weight=sample_weight)
return Perf(y_true, *y_score, score_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_proba', attr_name='error_func')
def brier_score_loss(y_true, *y_proba,
sample_weight=None,
pos_label=None,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs
):
"""brier_score_loss"""
@wraps(metrics.brier_score_loss)
def inner(y, hy):
return metrics.brier_score_loss(y, hy,
sample_weight=sample_weight,
pos_label=pos_label)
return Perf(y_true, *y_proba, score_func=None, error_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='score_func')
def f1_score(y_true, *y_pred, labels=None, pos_label=1,
average='binary', sample_weight=None,
zero_division='warn', num_samples: int=500,
n_jobs: int=-1, use_tqdm=True,
**kwargs):
"""f1_score"""
@wraps(metrics.f1_score)
def inner(y, hy):
return metrics.f1_score(y, hy, labels=labels,
pos_label=pos_label,
average=average,
sample_weight=sample_weight,
zero_division=zero_division)
return Perf(y_true, *y_pred, score_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='error_func')
def log_loss(y_true, *y_pred,
normalize=True,
sample_weight=None,
labels=None,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""log_loss"""
@wraps(metrics.log_loss)
def inner(y, hy):
return metrics.log_loss(y, hy, normalize=normalize,
sample_weight=sample_weight,
labels=labels)
return Perf(y_true, *y_pred, error_func=inner, score_func=None,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='score_func')
def precision_score(y_true,
*y_pred,
labels=None,
pos_label=1,
average='binary',
sample_weight=None,
zero_division='warn',
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""precision_score"""
@wraps(metrics.precision_score)
def inner(y, hy):
return metrics.precision_score(y, hy,
labels=labels,
pos_label=pos_label,
average=average,
sample_weight=sample_weight,
zero_division=zero_division)
return Perf(y_true, *y_pred, score_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='score_func')
def recall_score(y_true,
*y_pred,
labels=None,
pos_label=1,
average='binary',
sample_weight=None,
zero_division='warn',
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""recall_score"""
@wraps(metrics.recall_score)
def inner(y, hy):
return metrics.recall_score(y, hy,
labels=labels,
pos_label=pos_label,
average=average,
sample_weight=sample_weight,
zero_division=zero_division)
return Perf(y_true, *y_pred, score_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='score_func')
def jaccard_score(y_true,
*y_pred,
labels=None,
pos_label=1,
average='binary',
sample_weight=None,
zero_division='warn',
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""jaccard_score"""
@wraps(metrics.jaccard_score)
def inner(y, hy):
return metrics.jaccard_score(y, hy,
labels=labels,
pos_label=pos_label,
average=average,
sample_weight=sample_weight,
zero_division=zero_division)
return Perf(y_true, *y_pred, score_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_score', attr_name='score_func')
def roc_auc_score(y_true,
*y_score,
average='macro',
sample_weight=None,
max_fpr=None,
multi_class='raise',
labels=None,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""roc_auc_score"""
@wraps(metrics.roc_auc_score)
def inner(y, hy):
return metrics.roc_auc_score(y, hy,
average=average,
sample_weight=sample_weight,
max_fpr=max_fpr,
multi_class=multi_class,
labels=labels)
return Perf(y_true, *y_score, score_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_proba', attr_name='score_func')
def d2_log_loss_score(y_true, *y_proba,
sample_weight=None,
labels=None,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""d2_log_loss_score"""
@wraps(metrics.d2_log_loss_score)
def inner(y, hy):
return metrics.d2_log_loss_score(y, hy,
sample_weight=sample_weight,
labels=labels)
return Perf(y_true, *y_proba, score_func=inner, error_func=None,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
########################################################
#################### Regression ########################
########################################################
[docs]
@metrics_docs(hy_name='y_pred', attr_name='score_func')
def explained_variance_score(y_true,
*y_pred,
sample_weight=None,
multioutput='uniform_average',
force_finite=True,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""explained_variance_score"""
@wraps(metrics.explained_variance_score)
def inner(y, hy):
return metrics.explained_variance_score(y, hy,
sample_weight=sample_weight,
multioutput=multioutput,
force_finite=force_finite)
return Perf(y_true, *y_pred, score_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='error_func')
def max_error(y_true, *y_pred,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""max_error"""
@wraps(metrics.max_error)
def inner(y, hy):
return metrics.max_error(y, hy)
return Perf(y_true, *y_pred, score_func=None, error_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='error_func')
def mean_absolute_error(y_true,
*y_pred,
sample_weight=None,
multioutput='uniform_average',
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""mean_absolute_error"""
@wraps(metrics.mean_absolute_error)
def inner(y, hy):
return metrics.mean_absolute_error(y, hy,
sample_weight=sample_weight,
multioutput=multioutput)
return Perf(y_true, *y_pred, score_func=None, error_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='error_func')
def mean_squared_error(y_true,
*y_pred,
sample_weight=None,
multioutput='uniform_average',
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""mean_squared_error"""
@wraps(metrics.mean_squared_error)
def inner(y, hy):
return metrics.mean_squared_error(y, hy,
sample_weight=sample_weight,
multioutput=multioutput)
return Perf(y_true, *y_pred, score_func=None, error_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='error_func')
def root_mean_squared_error(y_true,
*y_pred,
sample_weight=None,
multioutput='uniform_average',
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""root_mean_squared_error"""
@wraps(metrics.root_mean_squared_error)
def inner(y, hy):
return metrics.root_mean_squared_error(y, hy,
sample_weight=sample_weight,
multioutput=multioutput)
return Perf(y_true, *y_pred, score_func=None, error_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='error_func')
def mean_squared_log_error(y_true,
*y_pred,
sample_weight=None,
multioutput='uniform_average',
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""mean_squared_log_error"""
@wraps(metrics.mean_squared_log_error)
def inner(y, hy):
return metrics.mean_squared_log_error(y, hy,
sample_weight=sample_weight,
multioutput=multioutput)
return Perf(y_true, *y_pred, score_func=None, error_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='error_func')
def root_mean_squared_log_error(y_true,
*y_pred,
sample_weight=None,
multioutput='uniform_average',
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""root_mean_squared_log_error"""
@wraps(metrics.root_mean_squared_log_error)
def inner(y, hy):
return metrics.root_mean_squared_log_error(y, hy,
sample_weight=sample_weight,
multioutput=multioutput)
return Perf(y_true, *y_pred, score_func=None, error_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='score_func')
def r2_score(y_true,
*y_pred,
sample_weight=None,
multioutput='uniform_average',
force_finite=True,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""r2_score"""
@wraps(metrics.r2_score)
def inner(y, hy):
return metrics.r2_score(y, hy,
sample_weight=sample_weight,
multioutput=multioutput,
force_finite=force_finite)
return Perf(y_true, *y_pred, score_func=inner, error_func=None,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='error_func')
def mean_poisson_deviance(y_true,
*y_pred,
sample_weight=None,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""mean_poisson_deviance"""
@wraps(metrics.mean_poisson_deviance)
def inner(y, hy):
return metrics.mean_poisson_deviance(y, hy,
sample_weight=sample_weight)
return Perf(y_true, *y_pred, score_func=None, error_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='error_func')
def mean_gamma_deviance(y_true,
*y_pred,
sample_weight=None,
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""mean_gamma_deviance"""
@wraps(metrics.mean_gamma_deviance)
def inner(y, hy):
return metrics.mean_gamma_deviance(y, hy,
sample_weight=sample_weight)
return Perf(y_true, *y_pred, score_func=None, error_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='error_func')
def mean_absolute_percentage_error(y_true,
*y_pred,
sample_weight=None,
multioutput='uniform_average',
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""mean_absolute_percentage_error"""
@wraps(metrics.mean_absolute_percentage_error)
def inner(y, hy):
return metrics.mean_absolute_percentage_error(y, hy,
sample_weight=sample_weight,
multioutput=multioutput)
return Perf(y_true, *y_pred, score_func=None, error_func=inner,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)
[docs]
@metrics_docs(hy_name='y_pred', attr_name='score_func')
def d2_absolute_error_score(y_true,
*y_pred,
sample_weight=None,
multioutput='uniform_average',
num_samples: int=500,
n_jobs: int=-1,
use_tqdm=True,
**kwargs):
"""d2_absolute_error_score"""
@wraps(metrics.d2_absolute_error_score)
def inner(y, hy):
return metrics.d2_absolute_error_score(y, hy,
sample_weight=sample_weight,
multioutput=multioutput)
return Perf(y_true, *y_pred, score_func=inner, error_func=None,
num_samples=num_samples, n_jobs=n_jobs,
use_tqdm=use_tqdm,
**kwargs)