File size: 4,930 Bytes
370eab2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
019cdb7
370eab2
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import evaluate
from datasets import Features, Value
from scipy.stats import kendalltau, pearsonr, spearmanr
from sklearn.metrics import (
    max_error,
    mean_absolute_error,
    mean_absolute_percentage_error,
    mean_squared_error,
    r2_score,
)

_CITATION = """
@article{scikit-learn,
  title={Scikit-learn: Machine Learning in {P}ython},
  author={Pedregosa, F. and Varoquaux, G. and Gramfort, A. and Michel, V.
         and Thirion, B. and Grisel, O. and Blondel, M. and Prettenhofer, P.
         and Weiss, R. and Dubourg, V. and Vanderplas, J. and Passos, A. and
         Cournapeau, D. and Brucher, M. and Perrot, M. and Duchesnay, E.},
  journal={Journal of Machine Learning Research},
  volume={12},
  pages={2825--2830},
  year={2011}
}

@article{2020SciPy-NMeth,
  author  = {Virtanen, Pauli and Gommers, Ralf and Oliphant, Travis E. and
            Haberland, Matt and Reddy, Tyler and Cournapeau, David and
            Burovski, Evgeni and Peterson, Pearu and Weckesser, Warren and
            Bright, Jonathan and {van der Walt}, St{\'e}fan J. and
            Brett, Matthew and Wilson, Joshua and Millman, K. Jarrod and
            Mayorov, Nikolay and Nelson, Andrew R. J. and Jones, Eric and
            Kern, Robert and Larson, Eric and Carey, C J and
            Polat, {\.I}lhan and Feng, Yu and Moore, Eric W. and
            {VanderPlas}, Jake and Laxalde, Denis and Perktold, Josef and
            Cimrman, Robert and Henriksen, Ian and Quintero, E. A. and
            Harris, Charles R. and Archibald, Anne M. and
            Ribeiro, Ant{\^o}nio H. and Pedregosa, Fabian and
            {van Mulbregt}, Paul and {SciPy 1.0 Contributors}},
  title   = {{{SciPy} 1.0: Fundamental Algorithms for Scientific
            Computing in Python}},
  journal = {Nature Methods},
  year    = {2020},
  volume  = {17},
  pages   = {261--272},
  adsurl  = {https://rdcu.be/b08Wh},
  doi     = {10.1038/s41592-019-0686-2},
}
"""


_DESCRIPTION = """
This evaluator computes multiple regression metrics to assess the performance of a model. Metrics calculated include: mean absolute error (MAE),
mean absolute percentage error (MAPE), mean squared error (MSE), R-squared (R2), max error (ME), Pearson, Spearman and Kendall Tau correlation measures.
"""

_KWARGS_DESCRIPTION = """
Args:
    predictions (`list` of `float`): Predicted values.
    references (`list` of `float`): Ground truth values.
Returns:
    Returns: a dict containing:
        mean_absolute_error (float): https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_absolute_error.html
        mean_absolute_performance_error (float): https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_absolute_percentage_error.html
        mean_squared_error (float): https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html
        r2_score (float): https://scikit-learn.org/stable/modules/generated/sklearn.metrics.r2_score.html
        max_error (float): https://scikit-learn.org/stable/modules/generated/sklearn.metrics.max_error.html
        pearson_correlation (Tuple[float, float]): the first value being the score and the second one the p-value
                                                   (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.pearsonr.html)
        spearman_correlation (Tuple[float, float]): the first value being the score and the second one the p-value
                                                    (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.spearmanr.html)
        kendall_tau_correlation (Tuple[float, float]): the first value being the score and the second one the p-value
                                                       (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kendalltau.html)
"""


class RegressionEvaluator(evaluate.Metric):
    def _info(self):
        return evaluate.MetricInfo(
            description=_DESCRIPTION,
            citation=_CITATION,
            inputs_description=_KWARGS_DESCRIPTION,
            features=Features(
                {"predictions": Value("float"), "references": Value("float")}
            ),
        )

    def _compute(self, predictions, references):
        error_fns = [
            mean_absolute_error,
            mean_absolute_percentage_error,
            mean_squared_error,
            max_error,
            r2_score,
        ]
        correlation_fns = [pearsonr, spearmanr, kendalltau]
        results = {}

        # Compute error functions
        for fn in error_fns:
            results[fn.__name__] = float(fn(references, predictions))

        # Compute statistical measures with p-values
        for fn in correlation_fns:
            output = fn(references, predictions)
            score, p_value = output.statistic, output.pvalue
            results[fn.__name__] = (float(score), float(p_value))

        return results