Newer
Older
abgabensammlungSS15 / is / kaggle / ExerciseSheetKaggle.ipynb
@Jan-Peter Hohloch Jan-Peter Hohloch on 2 Jun 2015 61 KB IS: Add kaggle stuff
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "preamble": true
   },
   "source": [
    "(Defining latex commands: not to be shown...)\n",
    "$$\n",
    "\\newcommand{\\norm}[1]{\\left \\| #1 \\right \\|}\n",
    "\\DeclareMathOperator{\\minimize}{minimize}\n",
    "\\DeclareMathOperator{\\maximize}{maximize}\n",
    "\\newcommand{\\real}{\\mathbb{R}}\n",
    "\\newcommand{\\blasso}{\\beta^{\\mathrm{LASSO}}}\n",
    "\\newcommand{\\bzero}{\\beta^0}\n",
    "\\newcommand{\\bLS}{\\hat{\\beta}^{\\mathrm{LS}}}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Weight shrinkage competition\n",
    "\n",
    "In this competition you will work on a real world dataset. The objective is to try and predict weight of some person using historical data collected over several years.\n",
    "\n",
    "The competition is hosted on [Kaggle website](https://inclass.kaggle.com/c/weightshrinkage). This competition is by invitiation only, we will send out invitations to all emails registered on the Google mailing list. You can participate in groups of two or individually, Kaggle will help you how to participate in groups.\n",
    "\n",
    "In order to get a full mark for this competition you should get pass the benchmark evaluation. In this sheet you will get an idea how to do that."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Interploation techniques\n",
    "\n",
    "The dataset you will be working with is an instance of a time series. Time series are different from what you may typically see in Machine Learning problems. The most important distinction between a time series and other datasets is that data points are no longer iid (**i**ndependently and **i**dentically **d**istributed).\n",
    "\n",
    "Analysis of time series is a rich field of study. Here we show you one very simple method to work with time series. The dataset you download from the website contains many NA (**N**ot **A**ssigned) values. These missing values arise naturally in many datasets. Sometimes measurements are not made for every record or sometimes the data is corrupted. In this case, most NA values are cases where no measurement was made.\n",
    "\n",
    "Since the dataset is a time series one simple approach is to fill in the NA values with neighboring values. This works particularly well when missing values are scattered and there are no missing values in long continuous ranges. Unfortunately our dataset suffers from this issue but we will use this technique as a first step. Feel free to use other methods to improve your result. Our objective is to fill in missing values for the *Weight* vector which is our target variable via interpolation.\n",
    "\n",
    "## Interpolation in Python\n",
    "\n",
    "You can do interpolation in Python using many different packages. Here we use [Pandas](http://pandas.pydata.org/) which is a common library for data analysis. The difference between Pandas and Numpy is the way data is layed out in memory which makes many operations efficient and easy.\n",
    "\n",
    "As usual we start with loading the package:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pandas provide similar, and sometimes more advanced, functionalities for loading different kinds of data. One if its particular strength is in working with time series data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>FoodWeight</th>\n",
       "      <th>Weight</th>\n",
       "      <th>Calories</th>\n",
       "      <th>Proteins</th>\n",
       "      <th>Lipids</th>\n",
       "      <th>Carbohydrates</th>\n",
       "      <th>Remarks</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2013-06-11</th>\n",
       "      <td> 401</td>\n",
       "      <td> 30.92</td>\n",
       "      <td> 91.3</td>\n",
       "      <td> 2107</td>\n",
       "      <td> 156</td>\n",
       "      <td> 43</td>\n",
       "      <td> 270</td>\n",
       "      <td>     NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-12</th>\n",
       "      <td> 402</td>\n",
       "      <td> 30.31</td>\n",
       "      <td> 91.4</td>\n",
       "      <td> 2057</td>\n",
       "      <td> 125</td>\n",
       "      <td> 40</td>\n",
       "      <td> 293</td>\n",
       "      <td>     NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-13</th>\n",
       "      <td> 403</td>\n",
       "      <td> 34.11</td>\n",
       "      <td> 91.2</td>\n",
       "      <td> 2151</td>\n",
       "      <td> 119</td>\n",
       "      <td> 33</td>\n",
       "      <td> 341</td>\n",
       "      <td>     NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-14</th>\n",
       "      <td> 404</td>\n",
       "      <td>   NaN</td>\n",
       "      <td> 91.7</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td> VisitTo</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-15</th>\n",
       "      <td> 405</td>\n",
       "      <td> 28.95</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 2418</td>\n",
       "      <td> 160</td>\n",
       "      <td> 47</td>\n",
       "      <td> 311</td>\n",
       "      <td>     NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-16</th>\n",
       "      <td> 406</td>\n",
       "      <td>   NaN</td>\n",
       "      <td> 91.8</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td> VisitTo</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-17</th>\n",
       "      <td> 407</td>\n",
       "      <td> 31.00</td>\n",
       "      <td> 92.6</td>\n",
       "      <td> 2211</td>\n",
       "      <td> 171</td>\n",
       "      <td> 49</td>\n",
       "      <td> 264</td>\n",
       "      <td>     NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-18</th>\n",
       "      <td> 408</td>\n",
       "      <td> 36.42</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 2274</td>\n",
       "      <td> 167</td>\n",
       "      <td> 23</td>\n",
       "      <td> 342</td>\n",
       "      <td>     NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-19</th>\n",
       "      <td> 409</td>\n",
       "      <td> 38.14</td>\n",
       "      <td> 91.9</td>\n",
       "      <td> 2274</td>\n",
       "      <td> 137</td>\n",
       "      <td> 33</td>\n",
       "      <td> 346</td>\n",
       "      <td>     NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-20</th>\n",
       "      <td> 410</td>\n",
       "      <td>   NaN</td>\n",
       "      <td> 91.7</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td> VisitTo</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             ID  FoodWeight  Weight  Calories  Proteins  Lipids  \\\n",
       "Date                                                              \n",
       "2013-06-11  401       30.92    91.3      2107       156      43   \n",
       "2013-06-12  402       30.31    91.4      2057       125      40   \n",
       "2013-06-13  403       34.11    91.2      2151       119      33   \n",
       "2013-06-14  404         NaN    91.7       NaN       NaN     NaN   \n",
       "2013-06-15  405       28.95     NaN      2418       160      47   \n",
       "2013-06-16  406         NaN    91.8       NaN       NaN     NaN   \n",
       "2013-06-17  407       31.00    92.6      2211       171      49   \n",
       "2013-06-18  408       36.42     NaN      2274       167      23   \n",
       "2013-06-19  409       38.14    91.9      2274       137      33   \n",
       "2013-06-20  410         NaN    91.7       NaN       NaN     NaN   \n",
       "\n",
       "            Carbohydrates  Remarks  \n",
       "Date                                \n",
       "2013-06-11            270      NaN  \n",
       "2013-06-12            293      NaN  \n",
       "2013-06-13            341      NaN  \n",
       "2013-06-14            NaN  VisitTo  \n",
       "2013-06-15            311      NaN  \n",
       "2013-06-16            NaN  VisitTo  \n",
       "2013-06-17            264      NaN  \n",
       "2013-06-18            342      NaN  \n",
       "2013-06-19            346      NaN  \n",
       "2013-06-20            NaN  VisitTo  "
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv(\"./datasets/kag_train.csv\",index_col='Date',parse_dates='Date')\n",
    "data[400:410]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This line loads the data, treats *Date* field in the dataset as Datetime and sets *Date* column as the index of the loaded Table. The standard data structure in Pandas is *Dataframe*, a dataframe contains several *Series* with the same index. If the index is a time series Panda will automatically constructs appropriate indexing. Also note that Pandas detects NA values automatically."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes.AxesSubplot at 0x7f41c22f39d0>"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nGIZhGD3D/wPgTbK5MtCyEgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f41c1cda3d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "data['Weight'].plot(marker = 'x',title='reported Weight')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we would like to perform interpolation for missing values in the *Weight* column. To do so we first select the column we would like to make the interpolation for and then apply the $\\texttt{interpolate}$ function on the Series we selected."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>FoodWeight</th>\n",
       "      <th>Weight</th>\n",
       "      <th>Calories</th>\n",
       "      <th>Proteins</th>\n",
       "      <th>Lipids</th>\n",
       "      <th>Carbohydrates</th>\n",
       "      <th>Remarks</th>\n",
       "      <th>WeightInter</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2013-06-11</th>\n",
       "      <td> 401</td>\n",
       "      <td> 30.92</td>\n",
       "      <td> 91.3</td>\n",
       "      <td> 2107</td>\n",
       "      <td> 156</td>\n",
       "      <td> 43</td>\n",
       "      <td> 270</td>\n",
       "      <td>     NaN</td>\n",
       "      <td> 91.30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-12</th>\n",
       "      <td> 402</td>\n",
       "      <td> 30.31</td>\n",
       "      <td> 91.4</td>\n",
       "      <td> 2057</td>\n",
       "      <td> 125</td>\n",
       "      <td> 40</td>\n",
       "      <td> 293</td>\n",
       "      <td>     NaN</td>\n",
       "      <td> 91.40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-13</th>\n",
       "      <td> 403</td>\n",
       "      <td> 34.11</td>\n",
       "      <td> 91.2</td>\n",
       "      <td> 2151</td>\n",
       "      <td> 119</td>\n",
       "      <td> 33</td>\n",
       "      <td> 341</td>\n",
       "      <td>     NaN</td>\n",
       "      <td> 91.20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-14</th>\n",
       "      <td> 404</td>\n",
       "      <td>   NaN</td>\n",
       "      <td> 91.7</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td> VisitTo</td>\n",
       "      <td> 91.70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-15</th>\n",
       "      <td> 405</td>\n",
       "      <td> 28.95</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 2418</td>\n",
       "      <td> 160</td>\n",
       "      <td> 47</td>\n",
       "      <td> 311</td>\n",
       "      <td>     NaN</td>\n",
       "      <td> 91.75</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-16</th>\n",
       "      <td> 406</td>\n",
       "      <td>   NaN</td>\n",
       "      <td> 91.8</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td> VisitTo</td>\n",
       "      <td> 91.80</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-17</th>\n",
       "      <td> 407</td>\n",
       "      <td> 31.00</td>\n",
       "      <td> 92.6</td>\n",
       "      <td> 2211</td>\n",
       "      <td> 171</td>\n",
       "      <td> 49</td>\n",
       "      <td> 264</td>\n",
       "      <td>     NaN</td>\n",
       "      <td> 92.60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-18</th>\n",
       "      <td> 408</td>\n",
       "      <td> 36.42</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 2274</td>\n",
       "      <td> 167</td>\n",
       "      <td> 23</td>\n",
       "      <td> 342</td>\n",
       "      <td>     NaN</td>\n",
       "      <td> 92.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-19</th>\n",
       "      <td> 409</td>\n",
       "      <td> 38.14</td>\n",
       "      <td> 91.9</td>\n",
       "      <td> 2274</td>\n",
       "      <td> 137</td>\n",
       "      <td> 33</td>\n",
       "      <td> 346</td>\n",
       "      <td>     NaN</td>\n",
       "      <td> 91.90</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-06-20</th>\n",
       "      <td> 410</td>\n",
       "      <td>   NaN</td>\n",
       "      <td> 91.7</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td> VisitTo</td>\n",
       "      <td> 91.70</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             ID  FoodWeight  Weight  Calories  Proteins  Lipids  \\\n",
       "Date                                                              \n",
       "2013-06-11  401       30.92    91.3      2107       156      43   \n",
       "2013-06-12  402       30.31    91.4      2057       125      40   \n",
       "2013-06-13  403       34.11    91.2      2151       119      33   \n",
       "2013-06-14  404         NaN    91.7       NaN       NaN     NaN   \n",
       "2013-06-15  405       28.95     NaN      2418       160      47   \n",
       "2013-06-16  406         NaN    91.8       NaN       NaN     NaN   \n",
       "2013-06-17  407       31.00    92.6      2211       171      49   \n",
       "2013-06-18  408       36.42     NaN      2274       167      23   \n",
       "2013-06-19  409       38.14    91.9      2274       137      33   \n",
       "2013-06-20  410         NaN    91.7       NaN       NaN     NaN   \n",
       "\n",
       "            Carbohydrates  Remarks  WeightInter  \n",
       "Date                                             \n",
       "2013-06-11            270      NaN        91.30  \n",
       "2013-06-12            293      NaN        91.40  \n",
       "2013-06-13            341      NaN        91.20  \n",
       "2013-06-14            NaN  VisitTo        91.70  \n",
       "2013-06-15            311      NaN        91.75  \n",
       "2013-06-16            NaN  VisitTo        91.80  \n",
       "2013-06-17            264      NaN        92.60  \n",
       "2013-06-18            342      NaN        92.25  \n",
       "2013-06-19            346      NaN        91.90  \n",
       "2013-06-20            NaN  VisitTo        91.70  "
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['WeightInter'] = data['Weight'].interpolate()\n",
    "data[400:410]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Comparing the values in *Weight* and *WeightInter* we can see pandas used a linear interpolation to fill in null values in our dataset. We can now store the results and make a submission on Kaggle.\n",
    "\n",
    "# Kaggle submission\n",
    "\n",
    "In order to make a submission we should make predictions for specific dates, indexed by ID. The first step is to load the indices from *test.csv* file."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td> 183</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td> 184</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td> 185</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td> 186</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td> 187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td> 192</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td> 197</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td> 203</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td> 209</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td> 210</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    ID\n",
       "0  183\n",
       "1  184\n",
       "2  185\n",
       "3  186\n",
       "4  187\n",
       "5  192\n",
       "6  197\n",
       "7  203\n",
       "8  209\n",
       "9  210"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test = pd.read_csv(\"./datasets/kag_test.csv\")\n",
    "test[:10]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that we did not use *ID* as the index therefore pandas created an index for us. Now we use the $\\texttt{join}$ operation to join these indices to our original dataset. In order to join two so-called frames we need to set the Index column of the our training set to *ID*. This will allow us to join two frames on this column."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>FoodWeight</th>\n",
       "      <th>Weight</th>\n",
       "      <th>Calories</th>\n",
       "      <th>Proteins</th>\n",
       "      <th>Lipids</th>\n",
       "      <th>Carbohydrates</th>\n",
       "      <th>Remarks</th>\n",
       "      <th>WeightInter</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td> 183</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> 2201</td>\n",
       "      <td>  93</td>\n",
       "      <td>  47</td>\n",
       "      <td> 327</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 92.083333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td> 184</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> 2387</td>\n",
       "      <td> 159</td>\n",
       "      <td>  59</td>\n",
       "      <td> 300</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 91.966667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td> 185</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> 2106</td>\n",
       "      <td>  87</td>\n",
       "      <td>  30</td>\n",
       "      <td> 370</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 91.850000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td> 186</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> 1914</td>\n",
       "      <td>  78</td>\n",
       "      <td>  30</td>\n",
       "      <td> 328</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 91.733333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td> 187</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> 2311</td>\n",
       "      <td> 106</td>\n",
       "      <td>  38</td>\n",
       "      <td> 374</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 91.616667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td> 192</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td> NaN</td>\n",
       "      <td> Lazy</td>\n",
       "      <td> 91.533333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td> 197</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> 2359</td>\n",
       "      <td> 148</td>\n",
       "      <td>  33</td>\n",
       "      <td> 311</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 91.575000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td> 203</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> 2488</td>\n",
       "      <td>  97</td>\n",
       "      <td> 115</td>\n",
       "      <td> 262</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 91.320000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td> 209</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> 2826</td>\n",
       "      <td> 129</td>\n",
       "      <td>  90</td>\n",
       "      <td> 367</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 90.850000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td> 210</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td> 2197</td>\n",
       "      <td> 137</td>\n",
       "      <td>  51</td>\n",
       "      <td> 295</td>\n",
       "      <td>  NaN</td>\n",
       "      <td> 90.825000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    ID  FoodWeight  Weight  Calories  Proteins  Lipids  Carbohydrates Remarks  \\\n",
       "0  183         NaN     NaN      2201        93      47            327     NaN   \n",
       "1  184         NaN     NaN      2387       159      59            300     NaN   \n",
       "2  185         NaN     NaN      2106        87      30            370     NaN   \n",
       "3  186         NaN     NaN      1914        78      30            328     NaN   \n",
       "4  187         NaN     NaN      2311       106      38            374     NaN   \n",
       "5  192         NaN     NaN       NaN       NaN     NaN            NaN    Lazy   \n",
       "6  197         NaN     NaN      2359       148      33            311     NaN   \n",
       "7  203         NaN     NaN      2488        97     115            262     NaN   \n",
       "8  209         NaN     NaN      2826       129      90            367     NaN   \n",
       "9  210         NaN     NaN      2197       137      51            295     NaN   \n",
       "\n",
       "   WeightInter  \n",
       "0    92.083333  \n",
       "1    91.966667  \n",
       "2    91.850000  \n",
       "3    91.733333  \n",
       "4    91.616667  \n",
       "5    91.533333  \n",
       "6    91.575000  \n",
       "7    91.320000  \n",
       "8    90.850000  \n",
       "9    90.825000  "
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = data.set_index('ID')\n",
    "predictions = test.join(data,on='ID')\n",
    "predictions[:10]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now observe that *WeightInter* contains predictions for all IDs. The only thing left now is to save the results and make a submission."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "predictions[['ID','WeightInter']].to_csv('sampleSubmission.csv',\n",
    "                                         header = ['ID','Weight'],\n",
    "                                         index_label=False,index=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The first 5 lines of the file will look like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ID,Weight\r\n",
      "183,92.08333333333334\r\n",
      "184,91.96666666666667\r\n",
      "185,91.85\r\n",
      "186,91.73333333333333\r\n"
     ]
    }
   ],
   "source": [
    "!head -5 myFirstSubmission"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Remarks\n",
    "\n",
    "This was the first step to build a model for predicting the weight. What else can be done?\n",
    "\n",
    "In order to predict time series values, one often computes a trendline using the target variable only (as you have just done for the weight), and then one considers the residuals between the observed values and this trendline. Those residuals are then regressed on the predictor variables (here: calories, proteins, etc.). \n",
    "\n",
    "That is, if you want to obtain better predictions, you may either use more sophisticated interpolation methods that yield better trendlines or you use regression methods (e.g. those from the lecture) in order to find a good model for the residuals using the predictor variables.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Working with categorical data\n",
    "\n",
    "If you want to use the Remark column to make predictions, you will have to find a way to handle categorical data. There are several ways to do so. Let us present two of them.\n",
    "\n",
    "1. Predict the mean of the output variable (for example the Weight, or its residual), conditionnally to the value of Remark.\n",
    "2. Convert the categorical data to numerical data, and use any standard regression method (for example linear regression).\n",
    "\n",
    "To convert categorical data to numerical data, again, there are several options. Here are two of them.\n",
    "\n",
    "1. If you have only 2 categories, then you are fine by just assigning 1 number to the first, and another to the second category: for example 0 and 1. However, usually, if you have more than 2 categories, it is a bad idea to assign each category a randomly chosen number. This is because 1 is nearer from 2 than it is from 3, but it may not make any sense to say that the first category is more similar to the second than it is to the third.\n",
    "2. Make a vector with length the number of different categories, where all entries are set to 0, except that of the active category, which is set to 1. For example, if you want to model data with 3 categories, say \"VisitOf\",\"VisitTo\",\"NoRemark\", then you would use a vector $v$ of length 3, where $v=(0,0,1)$, $v=(0,1,0)$ and $v=(1,0,0)$ encode respectively \"NoRemark\", \"VisitTo\", \"VisitOf\". Note that some would prefer an encoding like: $v = (0,0)$, $v=(0,1)$ and $v=(1,0)$.\n",
    "\n",
    "Finally, note that you are free to build new categories and more generally new features. You may for example merge different categories into a single one, or create new categories like \"isNA\" and \"isNotNA\". Or create new numerical vectors like the average food weight during the past 7 days, etc."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# A final piece of advice\n",
    "\n",
    "There are as many models to predict the weights as you may think of. However, very simple models offen yield among the best results if used with the right input features.\n",
    "Thus, before starting to think about which (sophisticated) prediction method you may use, have a very close look at the data and think twice at what could be the relevant features to your problem. And if not provided, construct them!"
   ]
  }
 ],
 "metadata": {
  "annotations": {
   "author": "",
   "categories": [
    "intelligent-systems-1-2015"
   ],
   "date": "2015-05-21",
   "location": "Kaggle Website",
   "parent": "IS_SS2015",
   "submission_date": "2015-06-11",
   "subtitle": "Exercise Sheet 5, Kaggle competition",
   "tags": [
    "IntelligenSystems",
    "Course"
   ],
   "title": "Intelligent Systems 1 - Summer Semester 2015"
  },
  "celltoolbar": "Edit Metadata",
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}