Skip to content

Instantly share code, notes, and snippets.

@mrtzh
Last active Aug 29, 2015
Embed
What would you like to do?
heritage health prize
{
"metadata": {
"language": "Julia",
"name": "",
"signature": "sha256:4d8ce63592fdb86a859bb9fdac3429d74f5cc6198ea5752b0f1ccf5fff72a92e"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# The Leaderboard Problem #\n",
"\n",
"The code below describes a general method by which a competitor in a machine learning competition can produce a highly misleading public leaderboard. I illustrate the problem through the [Heritage Health Prize](http://www.heritagehealthprize.com/c/hhp) competition that was hosted by [Kaggle](http://www.kaggle.com) and ran from April 2011 through April 2013.\n",
"\n",
"Similar ideas apply to essentially any machine learning competition. The goal of this note is to illustrate the underlying problem. I made no effort to optimize the algorithm for this competition (which might lead to better results).\n",
"\n",
"Details on how to avoid this problem and how to maintain an accurate leaderboard are the subject of [a recent paper](http://arxiv.org/abs/1502.04585)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## What we know about the leaderboard ##\n",
"\n",
"I don't have the actual data for the heritage health prize. So everything I'm going to say applies only under several assumptions on the actual data that seem reasonable to me. The general idea would've applied to the actual data as well, but the exact results would've been different."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# score function \n",
"score(x,y) = sqrt(sum(log((1+x)./(1+y)).^2)/length(x))\n",
"\n",
"# number of test samples\n",
"N = 70943\n",
"# used for the public leaderboard\n",
"n = int(0.3*N)\n",
"\n",
"# score best constant predictor\n",
"const_benchmark = 0.486459\n",
"# best constant\n",
"const_value = 0.209179\n",
"# all zeros prediction\n",
"zeros_benchmark = 0.522226;"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Based on these values, we can make some inferences about the holdout values $a_1,\\dots,a_n.$ Specifically, the best constant benchmark ``c`` must satisfy (as we can see by taking derivatives)\n",
"$$\n",
"\\log(1+c) = \\frac 1n\\sum_{i=1}^n \\log(1+a_i)\n",
"$$\n",
"Assuming that ``c=0.209179`` as suggested by Kaggle, this pins down the mean (or first moment) of the $\\log(1+a_i)$ values. Similarly, the zeros benchmark pins down the second moment\n",
"$$\n",
"0.522226 = \\frac 1n\\sum_{i=1}^n \\log(1+a_i)^2\n",
"$$"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"first_moment = log(1+const_value)\n",
"second_moment = zeros_benchmark;"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## A simple model for the holdout values ##\n",
"\n",
"As we don't know the true holdout values, we instead sample them from a reasonable probabilistic model for the sake of this exercise.\n",
"\n",
"For each $i=1,\\dots,n$, we do the following independently:\n",
"\n",
"* With probability $1-p$, we put $\\log(1+a_i)=0,$\n",
"* with probability $p$, we sample $\\log(1+a_i)$ from $\\mathrm{Unif}([0,t])$. \n",
"\n",
"This seems reasonable, because most patients don't go to the hospital at all (so we're in the first case). With probability $p$ the patient goes to the hospital in which case the log-duration might be roughly uniform in some interval. This doesn't account for very long hospital stays, but the score function treats all long enough stays roughly the same.\n",
"\n",
"The first moment of the above distribution is equal to\n",
"$pt/2$. The second moment is equal to $pt^2/3$.\n",
"Given the above information, we can solve for $p$ and $t$. Using those parameters, we can sample holdout values."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"t = 3*second_moment/(2*first_moment)\n",
"p = 2*first_moment/t\n",
"\n",
"# sample holdout values\n",
"solution = exp(t*rand(n) .* float(rand(n) .< p))-1;"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Boosting attack ##\n",
"\n",
"The boosting attack takes two starting solutions $v_1$ and $v_2$ and tries to improve on the mean score achieved by those two solutions. It does so by trying out random combinations of the two vectors and selecting those that improve on the mean score. A final step aggregates all improving combinations into a single combination using a majority vote."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# select coordinate from v1 if where v is 1 and from v2 where v is 0\n",
"combine(v,v1,v2) = v1 .* v + v2 .* (1-v)\n",
"\n",
"function boost(v1,v2,k,score)\n",
" m = mean([score(v1),score(v2)])\n",
" A = rand(0:1,(length(v1),k))\n",
" # select columns of A that give better than mean score\n",
" a = filter(i -> score(combine(A[:,i],v1,v2)) < m,[1:k])\n",
" # take majority vote over all selected columns\n",
" v = float(A[:,a] * ones(length(a)) .> length(a)/2.0)\n",
" return combine(v,v1,v2)\n",
"end"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
"boost (generic function with 1 method)"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# our score function\n",
"s(x) = round(score(solution,x),5)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 5,
"text": [
"s (generic function with 1 method)"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see how this works below. We choose as the starting point two random perturbations of the true solution. Any two solutions will work instead provided that they are \"sufficiently different\". The boosting attack will approach the best \"combination\" of $v_1$ and $v_2.$ So, if the two solutions are too similar, the improvement will be small."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals = [1,100,200,300,400,500,600,700]\n",
"function expmt()\n",
" v1 = solution + 1.15 * rand(n)\n",
" v2 = solution + 1.15 * rand(n)\n",
" return Float64[ s(boost(v1,v2,i,s)) for i in vals ]\n",
"end"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": [
"expmt (generic function with 1 method)"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"reps = 10\n",
"S = zeros(reps,length(vals))\n",
"for i in 1:reps\n",
" S[i,:] = expmt()\n",
"end\n",
"means = [mean(S[:,j]) for j in 1:length(vals)]\n",
"stds = [std(S[:,j]) for j in 1:length(vals)];"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"using PyPlot"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stderr",
"text": [
"INFO: Loading help data...\n"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plot(vals,means)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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/fr1ZGVl0bhxY/r06UN8fDzly5enSZMmLFmyJKw6t27dStWqVcOae9SQIdChA9x6K3zxRYE+KkmSpGKmQCE4KyuLhISEPONHxzJ/4OmyUaNGER8fz8CBA485Z+PGjQCMGzeOt99+m8mTJ5Oens6+ffto3749H3zwwXG/45133uHdd9/lxhtv/KHbySUmBqZOhbg4uOkmOHiwQB+XJElSMVKgELx3715iY2PzjJctWzbn/WPZsGEDEydO5IknnqBMmTLHnLd79+6cPxcuXMhtt93G7bffzoIFC8jOzmbMmDHH/Oy2bdvo2bMn5557LkOGDAn3tnKceSa88gqsXAnDhxf445IkSSomShdkclxcHPv3788zvm/fvpz3j6V///4kJyfTtWvXH/wOgOTkZGrWrJkznpiYSJs2bVi2bFm+n/vuu+/o2LEj3333HfPnz8/TK/y/BgwYQOXKlXONpaSkkJKSwm9+Aw88AJdeCp07H/cykiRJ+hGmT5/O9OnTc43t3Lmz0L+3QCE4ISEh35aHrKwsAGrUqJHv5xYtWsT8+fOZPXs2mzZtyhk/+tDb5s2bqVKlChUqVMi5Rn49w1WrVs237/jAgQN069aNDz/8kPnz59OwYcMfvJfx48cf82nDQYPgnXfg9tth7Vo455wfvJwkSZJOwNFFyO87ujtEYSpQO0SzZs3YsGEDu3btyjW+YsUKAJo2bZrv57Zs2QJAt27dOPfcc3NemZmZLFq0iDp16pCeng5A48aNKVOmTL47TWRmZuZ54O3IkSPcdtttLF68mJdffplLL720ILeUr1AI0tOhcmW48UY4cOBHX1KSJElFSIFCcPfu3Tl8+DCTJk3KGdu/fz/p6ekkJSXltC9s3bqVTz75hEP/OX2iXbt2zJ07N9drzpw5VK1alVatWjF37lw6duwIQIUKFXIO3/j0009zvufjjz9m2bJlXHXVVblquv/++3n11Vd59tlnuf7660/sV8jH6afDq68GK8En0F4sSZKkIqxA7RCtW7emR48eDBs2jG3btlG3bl2mTp3Kli1bclZyAYYOHcq0adPYtGkTtWvXJjExkcTExDzX69+/P9WrV6fz/zTejh49moULF9K2bVv69etHdnY2EydO5Mwzz2T4955YGz9+PM899xwXX3wxcXFxvPjii7mu061btx/sDT6eVq3gySehX7+gP/hn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RioiIkIRERFu7zdhwgQ1atRIiYmJzraMjAwlJSVp2LBhio6OVk5OjlauXKlNmzZp7NixLnd3mzRpookTJ+qVV17RhQsX1KlTJ61atUqffvqpli5dSgAGAADAFZU4BEvS4sWLNW3aNKWnp+vkyZNq37691qxZo+7duzv7WJZVogBaXJ+oqCj16NFDK1eu1LFjx+RwONS6dWulpqZq9OjRbv1ffPFF1a1bV6mpqVq4cKFiY2O1ZMkS3XvvvaW5LAAAAHiZEk+HAAAAAGqKEu8YBwAAANQUXhOC8/LylJycrPDwcAUFBalLly5av369p4dVrZ07d07PPvus7rjjDtWrV08Oh0OLFi0qtu/u3bt1xx13qHbt2goNDdX999+vH3/8sdi+b731llq1aqXAwEDFxsbq9ddfr8zLqNY+//xzPfLII2rTpo1CQkJ04403aujQodq3b59bX2pcert27dLgwYMVHR2t4OBghYaGqmvXrlqyZIlbX+pbMf74xz/K4XCoXbt2bueocel98skncjgcxR7btm1z6Ut9y2fHjh1KTExUaGiogoOD1a5dO+eD90Wocek98MADV/wddjgcLkvWVnl9jZe49957ja+vr3nyySdNWlqa6dq1q/H19TWffvqpp4dWbf373/82lmWZqKgo85vf/MZYlmUWLVrk1u/QoUOmfv36pnnz5mbOnDnm+eefN/Xq1TNxcXEmPz/fpe+bb75pLMsygwcPNvPnzzf333+/sSzLvPTSS1V1WdXKPffcY8LDw82ECRPMW2+9ZVJSUkzjxo1NSEiI+frrr539qHHZ/O///q+54447zPTp0838+fPN7NmzTY8ePYxlWSYlJcXZj/pWjEOHDpmgoCATEhJi2rVr53aOGpfehg0bjGVZZuLEiWbJkiUux48//ujsR33LZ926dcbPz88kJCSYWbNmmfnz55vJkyeb5ORkZx9qXDabN292+91NT083wcHBpm3bts5+nqivV4TgrVu3GsuyzJ/+9CdnW25uromJiTFdu3b14Miqt7y8PPP9998bY4zZvn37FUPwuHHjTHBwsDl06JCzbf369cayLDNv3jxn2/nz501oaKjp37+/y+tHjBhhQkJCzMmTJyvpSqqvTZs2mQsXLri07du3zwQEBJgRI0Y426hxxSksLDRxcXEmMjLS2UZ9K8bQoUPN7bffbnr16uXy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",
"text": [
"Figure(PyObject <matplotlib.figure.Figure object at 0x119913690>)"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"1-element Array{Any,1}:\n",
" PyObject <matplotlib.lines.Line2D object at 0x119eaeb10>"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"means"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 10,
"text": [
"8-element Array{Any,1}:\n",
" 0.462311\n",
" 0.458926\n",
" 0.457263\n",
" 0.455562\n",
" 0.454849\n",
" 0.453569\n",
" 0.453071\n",
" 0.451868"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Getting to rank 1 ###\n",
"\n",
"This seems to require a lot more submissions and we can iterate the boosting attack."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"scores = Float64[]\n",
"for i in 1:reps\n",
" v1 = solution + 1.15 * rand(n)\n",
" v2 = solution + 1.15 * rand(n)\n",
" v21 = boost(v1,v2,500,s)\n",
" v22 = boost(v1,v2,500,s)\n",
" v31 = boost(v21,v22,500,s)\n",
" v32 = boost(v21,v22,500,s)\n",
" v4 = boost(v31,v32,500,s)\n",
" push!(scores,s(v4))\n",
"end\n",
"mean(scores)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": [
"0.4425490000000001"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment