Skip to content

Instantly share code, notes, and snippets.

@mattsgithub
Last active April 9, 2019 04:05
Show Gist options
  • Save mattsgithub/dedaa017adc1f30d9833175a5c783221 to your computer and use it in GitHub Desktop.
Save mattsgithub/dedaa017adc1f30d9833175a5c783221 to your computer and use it in GitHub Desktop.
Code for IBotta ROC AUC Blog
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import time\n",
"import numpy as np\n",
"import time\n",
"from sklearn.metrics import roc_auc_score, average_precision_score\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def roc_auc_alternative(y_true, y_score):\n",
" \n",
" # Total number of observations\n",
" N = y_true.shape[0]\n",
" \n",
" # Index vector\n",
" I = np.arange(1, N + 1)\n",
" \n",
" # Number of positive observations\n",
" N_pos = np.sum(y_true)\n",
" \n",
" # Number of negative observations\n",
" N_neg = N - N_pos\n",
" \n",
" # Sort true labels according to scores\n",
" I = y_score.argsort()[::-1][:N]\n",
" y_pred = y_true[I]\n",
" \n",
" # Index vector\n",
" I = np.arange(1, N + 1)\n",
" \n",
" return 1. + ((N_pos + 1.) / (2 * N_neg)) - (1. / (N_pos * N_neg)) * I.dot(y_pred)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"np.random.seed(42)\n",
"N = np.arange(start=10, stop=1000000, step=10000)\n",
"\n",
"t_sklearn = []\n",
"t_dot = []\n",
"\n",
"for n in N:\n",
" N_pos = np.random.randint(low=1, high=n+1)\n",
" y_true = np.concatenate((np.ones(N_pos), np.zeros(n - N_pos)))\n",
" y_score = np.random.random(size=n)\n",
" \n",
" # Timeit\n",
" t0 = time.time()\n",
" y1 = roc_auc_score(y_true=y_true, y_score=y_score)\n",
" t1 = time.time()\n",
" t_sklearn.append(t1 - t0)\n",
" \n",
" # Timeit\n",
" t0 = time.time()\n",
" y2 = roc_auc_alternative(y_true=y_true, y_score=y_score)\n",
" t1 = time.time()\n",
" t_dot.append(t1 - t0)\n",
" \n",
" # Proves their equality\n",
" # Raises error if not almost equal (up to 14 decimal places)\n",
" np.testing.assert_almost_equal(y1, y2, decimal=14)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x101f0f5c0>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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n/6kGzZsCM69ZMkSbW1t1fr6ei0uLtZdu3bp+++/r0cccYSqqt55553B+2hvb9cVK1boe++9p08//bTm5uZqbW2ttre3a2FhoV5zzTWqqnrzzTfrN7/5zaj3fu211+qaNWu0vb1d6+vrNT8/Xzs7O/tdW1W1q6tLm5qaVFW1vr5e58+fr729vQcd59/+8Y9/rOedd56qqlZUVOjs2bO1ra0t6t+Pn3j+R4yBaWxs1Jdeekm3bt2qFRUVunXrVn3ppZe0sbEx2UuLCFCucT5vx00UU6xs2QJTp8KUKc6293PLFiguHtrcS5Ysobq6mgceeIBPfepT/fY1NTXxpS99iaqqKkSErq6u4L6TTjopGP2waNEiPvjgA2bPnk1aWlrQh7FixQqeeOKJsNc95phj+Otf/0pbW1vwm/O///u/U1BQ0M+8NG/ePJYtWxacr7q6esB7irSGJ598km3btgWP279/P83NzZx//vls2LCBb33rW9x7772cd955B80ZKapmoGibefPmUVZWBsARRxzBSSedhIhQVlbW7142bNhAZmYmmZmZrFu3jpdffjl43wCPP/44f//734Pmm6amJqqqqkhLS2PVqlXMmjULgPnz53PyyScDUFZWFvzWHuneAU477TTS09NJT09nxowZYbU+VeV73/sezz77LJMmTWLXrl1hj/Pz/PPP8/Wvfx2Aww8/nLlz5/LOO+8Akf9+jMSRm5vLwoULqa2tpbm5mezsbObOnTvuopgmnICor4eZM/uP5eTAAP+fMbN+/XouvfRSNm/ezN69e4PjV199NevWreOhhx6iurqatWvXBvelp6cH36ekpNDd3Q1AIBAIPjS98Z6eHlasWBG81g033MCxxx7LHXfcQXt7O1/72tcoKChg27ZtBwmI0Ot4JqZohFsDOOajF198kYyMjH7H5+TkMHPmTJ566ilefvll7r///oPmnDZtGrt37+43duDAgQF9Df71T5o0Kbg9adKk4LrgYEETuq2q3HbbbZxyyin9xjdv3hzTNSLde+ga/b8vP/fffz/19fW88sorBAIBSkpKhpSnEMs1jeEnNzd33AmEUCacD6KgANwve0Gam53x4eD888/n2muvDX7T9Whqago6rTdu3Djo+VNSUnj99dd5/fXXueGGGwBYs2YNL774IvX19cyYMQMRoaCggIcffjjof4iVyZMnc+DAgQGPO/nkk7ntttuC26+//nrw/QUXXMA555zDmWeeSUpKykHnnnDCCTzyyCPB6/zxj39k6dKlYY8dDA8//DDt7e3s3buXzZs3s2rVqn77TznlFH7xi18Etbh33nknLuditHsPR+jvtKmpiRkzZhAIBHj66af54IMPwh7n5/jjjw8K23feeYcdO3awcOHCmNdsGINhwgmIVaugsRH274feXudnY6MzPhwUFxfzjW9846Dxyy+/nCuvvJIjjzxy2L/h5eXlUVBQwBFHHBEcW7NmDXV1dSxdujSuuS666CJOPfXUoJM6Erfeeivl5eUsWbKERYsWcccddwT3rV+/nubm5rDmJXBMcZdccgnHHXccy5Yt44477uCee+6Ja53RWLJkCevWrePoo4/m6quvprCwsN/+Cy64gEWLFrF8+XIWL17MV77ylbg+k2j3Ho5p06Zx7LHHsnjxYi677DLOPvtsysvLKSsr47777uPwww8Pe5yfr371q/T29lJWVsbnPvc5Nm7c2E9zMIxEMOZ6Uq9cuVJDGwZVVFRQWloa8xw1NY7Pob7e0RxWrRq6/8Hoo7y8nG9/+9s899xzI37t6667jpycHC699NIRv/ZoJt7/EWP8ISKvqOrKeM6ZcD4IcISBCYTEcOONN/KLX/wirO/BMIyxxYTUIAxjomH/I8ZgNIgJ54MwDMMwYsMEhGEYhhEWExCGYRhGWExAGIZhGGExATHClJeXB/MkwpW9htjLb2/evDnh5cRDueOOO7jvvvuGZa61a9cSGnAwUmzcuDGm0syhx11wwQX9ymwYxnhmQoa5JpOVK1eycmX0QAIvQxocAXHOOeeQlZWVsDV1d3eTmhrbn8LFF1+csHWMJBs3bmTx4sUHJdENdNxwJvQZxmhnQmoQTU1NVFRUUF5eTkVFxZC7QLW0tHDaaaexdOlSFi9ezIMPPgjAli1bOOaYY1i6dCmrV6/mwIEDEb/133333Xzyk5+kra0tavntaGs4//zzWb16NUceeWSwhHR1dTXHH388y5cvZ/ny5cHeEZs3b+b4449n/fr1LFq0iOrqakpLS8OWA/fj13rWrl3Lt7/9bVauXElpaSlbtmzh9NNPZ8GCBVx11VXB6x9++OGcffbZlJaWcsYZZ4TViB5//HHWrFnD8uXLOfPMM4PF70pKSrjyyitZtmwZK1eu5NVXX+WUU05h/vz5/TKYb7rppmD57muvvTZ47XD3tGnTJsrLyzn77LNZtmwZbW1t3HDDDaxatYrFixdz0UUXoaphj/NrPQ888ABlZWUsXryYK664IriWWMq0G8aYIN7yr8l+DbXcdyLK9G7atEkvuOCCftfo6OjQefPm6csvv6yqfeW+/SXAvbLXt912m65fv17b29tVNXr5bT/+ua688spg+e59+/bpggULtLm5WVtaWrStrU1VVd955x31fn9PP/20ZmVl6Xvvvaeq0cuB+/GX6j7xxBP18ssvV1WnHPasWbOCpbKLiop0z549+v777yugzz//vKqqnnfeef3O37Jli9bX1+vxxx+vzc3Nqqp644036vXXXx+8/5///Oeqqvqtb31Ly8rKdP/+/VpXV6czZsxQVaes+IUXXqi9vb3a09Ojp512mj7zzDNR78m7tsfevXuD788555xgifPQ47ztXbt26ezZs7Wurk67urp03bp1+tBDD6lq7GXaRxIr920wiHLfE06DSESrwLKyMp544gmuuOIKnnvuOXJzc6msrGTWrFnBQnFTpkwJa8a57777+POf/8ymTZuGVFvn8ccf58Ybb2TZsmWsXbuW9vZ2duzYQVdXFxdeeCFlZWWceeaZ/eznq1evZt68ecHtwZQDX79+ffB3cMQRRzBr1izS09M55JBD2LlzJwCzZ88OFg0855xzeP755/vN8eKLL7Jt2zaOPfZYli1bxq9+9atgAbvQaxx11FFMnjyZgoIC0tPTaWxs5PHHH+fxxx/nyCOPZPny5bz99ttUVVXFdU9PP/00Rx11FGVlZTz11FO89dZbUe97y5YtrF27loKCAlJTUzn77LN59tlngYNLpMfyezSM0ciE80G0tLSQk5PTbywtLS1o0hgMhx12GK+++iqPPvooV111FSeddBKf+cxnYjq3rKyM119/nZqamn4P63A89NBDXH/99cDBtnBV5Q9/+MNBFT6vu+46Zs6cydatW+nt7e1Xojq0+9VgyoH7y2GHlsr2CuDFUn77E5/4BA888MCgrqGqXHnllXzlK1/pd151dXVM99Te3s5Xv/pVysvLmT17Ntddd92Qym9HKpFuGGONCadBJKJVYG1tLVlZWZxzzjlcdtllvPrqqyxcuJDdu3ezZcsWwOl3EO5BceSRR3LnnXeyfv36sFqMvwT0Zz7zmWCp71BH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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(N, t_dot, marker='o', color='blue', alpha=0.3, label='Mann-Whitney U implementation')\n",
"plt.scatter(N, t_sklearn, marker='o', color='gray', alpha=0.3, label='scikit-learn implementation')\n",
"plt.title('Comparing Times')\n",
"plt.ylabel('Time (seconds)')\n",
"plt.xlabel('Number of Observations')\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10326c2b0>]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"delta = np.array(t_sklearn) - np.array(t_dot)\n",
"plt.ylabel('Time Difference (seconds)')\n",
"plt.xlabel('Number of Observations')\n",
"plt.plot(N, delta)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment