# Copyright 2020 The HuggingFace Datasets Authors and the current dataset script contributor. # # 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. """Average Precision""" import evaluate import datasets from sklearn.metrics import average_precision_score # TODO: Add BibTeX citation _CITATION = """\ @InProceedings{huggingface:module, title = {A great new module}, authors={chanelcolgate, Inc.}, year={2023} } """ # TODO: Add description of the module here _DESCRIPTION = """\ Average Precision """ # TODO: Add description of the arguments of the module here _KWARGS_DESCRIPTION = """ Note: To be consistent with the `evaluate` input conventions the scikit-learn inputs are renamed: - `y_true`: `references` - `y_pred`: `prediction_scores` Scikit-learn docstring: Average precision score. Compute average precision (AP) from prediction scores. AP summarizes a precision-recall curve as the weighted mean of precisions achieved at each threshold, with the increase in recall from the previous threshold used as the weight: .. math:: \\text{AP} = \\sum_n (R_n - R_{n-1}) P_n where :math:`P_n` and :math:`R_n` are the precision and recall at the nth threshold [1]_. This implementation is not interpolated and is different from computing the area under the precision-recall curve with the trapezoidal rule, which uses linear interpolation and can be too optimistic. Note: this implementation is restricted to the binary classification task or multilabel classification task. Read more in the :ref:`User Guide >> import numpy as np >>> from sklearn.metrics import average_precision_score >>> y_true = np.array([0, 0, 1, 1]) >>> y_scores = np.array([0.1, 0.4, 0.35, 0.8]) >>> average_precision_score(y_true, y_scores) 0.8333333333333333 """ @evaluate.utils.file_utils.add_start_docstrings( _DESCRIPTION, _KWARGS_DESCRIPTION ) class AveragePrecision(evaluate.Metric): """TODO: Short description of my evaluation module.""" def _info(self): # TODO: Specifies the evaluate.EvaluationModuleInfo object return evaluate.MetricInfo( # This is the description that will appear on the modules page. module_type="metric", description=_DESCRIPTION, citation=_CITATION, inputs_description=_KWARGS_DESCRIPTION, # This defines the format of each prediction and reference features=[ datasets.Features( { "references": datasets.Value("int64"), "prediction_scores": datasets.Value("float"), } ), datasets.Features( { "references": datasets.Sequence( datasets.Value("int64") ), "prediction_scores": datasets.Sequence( datasets.Value("float") ), } ), ], # Homepage of the module for documentation homepage="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.average_precision_score.html", # Additional links to the codebase or references codebase_urls=["https://github.com/scikit-learn/scikit-learn"], reference_urls=["https://scikit-learn.org/stable/index.html"], ) def _download_and_prepare(self, dl_manager): """Optional: download external resources useful to compute the scores""" # TODO: Download external resources if needed pass def _compute( self, references, prediction_scores, average="macro", pos_label=1, sample_weight=None, ): """Returns the scores""" # TODO: Compute the different scores of the module return { "average_precision_score": average_precision_score( y_true=references, y_score=prediction_scores, average=average, pos_label=pos_label, sample_weight=sample_weight, ) }