{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from sklearn.metrics import average_precision_score as skaverage_precision_score" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def average_precision_score(y_true, y_score):\n", " desc_score_indices = np.argsort(y_score, kind=\"mergesort\")[::-1]\n", " y_true = y_true[desc_score_indices]\n", " y_score = y_score[desc_score_indices]\n", " distinct_value_indices = np.where(np.diff(y_score))[0]\n", " threshold_idxs = np.r_[distinct_value_indices, y_true.size - 1]\n", " tps = np.cumsum(y_true)[threshold_idxs]\n", " fps = 1 + threshold_idxs - tps\n", " thresholds = y_score[threshold_idxs]\n", " precision = tps / (tps + fps)\n", " recall = tps / tps[-1]\n", " precision = np.r_[1, precision]\n", " recall = np.r_[0, recall]\n", " return np.sum(np.diff(recall) * np.array(precision)[1:])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "for i in range(10):\n", " rng = np.random.RandomState(i)\n", " y_true = rng.randint(2, size=10)\n", " y_score = rng.randint(11, size=10) / 10\n", " ans1 = average_precision_score(y_true, y_score)\n", " ans2 = skaverage_precision_score(y_true, y_score)\n", " assert np.allclose(ans1, ans2)" ] } ], "metadata": { "kernelspec": { "display_name": "dev", "language": "python", "name": "dev" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }