{
"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
}