Skip to content

Instantly share code, notes, and snippets.

@svendroid
Last active November 20, 2020 09:01
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save svendroid/015f2e807ff1f436b69d54bfe9687ee4 to your computer and use it in GitHub Desktop.
Save svendroid/015f2e807ff1f436b69d54bfe9687ee4 to your computer and use it in GitHub Desktop.
I tried to predict the numbers of bike counts in the city of munich based on weather information and the date as practice for the Chapter 9 “Tabular Modelling Deep Dive” of the fastai_v2 course.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Predicting Bike count in Munich (Project Chapter 9 Tabular Modelling Deep Dive)\n",
"\n",
"To get some pratical experience I chose my own project to practice the concepts introduced in Chapter 9 \"Tabular Modelling Deep Dive\" of the fastai_v2 course. I wanted to share my approach and would be happy if you could point me to errors, misunderstandings or possible improvements.\n",
"\n",
"1. [Goal](#introduction)\n",
"2. [Data](#data)\n",
" 1. [Get data](#getdata)\n",
" 1. [Explore data](#exploredata)\n",
"3. [Modelling](#model)\n",
" 1. [Random Forest](#rf)\n",
" 2. [Neuronal Net](#nn) \n",
"4. [Conclusion and open questions](#conclusion)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. My Goal <a name=\"introduction\"></a>\n",
"\n",
"The city of munich counts the number of bikers on six counting stations throughout munich. They provide those numbers to the public in their open data portal.\n",
"\n",
"Based on this data, can I create a model that predicts the number of bikers for a given day?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. The data <a name=\"data\"></a>\n",
"\n",
"At the momente there are 6 permanent bike counting stations in munich. They count bikes with sensors build into the street. The data can be accessed via the open data portal api. e.g. all currently available datasets can be retrieved with this call: https://www.opengov-muenchen.de/api/3/action/package_search?q=Raddauerz%C3%A4hlstellen&rows=1000\n",
"\n",
"In April 2020 the counting station Kreuther changed. The sensor size approximatly doubled in size. Take this into account for data after 1. april.\n",
"\n",
"More information:\n",
"\n",
"* OpenDataPortal Munich Website (german): https://www.opengov-muenchen.de/dataset?tags=Raddauerz%C3%A4hlstellen\n",
"* Info about bike counting stations (Raddauerzählstellen) (german): https://www.opengov-muenchen.de/pages/raddauerzaehlstellen\n",
"* API Doku: https://docs.ckan.org/en/ckan-2.5.3/api/\n",
"* Analysis of data 2017 & 2018 in german - [„Aufs Radl – Fertig? – Los!“ Ergebnisse der Raddauerzählstellen in München 2017 und 2018 (PDF)](https://www.muenchen.de/rathaus/dam/jcr:9a65625e-952f-470f-b6a1-d4270f4526cb/mb190304.pdf)\n",
"\n",
"\n",
"### 2.1 Get data <a name=\"getdata\"></a>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"import os\n",
"import itertools"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"r = requests.get('https://www.opengov-muenchen.de/api/3/action/package_search?q=Raddauerz%C3%A4hlstellen&rows=1000')\n",
"json = r.json()"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [],
"source": [
"#json"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def download_csv(url):\n",
" filename = 'data/' + url.rsplit('/',1)[1]\n",
" if os.path.exists(filename):\n",
" print(f'{filename} already exists')\n",
" else:\n",
" r = requests.get(url)\n",
" os.makedirs(os.path.dirname(filename), exist_ok=True)\n",
" with open(filename, 'wb') as f:\n",
" f.write(r.content)\n",
" print(f'{filename} downloaded.')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"resources = [[{'name':res['name'], 'url':res['url']} for res in result['resources'] if res['name'] != 'Raddauerzählstellen in München'] for result in json['result']['results']]\n",
"resources = list(itertools.chain.from_iterable(resources))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"data/rad20170615min.csv already exists\n",
"data/rad201706tage.csv already exists\n",
"data/rad20201015min.csv already exists\n",
"data/rad202010tage.csv already exists\n",
"data/rad20200915min.csv already exists\n",
"data/rad202009tage.csv already exists\n",
"data/rad20200815min.csv already exists\n",
"data/rad202008tage.csv already exists\n",
"data/rad20200715min.csv already exists\n",
"data/rad202007tage.csv already exists\n",
"data/rad20200615min.csv already exists\n",
"data/rad202006tage.csv already exists\n",
"data/rad20200115min.csv already exists\n",
"data/rad202001tage.csv already exists\n",
"data/rad20200315min.csv already exists\n",
"data/rad202003tage.csv already exists\n",
"data/rad20200215min.csv already exists\n",
"data/rad202002tage.csv already exists\n",
"data/rad20190415min.csv already exists\n",
"data/rad201904tage.csv already exists\n",
"data/rad20181115min.csv already exists\n",
"data/rad201811tage.csv already exists\n",
"data/rad20170715min.csv already exists\n",
"data/rad201707tage.csv already exists\n",
"data/rad20170115min.csv already exists\n",
"data/rad201701tage.csv already exists\n",
"data/rad20200415min.csv already exists\n",
"data/rad202004tage.csv already exists\n",
"data/rad20191115min.csv already exists\n",
"data/rad201911tage.csv already exists\n",
"data/rad20190915min.csv already exists\n",
"data/rad201909tage.csv already exists\n",
"data/rad20190815min.csv already exists\n",
"data/rad201908tage.csv already exists\n",
"data/rad20190715min.csv already exists\n",
"data/rad201907tageneu.csv already exists\n",
"data/rad20190515min.csv already exists\n",
"data/rad201905tage.csv already exists\n",
"data/rad20190315min.csv already exists\n",
"data/rad201903tage.csv already exists\n",
"data/rad20190115min.csv already exists\n",
"data/rad201901tage.csv already exists\n",
"data/rad20180315min.csv already exists\n",
"data/rad201803tage.csv already exists\n",
"data/rad20181215min.csv already exists\n",
"data/rad201812tage.csv already exists\n",
"data/rad20181015min.csv already exists\n",
"data/rad201810tage.csv already exists\n",
"data/rad20170315min.csv already exists\n",
"data/rad201703tage.csv already exists\n",
"data/rad20171215min.csv already exists\n",
"data/rad201712tage.csv already exists\n",
"data/rad20171115min.csv already exists\n",
"data/rad201711tage.csv already exists\n",
"data/rad20171015min.csv already exists\n",
"data/rad201710tage.csv already exists\n",
"data/rad20170415min.csv already exists\n",
"data/rad201704tage.csv already exists\n",
"data/rad20170515min.csv already exists\n",
"data/rad201705tage.csv already exists\n",
"data/rad20180215min.csv already exists\n",
"data/rad201802tage.csv already exists\n",
"data/rad20180415min.csv already exists\n",
"data/rad201804tage.csv already exists\n",
"data/rad20180615min.csv already exists\n",
"data/rad201806tage.csv already exists\n",
"data/rad20180815min.csv already exists\n",
"data/rad201808tage.csv already exists\n",
"data/rad20191215min.csv already exists\n",
"data/rad201912tage.csv already exists\n",
"data/rad20191015min.csv already exists\n",
"data/rad201910tage.csv already exists\n",
"data/rad20190215min.csv already exists\n",
"data/rad201902tage.csv already exists\n",
"data/rad20180915min.csv already exists\n",
"data/rad201809tage.csv already exists\n",
"data/rad20170815min.csv already exists\n",
"data/rad201708tage.csv already exists\n",
"data/rad20180715min.csv already exists\n",
"data/rad201807tage.csv already exists\n",
"data/rad20170915min.csv already exists\n",
"data/rad201709tage.csv already exists\n",
"data/rad201702tage.csv already exists\n",
"data/rad20170215min.csv already exists\n",
"data/rad20180115min.csv already exists\n",
"data/rad201801tage.csv already exists\n",
"data/rad20180515min.csv already exists\n",
"data/rad201805tage.csv already exists\n",
"data/rad20200515min.csv already exists\n",
"data/rad202005tage.csv already exists\n",
"data/rad20190615min.csv already exists\n",
"data/rad201906tageneu.csv already exists\n"
]
}
],
"source": [
"for res in resources:\n",
" download_csv(res['url'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2. Explore data"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# pip install pandas"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"files = [f for f in os.listdir('data') if os.path.isfile(os.path.join('data', f))]\n",
"files.sort()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Data complete?\n",
"For each month there should be two csv files (15 min und day). Therefore there should 92 files `(3 years * 12 month + 10 (10 for october)) * 2`"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(files) == (3 * 12 + 10) * 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### How does the data look like?"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>datum</th>\n",
" <th>uhrzeit_start</th>\n",
" <th>uhrzeit_ende</th>\n",
" <th>zaehlstelle</th>\n",
" <th>richtung_1</th>\n",
" <th>richtung_2</th>\n",
" <th>gesamt</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2020.10.01</td>\n",
" <td>00:00</td>\n",
" <td>00:15</td>\n",
" <td>Arnulf</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2020.10.01</td>\n",
" <td>00:15</td>\n",
" <td>00:30</td>\n",
" <td>Arnulf</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2020.10.01</td>\n",
" <td>00:30</td>\n",
" <td>00:45</td>\n",
" <td>Arnulf</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2020.10.01</td>\n",
" <td>00:45</td>\n",
" <td>01:00</td>\n",
" <td>Arnulf</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2020.10.01</td>\n",
" <td>01:00</td>\n",
" <td>01:15</td>\n",
" <td>Arnulf</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17851</th>\n",
" <td>2020.10.31</td>\n",
" <td>22:45</td>\n",
" <td>23:00</td>\n",
" <td>Erhardt</td>\n",
" <td>5</td>\n",
" <td>14</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17852</th>\n",
" <td>2020.10.31</td>\n",
" <td>23:00</td>\n",
" <td>23:15</td>\n",
" <td>Erhardt</td>\n",
" <td>8</td>\n",
" <td>11</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17853</th>\n",
" <td>2020.10.31</td>\n",
" <td>23:15</td>\n",
" <td>23:30</td>\n",
" <td>Erhardt</td>\n",
" <td>5</td>\n",
" <td>9</td>\n",
" <td>14</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17854</th>\n",
" <td>2020.10.31</td>\n",
" <td>23:30</td>\n",
" <td>23:45</td>\n",
" <td>Erhardt</td>\n",
" <td>5</td>\n",
" <td>9</td>\n",
" <td>14</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17855</th>\n",
" <td>2020.10.31</td>\n",
" <td>23:45</td>\n",
" <td>00:00</td>\n",
" <td>Erhardt</td>\n",
" <td>5</td>\n",
" <td>8</td>\n",
" <td>13</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>17856 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" datum uhrzeit_start uhrzeit_ende zaehlstelle richtung_1 \\\n",
"0 2020.10.01 00:00 00:15 Arnulf 2 \n",
"1 2020.10.01 00:15 00:30 Arnulf 1 \n",
"2 2020.10.01 00:30 00:45 Arnulf 0 \n",
"3 2020.10.01 00:45 01:00 Arnulf 0 \n",
"4 2020.10.01 01:00 01:15 Arnulf 1 \n",
"... ... ... ... ... ... \n",
"17851 2020.10.31 22:45 23:00 Erhardt 5 \n",
"17852 2020.10.31 23:00 23:15 Erhardt 8 \n",
"17853 2020.10.31 23:15 23:30 Erhardt 5 \n",
"17854 2020.10.31 23:30 23:45 Erhardt 5 \n",
"17855 2020.10.31 23:45 00:00 Erhardt 5 \n",
"\n",
" richtung_2 gesamt \n",
"0 0 2 \n",
"1 0 1 \n",
"2 0 0 \n",
"3 0 0 \n",
"4 0 1 \n",
"... ... ... \n",
"17851 14 19 \n",
"17852 11 19 \n",
"17853 9 14 \n",
"17854 9 14 \n",
"17855 8 13 \n",
"\n",
"[17856 rows x 7 columns]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_min15 = pd.read_csv('data/rad20201015min.csv')\n",
"df_min15"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>datum</th>\n",
" <th>uhrzeit_start</th>\n",
" <th>uhrzeit_ende</th>\n",
" <th>zaehlstelle</th>\n",
" <th>richtung_1</th>\n",
" <th>richtung_2</th>\n",
" <th>gesamt</th>\n",
" <th>min-temp</th>\n",
" <th>max-temp</th>\n",
" <th>niederschlag</th>\n",
" <th>bewoelkung</th>\n",
" <th>sonnenstunden</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2020.10.01</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>1738</td>\n",
" <td>107</td>\n",
" <td>1845</td>\n",
" <td>6.5</td>\n",
" <td>19.4</td>\n",
" <td>0.0</td>\n",
" <td>65</td>\n",
" <td>8.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2020.10.02</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>1469</td>\n",
" <td>89</td>\n",
" <td>1558</td>\n",
" <td>9.8</td>\n",
" <td>18.4</td>\n",
" <td>0.0</td>\n",
" <td>99</td>\n",
" <td>0.9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2020.10.03</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>548</td>\n",
" <td>37</td>\n",
" <td>585</td>\n",
" <td>5.1</td>\n",
" <td>22.1</td>\n",
" <td>2.9</td>\n",
" <td>75</td>\n",
" <td>2.9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2020.10.04</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>821</td>\n",
" <td>37</td>\n",
" <td>858</td>\n",
" <td>4.7</td>\n",
" <td>17.3</td>\n",
" <td>0.7</td>\n",
" <td>73</td>\n",
" <td>6.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2020.10.05</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>1048</td>\n",
" <td>63</td>\n",
" <td>1111</td>\n",
" <td>9.0</td>\n",
" <td>14.6</td>\n",
" <td>4.7</td>\n",
" <td>98</td>\n",
" <td>1.8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>181</th>\n",
" <td>2020.10.27</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Erhardt</td>\n",
" <td>2289</td>\n",
" <td>2213</td>\n",
" <td>4502</td>\n",
" <td>3.9</td>\n",
" <td>11.1</td>\n",
" <td>0.0</td>\n",
" <td>75</td>\n",
" <td>1.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>182</th>\n",
" <td>2020.10.28</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Erhardt</td>\n",
" <td>2675</td>\n",
" <td>2592</td>\n",
" <td>5267</td>\n",
" <td>3.5</td>\n",
" <td>14.7</td>\n",
" <td>2.4</td>\n",
" <td>95</td>\n",
" <td>1.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>183</th>\n",
" <td>2020.10.29</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Erhardt</td>\n",
" <td>1334</td>\n",
" <td>1342</td>\n",
" <td>2676</td>\n",
" <td>8.9</td>\n",
" <td>11.2</td>\n",
" <td>15.5</td>\n",
" <td>94</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>184</th>\n",
" <td>2020.10.30</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Erhardt</td>\n",
" <td>2167</td>\n",
" <td>2142</td>\n",
" <td>4309</td>\n",
" <td>9.0</td>\n",
" <td>14.7</td>\n",
" <td>0.0</td>\n",
" <td>99</td>\n",
" <td>0.6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>185</th>\n",
" <td>2020.10.31</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Erhardt</td>\n",
" <td>2780</td>\n",
" <td>2621</td>\n",
" <td>5401</td>\n",
" <td>6.3</td>\n",
" <td>17.9</td>\n",
" <td>0.0</td>\n",
" <td>55</td>\n",
" <td>8.9</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>186 rows × 12 columns</p>\n",
"</div>"
],
"text/plain": [
" datum uhrzeit_start uhrzeit_ende zaehlstelle richtung_1 \\\n",
"0 2020.10.01 00:00 23.59 Arnulf 1738 \n",
"1 2020.10.02 00:00 23.59 Arnulf 1469 \n",
"2 2020.10.03 00:00 23.59 Arnulf 548 \n",
"3 2020.10.04 00:00 23.59 Arnulf 821 \n",
"4 2020.10.05 00:00 23.59 Arnulf 1048 \n",
".. ... ... ... ... ... \n",
"181 2020.10.27 00:00 23.59 Erhardt 2289 \n",
"182 2020.10.28 00:00 23.59 Erhardt 2675 \n",
"183 2020.10.29 00:00 23.59 Erhardt 1334 \n",
"184 2020.10.30 00:00 23.59 Erhardt 2167 \n",
"185 2020.10.31 00:00 23.59 Erhardt 2780 \n",
"\n",
" richtung_2 gesamt min-temp max-temp niederschlag bewoelkung \\\n",
"0 107 1845 6.5 19.4 0.0 65 \n",
"1 89 1558 9.8 18.4 0.0 99 \n",
"2 37 585 5.1 22.1 2.9 75 \n",
"3 37 858 4.7 17.3 0.7 73 \n",
"4 63 1111 9.0 14.6 4.7 98 \n",
".. ... ... ... ... ... ... \n",
"181 2213 4502 3.9 11.1 0.0 75 \n",
"182 2592 5267 3.5 14.7 2.4 95 \n",
"183 1342 2676 8.9 11.2 15.5 94 \n",
"184 2142 4309 9.0 14.7 0.0 99 \n",
"185 2621 5401 6.3 17.9 0.0 55 \n",
"\n",
" sonnenstunden \n",
"0 8.2 \n",
"1 0.9 \n",
"2 2.9 \n",
"3 6.5 \n",
"4 1.8 \n",
".. ... \n",
"181 1.5 \n",
"182 1.3 \n",
"183 0.0 \n",
"184 0.6 \n",
"185 8.9 \n",
"\n",
"[186 rows x 12 columns]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_day = pd.read_csv('data/rad202010tage.csv')\n",
"df_day"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Every file contains all counting_stations (zaehlstelle).\n",
"* The counts are in three value direction_1 (richtung_1), direction_2 (richtung_2) and total (gesamt)\n",
"* The day datasets also contain weather information - min/max temp, sun hours, rain and cloud"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['Arnulf', 'Kreuther', 'Olympia', 'Hirsch', 'Margareten', 'Erhardt'],\n",
" dtype=object)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Available counting stations (zaehlstellen):\n",
"df_day.zaehlstelle.unique()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"# getDataframe of datafiles\n",
"# - prefixes - filter used files by prefix e.g. rad2018 for year 2018\n",
"# - zaehlstelle - filter by given counting station ()\n",
"def getDataframe(prefixes, zaehlstelle: str):\n",
" files = [f for f in os.listdir('data') if os.path.isfile(os.path.join('data', f)) and f.endswith('tage.csv')]\n",
" files = [f for f in files if f.startswith(prefixes)]\n",
" df = pd.concat([pd.read_csv(os.path.join('data', f)) for f in files])\n",
" return df[df.zaehlstelle == zaehlstelle].sort_values(by=['datum'])"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"df_arnulf = getDataframe(zaehlstelle='Arnulf', prefixes = ('rad2017', 'rad2018', 'rad2019'))"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>datum</th>\n",
" <th>uhrzeit_start</th>\n",
" <th>uhrzeit_ende</th>\n",
" <th>zaehlstelle</th>\n",
" <th>richtung_1</th>\n",
" <th>richtung_2</th>\n",
" <th>gesamt</th>\n",
" <th>min-temp</th>\n",
" <th>max-temp</th>\n",
" <th>niederschlag</th>\n",
" <th>bewoelkung</th>\n",
" <th>sonnenstunden</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2017.01.01</td>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>121</td>\n",
" <td>14</td>\n",
" <td>135</td>\n",
" <td>-6.1</td>\n",
" <td>2.6</td>\n",
" <td>0.0</td>\n",
" <td>36</td>\n",
" <td>5.9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2017.01.02</td>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>362</td>\n",
" <td>38</td>\n",
" <td>400</td>\n",
" <td>-5.4</td>\n",
" <td>0.8</td>\n",
" <td>3.2</td>\n",
" <td>69</td>\n",
" <td>0.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2017.01.03</td>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>232</td>\n",
" <td>30</td>\n",
" <td>262</td>\n",
" <td>-2.1</td>\n",
" <td>0.6</td>\n",
" <td>0.0</td>\n",
" <td>85</td>\n",
" <td>3.6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2017.01.04</td>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>182</td>\n",
" <td>25</td>\n",
" <td>207</td>\n",
" <td>-0.9</td>\n",
" <td>1.3</td>\n",
" <td>2.2</td>\n",
" <td>94</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2017.01.05</td>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>193</td>\n",
" <td>31</td>\n",
" <td>224</td>\n",
" <td>-7.1</td>\n",
" <td>-0.2</td>\n",
" <td>0.0</td>\n",
" <td>88</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>2019.12.27</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>312</td>\n",
" <td>30</td>\n",
" <td>342</td>\n",
" <td>1.7</td>\n",
" <td>4.9</td>\n",
" <td>4.9</td>\n",
" <td>98</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>2019.12.28</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>337</td>\n",
" <td>37</td>\n",
" <td>374</td>\n",
" <td>-2.1</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>69</td>\n",
" <td>3.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>2019.12.29</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>253</td>\n",
" <td>32</td>\n",
" <td>285</td>\n",
" <td>-4.8</td>\n",
" <td>2.5</td>\n",
" <td>0.0</td>\n",
" <td>26</td>\n",
" <td>7.9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>2019.12.30</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>550</td>\n",
" <td>52</td>\n",
" <td>602</td>\n",
" <td>-4.4</td>\n",
" <td>6.0</td>\n",
" <td>0.0</td>\n",
" <td>9</td>\n",
" <td>8.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>2019.12.31</td>\n",
" <td>00:00</td>\n",
" <td>23.59</td>\n",
" <td>Arnulf</td>\n",
" <td>329</td>\n",
" <td>34</td>\n",
" <td>363</td>\n",
" <td>-0.5</td>\n",
" <td>8.6</td>\n",
" <td>0.0</td>\n",
" <td>60</td>\n",
" <td>6.8</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1034 rows × 12 columns</p>\n",
"</div>"
],
"text/plain": [
" datum uhrzeit_start uhrzeit_ende zaehlstelle richtung_1 richtung_2 \\\n",
"0 2017.01.01 00:00:00 23.59 Arnulf 121 14 \n",
"1 2017.01.02 00:00:00 23.59 Arnulf 362 38 \n",
"2 2017.01.03 00:00:00 23.59 Arnulf 232 30 \n",
"3 2017.01.04 00:00:00 23.59 Arnulf 182 25 \n",
"4 2017.01.05 00:00:00 23.59 Arnulf 193 31 \n",
".. ... ... ... ... ... ... \n",
"26 2019.12.27 00:00 23.59 Arnulf 312 30 \n",
"27 2019.12.28 00:00 23.59 Arnulf 337 37 \n",
"28 2019.12.29 00:00 23.59 Arnulf 253 32 \n",
"29 2019.12.30 00:00 23.59 Arnulf 550 52 \n",
"30 2019.12.31 00:00 23.59 Arnulf 329 34 \n",
"\n",
" gesamt min-temp max-temp niederschlag bewoelkung sonnenstunden \n",
"0 135 -6.1 2.6 0.0 36 5.9 \n",
"1 400 -5.4 0.8 3.2 69 0.3 \n",
"2 262 -2.1 0.6 0.0 85 3.6 \n",
"3 207 -0.9 1.3 2.2 94 0.0 \n",
"4 224 -7.1 -0.2 0.0 88 0.0 \n",
".. ... ... ... ... ... ... \n",
"26 342 1.7 4.9 4.9 98 0.0 \n",
"27 374 -2.1 2.0 0.0 69 3.2 \n",
"28 285 -4.8 2.5 0.0 26 7.9 \n",
"29 602 -4.4 6.0 0.0 9 8.0 \n",
"30 363 -0.5 8.6 0.0 60 6.8 \n",
"\n",
"[1034 rows x 12 columns]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_arnulf"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Are there missing days?"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"from datetime import date, timedelta, datetime\n",
"\n",
"def findMissingDays(df):\n",
" dates = df.datum.map(lambda x: datetime.strptime(x, '%Y.%m.%d')).tolist()\n",
" dates.sort()\n",
" d = set(dates[0] + timedelta(x) for x in range((dates[-1] - dates[0]).days))\n",
" return sorted(d - set(dates))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(61, Timestamp('2019-06-01 00:00:00'), Timestamp('2019-07-31 00:00:00'))"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"missing = findMissingDays(df_arnulf)\n",
"len(missing), missing[0], missing[-1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are missing days from June to July 2019"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Plot counts for a month"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"# pip install matplotlib"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"plt.rcParams['figure.figsize'] = [20, 15]\n",
"\n",
"df = getDataframe(prefixes=('rad2018'), zaehlstelle='Arnulf')"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<ipython-input-22-f5cfea7d9034>:2: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
" ax1 = plt.axes()\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIoAAAOCCAYAAAAY5TkWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABAZElEQVR4nO3de5hlZ10n+u8vF9IBIrcETiYBK2JQcjEhN3i4jY4HyEAEDJCTqJB4OXEEZpxnFKdwnBvKyAygAiNgHBBUFHFwSJgCERFHOVGwgWCAAEkkSkMGQrgFmUSSvOeP/TYUTXV3ddeutfbl83mefnrvtfeufte3V1Xt9d1rvataawEAAACAQ8YeAAAAAACzQVEEAAAAQBJFEQAAAACdoggAAACAJIoiAAAAADpFEQAAAABJksPGHsD+HH300W1lZWXsYQAAAAAsjPe+972fba0ds+fymS+KVlZWsnPnzrGHAQAAALAwqupvN1ru1DMAAAAAkiiKAAAAAOgURQAAAAAkmYM5igAAAAA28tWvfjW7du3KrbfeOvZQZtaOHTty/PHH5/DDD9/U8xVFAAAAwFzatWtXjjrqqKysrKSqxh7OzGmt5eabb86uXbtywgknbOo1Tj0DAAAA5tKtt96a+9znPkqivaiq3Oc+9zmgI64URQAAAMDcUhLt24HmoygCAAAAmGNvetOb8uEPf3gqX8scRQAAAMBCWFldm+rXu+EFT5jq19sub3rTm3LeeeflpJNO2vLXckQRAAAAwBb8/M//fL7zO78zj3nMY3LRRRflRS96Ua6//vqce+65OfPMM/OoRz0qH/nIR5Ikv//7v59TTjklp512Wh796EcnSW644YY86lGPyhlnnJEzzjgjV155ZZLkT//0T/OP//E/zgUXXJAHPehBWV1dzete97qcc845OfXUU3P99dfnyiuvzBVXXJHnPOc5Of3003P99ddvaV0cUQQAAABwkHbu3Jk3vvGNef/735/bb789Z5xxRs4888xceumleeUrX5kTTzwx7373u/PMZz4zf/Inf5LnPe95edvb3pbjjjsuX/jCF5Ik973vffP2t789O3bsyLXXXpuLLrooO3fuTJJ84AMfyDXXXJN73/ve+bZv+7b82I/9WN7znvfkJS95SV72spflV37lV/LEJz4x5513Xp761KdueX0URQAAAAAH6V3velee9KQn5cgjj0ySfN/3fV9uvfXWXHnllXna0572tefddtttSZJHPOIRueSSS3LBBRfk/PPPT5J89atfzbOf/excddVVOfTQQ/Oxj33sa687++yzc+yxxyZJHvjAB+axj31skuTUU0/NO9/5zqmvj6IIAAAA4CC11r5p2Z133pl73vOeueqqq77psVe+8pV597vfnbW1tZx++um56qqr8rKXvSz3u9/98oEPfCB33nlnduzY8bXnH3HEEV+7fcghh3zt/iGHHJLbb7996utjjiIAAACAg/TIRz4yb37zm3Prrbfmy1/+ctbW1nLXu941J5xwQn7/938/yaRM+sAHPpAkuf766/PQhz40z3ve83L00UfnE5/4RL74xS/m2GOPzSGHHJLf+q3fyh133HFAYzjqqKNyyy23TGV9FEUAAAAAB+nss8/OE5/4xJx22mk5//zzc9ZZZ+Ue97hHXve61+VVr3pVTjvttJx88sm5/PLLkyTPec5zcuqpp+aUU07Jox/96Jx22ml55jOfmde+9rV52MMelo997GO5293udkBjuPDCC/PCF74wD3nIQ7Y8mXVtdIjULDnrrLPa7gmcAAAAAHa75ppr8uAHP3jsYeTLX/5y7n73u+crX/lKHv3oR+eyyy7LGWecMfawvmajnKrqva21s/Z8rjmKAAAAALbg0ksvzYc//OHceuutufjii2eqJDpQiiIAAACALfid3/mdsYcwNeYoAgAAACCJoggAAACYY7M+9/LYDjQfRREAAAAwl3bs2JGbb75ZWbQXrbXcfPPN2bFjx6ZfY44iAAAAYC4df/zx2bVrV2666aaxhzKzduzYkeOPP37Tz1cUAQAAAHPp8MMPzwknnDD2MBaKU88AAAAASKIoAgAAAKBTFAEAAACQRFEEAAAAQKcoAgAAACCJoggAAACATlEEAAAAQBJFEQAAAACdoggAAACAJIoiAAAAADpFEQAAAABJFEUAAAAAdIoiAAAAAJIoigAA2MDK6trYQwAARqAoAgAAACCJoggAAACATlEEAAAAQBJFEQAAAACdoggAAACAJIoiAAAAADpFEQAAAABJFEUAAAAAdIoiAAAAAJIoigAAAADoFEUAAAAAJFEUAQAwZSura1lZXRt7GADAQVAUAQAAAJBEUQQAAABApygCAGDbOA0NAOaLoggAAACAJIoiAAAAADpFEQAA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\n",
"text/plain": [
"<Figure size 1440x1080 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df.plot.bar(x='datum', y='gesamt', rot=45)\n",
"ax1 = plt.axes()\n",
"x_axis = ax1.axes.get_xaxis()\n",
"for index, label in enumerate(x_axis.get_ticklabels()):\n",
" if not label.get_text().endswith('01'):\n",
" label.set_visible(False)\n",
"plt.show()\n",
"plt.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Modelling <a name=\"model\"></a>\n",
"\n",
"I will work with the daily numbers because they already contain the weather information.\n",
"I will use the year 2017 & 2018 as training data and 2019 for validation."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.1. Random Forest <a name=\"rf\"></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Prepare data"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"# conda install -c fastai -c pytorch fastai"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/lib/python3.8/site-packages/torch/cuda/__init__.py:52: UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at /opt/conda/conda-bld/pytorch_1603729096996/work/c10/cuda/CUDAFunctions.cpp:100.)\n",
" return torch._C._cuda_getDeviceCount() > 0\n"
]
}
],
"source": [
"from fastai.tabular.all import *"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>uhrzeit_start</th>\n",
" <th>uhrzeit_ende</th>\n",
" <th>datumWeek</th>\n",
" <th>zaehlstelle</th>\n",
" <th>richtung_1</th>\n",
" <th>richtung_2</th>\n",
" <th>gesamt</th>\n",
" <th>min-temp</th>\n",
" <th>max-temp</th>\n",
" <th>niederschlag</th>\n",
" <th>...</th>\n",
" <th>datumDay</th>\n",
" <th>datumDayofweek</th>\n",
" <th>datumDayofyear</th>\n",
" <th>datumIs_month_end</th>\n",
" <th>datumIs_month_start</th>\n",
" <th>datumIs_quarter_end</th>\n",
" <th>datumIs_quarter_start</th>\n",
" <th>datumIs_year_end</th>\n",
" <th>datumIs_year_start</th>\n",
" <th>datumElapsed</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>52</td>\n",
" <td>Arnulf</td>\n",
" <td>121</td>\n",
" <td>14</td>\n",
" <td>135</td>\n",
" <td>-6.1</td>\n",
" <td>2.6</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>1</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>1483228800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>1</td>\n",
" <td>Arnulf</td>\n",
" <td>362</td>\n",
" <td>38</td>\n",
" <td>400</td>\n",
" <td>-5.4</td>\n",
" <td>0.8</td>\n",
" <td>3.2</td>\n",
" <td>...</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>1483315200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>1</td>\n",
" <td>Arnulf</td>\n",
" <td>232</td>\n",
" <td>30</td>\n",
" <td>262</td>\n",
" <td>-2.1</td>\n",
" <td>0.6</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>1483401600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>1</td>\n",
" <td>Arnulf</td>\n",
" <td>182</td>\n",
" <td>25</td>\n",
" <td>207</td>\n",
" <td>-0.9</td>\n",
" <td>1.3</td>\n",
" <td>2.2</td>\n",
" <td>...</td>\n",
" <td>4</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>1483488000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>1</td>\n",
" <td>Arnulf</td>\n",
" <td>193</td>\n",
" <td>31</td>\n",
" <td>224</td>\n",
" <td>-7.1</td>\n",
" <td>-0.2</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>5</td>\n",
" <td>3</td>\n",
" <td>5</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>1483574400</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 24 columns</p>\n",
"</div>"
],
"text/plain": [
" uhrzeit_start uhrzeit_ende datumWeek zaehlstelle richtung_1 richtung_2 \\\n",
"0 00:00:00 23.59 52 Arnulf 121 14 \n",
"1 00:00:00 23.59 1 Arnulf 362 38 \n",
"2 00:00:00 23.59 1 Arnulf 232 30 \n",
"3 00:00:00 23.59 1 Arnulf 182 25 \n",
"4 00:00:00 23.59 1 Arnulf 193 31 \n",
"\n",
" gesamt min-temp max-temp niederschlag ... datumDay datumDayofweek \\\n",
"0 135 -6.1 2.6 0.0 ... 1 6 \n",
"1 400 -5.4 0.8 3.2 ... 2 0 \n",
"2 262 -2.1 0.6 0.0 ... 3 1 \n",
"3 207 -0.9 1.3 2.2 ... 4 2 \n",
"4 224 -7.1 -0.2 0.0 ... 5 3 \n",
"\n",
" datumDayofyear datumIs_month_end datumIs_month_start \\\n",
"0 1 False True \n",
"1 2 False False \n",
"2 3 False False \n",
"3 4 False False \n",
"4 5 False False \n",
"\n",
" datumIs_quarter_end datumIs_quarter_start datumIs_year_end \\\n",
"0 False True False \n",
"1 False False False \n",
"2 False False False \n",
"3 False False False \n",
"4 False False False \n",
"\n",
" datumIs_year_start datumElapsed \n",
"0 True 1483228800 \n",
"1 False 1483315200 \n",
"2 False 1483401600 \n",
"3 False 1483488000 \n",
"4 False 1483574400 \n",
"\n",
"[5 rows x 24 columns]"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = getDataframe(prefixes=('rad2017', 'rad2018', 'rad2019'), zaehlstelle='Arnulf')\n",
"# add date columns like day of week etc. \n",
"df = add_datepart(df, 'datum')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"# drop richtung columns because the are sum up to gesamt value, which we want to predict\n",
"df = df.drop(['richtung_1', 'richtung_2'], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"# Create Tabular Pandas\n",
"procs = [Categorify, FillMissing] # processings or transformations\n",
"cond = (df.datumYear<2019)\n",
"train_idx = np.where(cond)[0]\n",
"valid_idx = np.where(~cond)[0]\n",
"\n",
"splits = (list(train_idx),list(valid_idx))\n",
"\n",
"dep_var = 'gesamt' # dependent variable, the number we want to predict\n",
"\n",
"cont, cat = cont_cat_split(df, 1, dep_var=dep_var)\n",
"to = TabularPandas(df, procs, cat, cont, y_names=dep_var, splits=splits)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>uhrzeit_start</th>\n",
" <th>uhrzeit_ende</th>\n",
" <th>datumWeek</th>\n",
" <th>zaehlstelle</th>\n",
" <th>datumIs_month_end</th>\n",
" <th>datumIs_month_start</th>\n",
" <th>datumIs_quarter_end</th>\n",
" <th>datumIs_quarter_start</th>\n",
" <th>datumIs_year_end</th>\n",
" <th>datumIs_year_start</th>\n",
" <th>datumElapsed</th>\n",
" <th>min-temp</th>\n",
" <th>max-temp</th>\n",
" <th>niederschlag</th>\n",
" <th>bewoelkung</th>\n",
" <th>sonnenstunden</th>\n",
" <th>datumYear</th>\n",
" <th>datumMonth</th>\n",
" <th>datumDay</th>\n",
" <th>datumDayofweek</th>\n",
" <th>datumDayofyear</th>\n",
" <th>gesamt</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>52</td>\n",
" <td>Arnulf</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>1483228800</td>\n",
" <td>-6.1</td>\n",
" <td>2.6</td>\n",
" <td>0.0</td>\n",
" <td>36</td>\n",
" <td>5.9</td>\n",
" <td>2017</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>135</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>1</td>\n",
" <td>Arnulf</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>1483315200</td>\n",
" <td>-5.4</td>\n",
" <td>0.8</td>\n",
" <td>3.2</td>\n",
" <td>69</td>\n",
" <td>0.3</td>\n",
" <td>2017</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>00:00:00</td>\n",
" <td>23.59</td>\n",
" <td>1</td>\n",
" <td>Arnulf</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>1483401600</td>\n",
" <td>-2.1</td>\n",
" <td>0.6</td>\n",
" <td>0.0</td>\n",
" <td>85</td>\n",
" <td>3.6</td>\n",
" <td>2017</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>262</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"to.show(3)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# save\n",
"save_pickle((URLs.path()/'../to.pkl'), to)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Train Random Forest"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.ensemble import RandomForestRegressor\n",
"from sklearn.metrics import mean_absolute_error"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"xs,y = to.train.xs, to.train.y\n",
"valid_xs, valid_y = to.valid.xs, to.valid.y"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"def rf(xs, y, n_estimators=40, max_features=0.5, min_samples_leaf=5, **kwargs):\n",
" return RandomForestRegressor(n_jobs=-1, n_estimators=n_estimators, min_samples_leaf=min_samples_leaf, max_features=max_features, oob_score=True).fit(xs,y)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"# root mean square error - penalizes large differences. Would MAE be better as metric?\n",
"def r_mse(pred,y): return round(math.sqrt(((pred-y)**2).mean()), 6)\n",
"def m_rmse(m, xs, y): return r_mse(m.predict(xs), y)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"m = rf(xs, y)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(150.827018, 291.376165)"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m_rmse(m, xs, y), m_rmse(m, valid_xs, valid_y)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(107.54514133450779, 220.33934781813005)"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean_absolute_error(m.predict(xs), y),mean_absolute_error(m.predict(valid_xs), valid_y)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"291.376165"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"preds = np.stack([t.predict(valid_xs) for t in m.estimators_])\n",
"r_mse(preds.mean(0), valid_y)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1440x1080 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot([r_mse(preds[:i+1].mean(0), valid_y) for i in range(40)]);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"😳 Question: Best result in a previous run seem to be arround 20 not 40 what does that mean?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Out of bag error\n",
"Good metric to check why our predictions in our training set or better then in our validation set. 108.36805410446944 vs 212.6982400192359"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"221.588333"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r_mse(m.oob_prediction_, y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"😳 Our error in the training set is higher than in the validation set. The example in the fastai book p.302 has an example where the error is lower.\n",
"\n",
"What does this indicate?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Prediction confidence\n",
"\n",
"how confident can I be in those predictions? One way is to look at the variance between the trees in the forest. Smaller is better."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(40, 304)\n"
]
},
{
"data": {
"text/plain": [
"array([220.43494408, 216.61031609, 257.84818055, 164.78028151,\n",
" 92.38315391, 90.30959489, 216.27418407, 162.83631993,\n",
" 133.91677403, 178.21487514, 202.09771941, 117.11129629,\n",
" 114.7589853 , 157.12744653, 220.85157785, 208.74479413,\n",
" 197.37468797, 265.78702152, 186.69177298, 186.71178815])"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"preds = np.stack([t.predict(valid_xs) for t in m.estimators_])\n",
"print(preds.shape) # 40 trees, with 304 predictions for each day\n",
"preds_std = preds.std(0) # standard deviation\n",
"preds_std[:20]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Feature importance\n",
"\n",
"Which feature are most important?"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cols</th>\n",
" <th>imp</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>max-temp</td>\n",
" <td>0.342677</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>datumDayofweek</td>\n",
" <td>0.197024</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>min-temp</td>\n",
" <td>0.175060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>sonnenstunden</td>\n",
" <td>0.146622</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>niederschlag</td>\n",
" <td>0.031295</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>datumWeek</td>\n",
" <td>0.030795</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>datumDayofyear</td>\n",
" <td>0.021860</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>bewoelkung</td>\n",
" <td>0.018150</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>datumElapsed</td>\n",
" <td>0.015508</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>datumMonth</td>\n",
" <td>0.011523</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" cols imp\n",
"12 max-temp 0.342677\n",
"19 datumDayofweek 0.197024\n",
"11 min-temp 0.175060\n",
"15 sonnenstunden 0.146622\n",
"13 niederschlag 0.031295\n",
"2 datumWeek 0.030795\n",
"20 datumDayofyear 0.021860\n",
"14 bewoelkung 0.018150\n",
"10 datumElapsed 0.015508\n",
"17 datumMonth 0.011523"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def rf_feat_importance(m, df):\n",
" return pd.DataFrame({'cols':df.columns, 'imp':m.feature_importances_}).sort_values('imp', ascending=False)\n",
"fi = rf_feat_importance(m, xs)\n",
"fi[:10]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Most important features are max-temp followed by day of week. Seems reasonable to me. e.g. workdays vs weekdays and cold days vs warm days."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def plot_fi(fi):\n",
" return fi.plot('cols', 'imp', 'barh', figsize=(12,7), legend=False)\n",
"plot_fi(fi[:20]);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Remove unimportant features"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"11"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"to_keep =fi[fi.imp > 0.005].cols\n",
"len(to_keep)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [],
"source": [
"xs_imp = xs[to_keep]\n",
"valid_xs_imp = valid_xs[to_keep]"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(158.303269, 289.488716)"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = rf(xs_imp, y)\n",
"m_rmse(m, xs_imp, y), m_rmse(m, valid_xs_imp, valid_y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"😳 Got worse in comparison to prev run: 151.42499, 285.167373. But the removed columns shouldn't be important e.g. uhrzeit_start/end is always the same."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Redundant features"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from scipy.cluster import hierarchy as hc\n",
"\n",
"def cluster_columns(df, figsize=(10,6), font_size=12):\n",
" corr = np.round(scipy.stats.spearmanr(df).correlation, 4)\n",
" corr_condensed = hc.distance.squareform(1-corr)\n",
" z = hc.linkage(corr_condensed, method='average')\n",
" fig = plt.figure(figsize=figsize)\n",
" hc.dendrogram(z, labels=df.columns, orientation='left', leaf_font_size=font_size)\n",
" plt.show()\n",
" \n",
"cluster_columns(xs_imp)"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>max-temp</th>\n",
" <th>datumDayofweek</th>\n",
" <th>min-temp</th>\n",
" <th>sonnenstunden</th>\n",
" <th>niederschlag</th>\n",
" <th>datumWeek</th>\n",
" <th>datumDayofyear</th>\n",
" <th>bewoelkung</th>\n",
" <th>datumElapsed</th>\n",
" <th>datumMonth</th>\n",
" <th>datumDay</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2.6</td>\n",
" <td>6</td>\n",
" <td>-6.1</td>\n",
" <td>5.9</td>\n",
" <td>0.0</td>\n",
" <td>52</td>\n",
" <td>1</td>\n",
" <td>36</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.8</td>\n",
" <td>0</td>\n",
" <td>-5.4</td>\n",
" <td>0.3</td>\n",
" <td>3.2</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>69</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.6</td>\n",
" <td>1</td>\n",
" <td>-2.1</td>\n",
" <td>3.6</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>85</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1.3</td>\n",
" <td>2</td>\n",
" <td>-0.9</td>\n",
" <td>0.0</td>\n",
" <td>2.2</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>94</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-0.2</td>\n",
" <td>3</td>\n",
" <td>-7.1</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>88</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" max-temp datumDayofweek min-temp sonnenstunden niederschlag datumWeek \\\n",
"0 2.6 6 -6.1 5.9 0.0 52 \n",
"1 0.8 0 -5.4 0.3 3.2 1 \n",
"2 0.6 1 -2.1 3.6 0.0 1 \n",
"3 1.3 2 -0.9 0.0 2.2 1 \n",
"4 -0.2 3 -7.1 0.0 0.0 1 \n",
"\n",
" datumDayofyear bewoelkung datumElapsed datumMonth datumDay \n",
"0 1 36 1 1 1 \n",
"1 2 69 2 1 2 \n",
"2 3 85 3 1 3 \n",
"3 4 94 4 1 4 \n",
"4 5 88 5 1 5 "
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xs_imp.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"month and day of year are close, makes sense both indicate the \"season\" or the progress into the year.\n",
"Will keep it for now."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Waterfall Chart"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": [
"#!pip install treeinterpreter\n",
"#!pip install waterfallcharts"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/lib/python3.8/site-packages/sklearn/utils/deprecation.py:143: FutureWarning: The sklearn.ensemble.forest module is deprecated in version 0.22 and will be removed in version 0.24. The corresponding classes / functions should instead be imported from sklearn.ensemble. Anything that cannot be imported from sklearn.ensemble is now part of the private API.\n",
" warnings.warn(message, FutureWarning)\n"
]
},
{
"data": {
"text/plain": [
"(array([686.85605946]), 1168.5262671232877, -481.6702076680371)"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from treeinterpreter import treeinterpreter\n",
"row = valid_xs_imp.iloc[:1]\n",
"prediction,bias,contributions = treeinterpreter.predict(m, row.values)\n",
"prediction[0], bias[0], contributions[0].sum()"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<module 'matplotlib.pyplot' from '/opt/conda/lib/python3.8/site-packages/matplotlib/pyplot.py'>"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABZgAAAQwCAYAAABolTvzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAABzB0lEQVR4nOzdeZzdVWH///chISwCkkDYEbXEBSpiHTYhEgQ0oP7AreKCIJttAaVaKBQVrfgFpHZRcGETFIuitUgrqIhGg6gwFERRgQitBlACkU0gJHB+f3wuJiTDModk7mTyfD4e9zH3fu7n85kz3Dtk5jXnnltqrQEAAAAAgOFaqd8DAAAAAABg+SQwAwAAAADQRGAGAAAAAKCJwAwAAAAAQBOBGQAAAACAJuP7PYCnY911163Pfvaz+z0MAAAAAIAx7aqrrrqj1jp58e3LdWB+9rOfncHBwX4PAwAAAABgTCul/N9Q2y2RAQAAAABAE4EZAAAAAIAmAjMAAAAAAE0EZgAAAAAAmgjMAAAAAAA0EZgBAAAAAGgiMAMAAAAA0ERgBgAAAACgicAMAAAAAEATgRkAAAAAgCYCMwAAAAAATQRmAAAAAACaCMwAAAAAADQRmAEAAAAAaCIwAwAAAADQRGAGAAAAAKCJwAwAAAAAQJNhB+ZSylmllNtLKT9fZNukUsolpZQbex8nLnLfMaWUWaWU60spr3qccz7u8QAAAAAAjE4tM5jPTjJ9sW1HJ7m01jolyaW92ymlbJFknyRb9o75VCll3BDnHPJ4AAAAAABGr2EH5lrrD5LMXWzzXknO6V0/J8nei2z/Uq11Xq315iSzkmw7xGkf73gAAAAAAEappbUG8/q11tuSpPdxvd72jZP8dpH9Zve2PdXjl1BKOaSUMlhKGZwzZ85SGTwAAAAAAMO3rN/krwyxrT6dE9ZaT6u1DtRaByZPnvx0TgUAAAAAwNOwtALz70spGyZJ7+Ptve2zk2y6yH6bJLl1GMcDAAAAADBKLa3AfGGS/XrX90vy9UW271NKWaWU8pwkU5JcMYzjAQAAAAAYpYYdmEsp5yX5UZLnl1Jml1IOTHJikt1LKTcm2b13O7XW65Kcn+QXSb6Z5NBa68O985xRShnonXbI4wEAAAAAGL1KrU9rSeS+GhgYqIODg/0eBgAAAADAmFZKuarWOrD49mX9Jn8AAAAAAIxRAjMAAAAAAE0EZgAAAAAAmgjMAAAAAAA0EZgBAAAAAGgiMAMAAAAA0ERgBgAAAACgicAMAAAAAEATgRkAAAAAgCYCMwAAAAAATQRmAAAAAACaCMwAAAAAADQRmAEAAAAAaCIwAwAAAADQRGAGAAAAAKCJwAwAAAAAQBOBGQAAAACAJgIzAAAAAABNBGYAAAAAAJoIzAAAAAAANBGYAQAAAABoIjADAAAAANBEYAYAAAAAoInADAAAAABAE4EZAAAAAIAmAjMAAAAAAE0EZgAAAAAAmgjMAAAAAAA0EZgBAAAAAGgiMAMAAAAA0ERgBgAAAACgicAMAAAAAEATgRkAAAAAgCYCMwAAAAAATQRmAAAAAACaCMwAAAAAADQRmAEAAAAAaCIwAwAAAADQRGAGAAAAAKCJwAwAAAAAQBOBGQAAAACAJgIzAAAAAABNBGYAAAAAAJoIzAAAAAAANBGYAQAAAABoIjADAAAAANBEYAYAAAAAoInADAAAAABAE4EZAAAAAIAmAjMAAAAAAE0EZgAAAAAAmgjMAAAAAAA0EZgBAAAAAGgiMAMAAAAA0ERgBgAAAACgicAMAAAAAEATgRkAAAAAgCYCMwAAAAAATQRmAAAAAACaCMwAAAAAADQRmAEAAAAAaCIwAwAAAADQRGAGAAAAAKCJwAwAAAAAQBOBGQAAAACAJgIzAAAAAABNBGYAAAAAAJoIzAAAAAAANBGYAQAAAABoIjADAAAAANBEYAYAAAAAoInADAAAAABAE4EZAAAAAIAmAjMAAAAAAE0EZgAAAAAAmgjMAAAAAAA0EZgBAAAAAGgiMAMAAAAA0ERgBgAAAACgicAMAAAAAEATgRkAAAAAgCYCMwAAAAAATQRmAAAAAACaCMwAAAAAADQRmAEAAAAAaCIwAwAAAADQRGAGAAAAAKCJwAwAAAAAQBOBGQAAAACAJgIzAAAAAABNBGYAAAAAAJoIzAAAAAAANBGYAQAAAABoIjADAAAAANBEYAYAAAAAoInADAAAAABAE4EZAAAAAIAmAjMAAAAAAE0EZgAAAAAAmgjMAAAAAAA0EZgBAAAAAGgiMAMAAAAA0ERgBgAAAACgicAMAAAAAEATgRkAAAAAgCYCMwAAAAAATQRmAAAAAACaCMwAAAAAADQRmAEAAAAAaCIwAwAAAADQRGAGAAAAAKCJwAwA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zAAAAAAANBGYAQAAAABoIjADAAAAANBEYAYAAAAAoInADAAAAABAE4EZAAAAAIAmAjMAAAAAAE0EZgAAAAAAmgjMAAAAAAA0EZgBAAAAAGgiMAMAAAAA0ERgBgAAAACgicAMAAAAAEATgRkAAAAAgCYCMwAAAAAATQRmAAAAAACaCMwAAAAAADQRmAEAAAAAaCIwAwAAAADQRGAGAAAAAKCJwAwAAAAAQBOBGQAAAACAJgIzAAAAAABNBGYAAAAAAJoIzAAAAAAANBGYAQAAAABoIjADAAAAANBEYAYAAAAAoInADAAAAABAE4EZAAAAAIAmAjMAAAAAAE0EZgAAAAAAmgjMAAAAAAA0EZgBAAAAAGgiMAMAAAAA0ERgBgAAAACgicAMAAAAAEATgRkAAAAAgCYCMwAAAAAATQRmAAAAAACaCMwAAAAAADQRmAEAAAAAaCIwAwAAAADQRGAGAAAAAKCJwAwAAAAAQBOBGQAAAACAJgIzAAAAAABNBGYAAAAAAJoIzAAAAAAANBGYAQAAAABoIjADAAAAANBEYAYAAAAAoInADAAAAABAE4EZAAAAAIAmAjMAAAAAAE0EZgAAAAAAmgjMAAAAAAA0EZgBAAAAAGgiMAMAAAAA0ERgBgAAAACgicAMAAAAAEATgRkAAAAAgCYCMwAAAAAATQRmAAAAAACaCMwAAAAAADQRmAEAAAAAaCIwAwAAAADQRGAGAAAAAKCJwAwAAAAAQBOBGQAAAACAJgIzAAAAAABNBGYAAAAAAJoIzAAAAAAANBGYAQAAAABoIjADAAAAANBEYAYAAAAAoInADAAAAABAE4EZAAAAAIAmAjMAAAAAAE0EZgAAAAAAmgjMAAAAAAA0EZgBAAAAAGgiMAMAAAAA0ERgBgAAAACgicAMAAAAAEATgRkAAAAAgCYCMwAAAAAATQRmAAAAAACaCMwAAAAAADQRmAEAAAAAaCIwAwAAAADQRGAGAAAAAKCJwAwAAAAAQBOBGQAAAACAJgIzAAAAAABNBGYAAAAAAJoIzAAAAAAANBGYAQAAAABoIjADAAAAANBEYAYAAAAAoInADAAAAABAE4EZAAAAAIAmAjMAAAAAAE0EZgAAAAAAmgjMAAAAAAA0EZgBAAAAAGgiMAMAAAAA0ERgBgAAAACgicAMAAAAAEATgRkAAAAAgCYCMwAAAAAA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bg1mAAAAAGBkzZ/fvQny8ccv3HbYYcn22yfbbNO9+itJfv3r5KUvTdZYI7nssqHP9Y53dO+HMW1atyzZf/3Xsh49ixCYAQAAgLFl33270DQwkPzLvzz2vhtuSFZeeehQ9eCDydvelkyd2n188MERGS6skD772eQFL1h4++c/T667Lvnxj5PvfrdbPixJNtywW1LsjW98/HN9/vPJjBnJt7+drL32km+4zDIlMAMAAABjy5lndrHpxz9OPvWp5N57F973kY8kO+889HFnn90Fr5kzk+c/v7sNLH333ZdcfHHy+tcv3LbRRt0bI8+f333PTprUbV999YXXn8x//3ey667Jqqsu/THzuARmAAAAYGyZMKH7+OCDybOe1QWqJLniimSDDZJNNhn6uBkzkte8prv+2tcmP/jBMh8qrJBOPjk54oiklIXbJk7slsx43vOSrbdeOIN5OM49t3v1ASNKYAYAAADGnje9KXnuc5OddkrGjeu2HX98cvTRj3/M3Lld5Eq6l9nfeecyHyasME45pVu65oADkquvXnIZi0suSW65JZk1K/nVr5J/+Idk3rynfv677kquvfbxX6HAMjO+3wMAAAAAeNpOOSX56leTzTdPzjgj+cpXkvvvT17+8uTNb05uvrlbk3mddR7/HJMmdZEqSe6++6m/LB94cocd1l2+853kAx9Ipk/vgvK8ecmLX9y98mDixO4PQmuumTz0UPLww0/9/Oefn7zhDclK5tOONIEZAAAAWP49Gq9q7cLUhAndOqyrrdZdrrmmWwLj8suTn/2smyH55S8nm2228Bw775xcdFH38vyLLjITEpaF3XbrLkm3zvns2d2SNI88kpx3Xveqg3nzksMP75a3ueeebq3mX/yiexPAPfdMPvzh7tiNN144E/rcc5NTT+3XV7VCK7XWfo+h2cDAQB0cHOz3MAAAAIDRYv78hcFp3rxu9vIRRzx2n/33Tw46qAtZ11zTvTT/yCOTBx7oXr4/e3a3TvPnPufNwgB6SilX1VoHltguMAMAAAAA8EQeLzBblAQAAAAAgCYCMwAAAAAATQRmAAAAAACaCMwAAAAAADQRmAEAAAAAaCIwAwAAAADQRGAGAAAAAKCJwAwAAAAAQBOBGQAAAACAJgIzAAAAAABNBGYAAAAAAJoIzAAAAAAANBGYAQAAAABoIjADAAAAANBEYAYA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\n",
"text/plain": [
"<Figure size 1440x1080 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import waterfall_chart\n",
"waterfall_chart.plot(valid_xs_imp.columns, contributions[0], threshold=0.08, rotation_value=45)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Indicates the importance of different features for the prediction."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Out of domain data"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [],
"source": [
"df_dom = pd.concat([xs_imp, valid_xs_imp])\n",
"is_valid = np.array([0]*len(xs_imp) + [1]*len(valid_xs_imp))"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cols</th>\n",
" <th>imp</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>datumElapsed</td>\n",
" <td>0.958834</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>min-temp</td>\n",
" <td>0.012670</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>datumDayofyear</td>\n",
" <td>0.006527</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>max-temp</td>\n",
" <td>0.005591</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>datumWeek</td>\n",
" <td>0.005288</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>bewoelkung</td>\n",
" <td>0.004084</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" cols imp\n",
"8 datumElapsed 0.958834\n",
"2 min-temp 0.012670\n",
"6 datumDayofyear 0.006527\n",
"0 max-temp 0.005591\n",
"5 datumWeek 0.005288\n",
"7 bewoelkung 0.004084"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# RandomForest to decide if value is in train oder valid set.\n",
"m = rf(df_dom, is_valid)\n",
"rf_feat_importance(m, df_dom)[:6]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By extracting the most important features which seperate train from validation set we find feature which we could drop."
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"without out of dom: 287.162482\n"
]
}
],
"source": [
"xs_final = xs_imp.drop('datumElapsed', axis=1)\n",
"valid_xs_final = valid_xs_imp.drop('datumElapsed', axis=1)\n",
"m = rf(xs_final, y)\n",
"print(f'without out of dom: {m_rmse(m, valid_xs_final, valid_y)}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"😳 Got worse again."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Summary of RandomForest"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"orig: 290.415066\n",
"imp: 284.863809\n",
"without out of dom: 285.790172\n"
]
}
],
"source": [
"m = rf(xs, y)\n",
"print(f'orig: {m_rmse(m, valid_xs, valid_y)}')\n",
"m = rf(xs_imp, y)\n",
"print(f'imp: {m_rmse(m, valid_xs_imp, valid_y)}')\n",
"m = rf(xs_imp.drop('datumElapsed',axis=1), y)\n",
"print(f'without out of dom: {m_rmse(m, valid_xs_imp.drop(\"datumElapsed\",axis=1), valid_y)}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### less trees"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"orig: 290.258153\n",
"imp: 286.66816\n",
"without out of dom: 287.481837\n"
]
}
],
"source": [
"m = rf(xs, y, 25)\n",
"print(f'orig: {m_rmse(m, valid_xs, valid_y)}')\n",
"m = rf(xs_imp, y, 25)\n",
"print(f'imp: {m_rmse(m, valid_xs_imp, valid_y)}')\n",
"m = rf(xs_imp.drop('datumElapsed',axis=1), y, 25)\n",
"print(f'without out of dom: {m_rmse(m, valid_xs_imp.drop(\"datumElapsed\",axis=1), valid_y)}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Open questions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"😳 Results change on every rerun. Therfore: How comparable are the results with the different changes then? \n",
"\n",
"Should I fix a seed for the RandomForest, is this possible?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.1. Neural Net <a name=\"nn\"></a>\n",
"\n",
"Let's try it with a neural net"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>max-temp</th>\n",
" <th>datumDayofweek</th>\n",
" <th>min-temp</th>\n",
" <th>sonnenstunden</th>\n",
" <th>niederschlag</th>\n",
" <th>datumWeek</th>\n",
" <th>datumDayofyear</th>\n",
" <th>bewoelkung</th>\n",
" <th>datumMonth</th>\n",
" <th>datumDay</th>\n",
" <th>gesamt</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2.6</td>\n",
" <td>6</td>\n",
" <td>-6.1</td>\n",
" <td>5.9</td>\n",
" <td>0.0</td>\n",
" <td>52</td>\n",
" <td>1</td>\n",
" <td>36</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>135</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.8</td>\n",
" <td>0</td>\n",
" <td>-5.4</td>\n",
" <td>0.3</td>\n",
" <td>3.2</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>69</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>400</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.6</td>\n",
" <td>1</td>\n",
" <td>-2.1</td>\n",
" <td>3.6</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>85</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>262</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1.3</td>\n",
" <td>2</td>\n",
" <td>-0.9</td>\n",
" <td>0.0</td>\n",
" <td>2.2</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>94</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>207</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>-0.2</td>\n",
" <td>3</td>\n",
" <td>-7.1</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>88</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>224</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>4.9</td>\n",
" <td>4</td>\n",
" <td>1.7</td>\n",
" <td>0.0</td>\n",
" <td>4.9</td>\n",
" <td>52</td>\n",
" <td>361</td>\n",
" <td>98</td>\n",
" <td>12</td>\n",
" <td>27</td>\n",
" <td>342</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>2.0</td>\n",
" <td>5</td>\n",
" <td>-2.1</td>\n",
" <td>3.2</td>\n",
" <td>0.0</td>\n",
" <td>52</td>\n",
" <td>362</td>\n",
" <td>69</td>\n",
" <td>12</td>\n",
" <td>28</td>\n",
" <td>374</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>2.5</td>\n",
" <td>6</td>\n",
" <td>-4.8</td>\n",
" <td>7.9</td>\n",
" <td>0.0</td>\n",
" <td>52</td>\n",
" <td>363</td>\n",
" <td>26</td>\n",
" <td>12</td>\n",
" <td>29</td>\n",
" <td>285</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>6.0</td>\n",
" <td>0</td>\n",
" <td>-4.4</td>\n",
" <td>8.0</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>364</td>\n",
" <td>9</td>\n",
" <td>12</td>\n",
" <td>30</td>\n",
" <td>602</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>8.6</td>\n",
" <td>1</td>\n",
" <td>-0.5</td>\n",
" <td>6.8</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>365</td>\n",
" <td>60</td>\n",
" <td>12</td>\n",
" <td>31</td>\n",
" <td>363</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1034 rows × 11 columns</p>\n",
"</div>"
],
"text/plain": [
" max-temp datumDayofweek min-temp sonnenstunden niederschlag \\\n",
"0 2.6 6 -6.1 5.9 0.0 \n",
"1 0.8 0 -5.4 0.3 3.2 \n",
"2 0.6 1 -2.1 3.6 0.0 \n",
"3 1.3 2 -0.9 0.0 2.2 \n",
"4 -0.2 3 -7.1 0.0 0.0 \n",
".. ... ... ... ... ... \n",
"26 4.9 4 1.7 0.0 4.9 \n",
"27 2.0 5 -2.1 3.2 0.0 \n",
"28 2.5 6 -4.8 7.9 0.0 \n",
"29 6.0 0 -4.4 8.0 0.0 \n",
"30 8.6 1 -0.5 6.8 0.0 \n",
"\n",
" datumWeek datumDayofyear bewoelkung datumMonth datumDay gesamt \n",
"0 52 1 36 1 1 135 \n",
"1 1 2 69 1 2 400 \n",
"2 1 3 85 1 3 262 \n",
"3 1 4 94 1 4 207 \n",
"4 1 5 88 1 5 224 \n",
".. ... ... ... ... ... ... \n",
"26 52 361 98 12 27 342 \n",
"27 52 362 69 12 28 374 \n",
"28 52 363 26 12 29 285 \n",
"29 1 364 9 12 30 602 \n",
"30 1 365 60 12 31 363 \n",
"\n",
"[1034 rows x 11 columns]"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_nn = getDataframe(zaehlstelle='Arnulf', prefixes = ('rad2017', 'rad2018', 'rad2019'))\n",
"df_nn = add_datepart(df_nn, 'datum')\n",
"df_nn = df_nn[list(xs_final.columns) + [dep_var]]\n",
"df_nn"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [],
"source": [
"cont_nn, cat_nn = cont_cat_split(df_nn, max_card=9000, dep_var=dep_var)"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(['max-temp',\n",
" 'datumDayofweek',\n",
" 'min-temp',\n",
" 'sonnenstunden',\n",
" 'niederschlag',\n",
" 'datumWeek',\n",
" 'datumDayofyear',\n",
" 'bewoelkung',\n",
" 'datumMonth',\n",
" 'datumDay'],\n",
" [])"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cont_nn, cat_nn"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Series([], dtype: float64)"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_nn[cat_nn].nunique()"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [],
"source": [
"df_nn=df_nn.astype('float')\n",
"\n",
"procs_nn = [Categorify, FillMissing, Normalize]\n",
"to_nn = TabularPandas(df_nn, procs_nn, cat_nn, cont_nn, splits=splits, y_names=dep_var)"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(29.0, 2707.0)"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dls = to_nn.dataloaders()\n",
"y = to_nn.train.y\n",
"y.min(), y.max()"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [],
"source": [
"learn = tabular_learner(dls, y_range=(29,2707), layers=[500,250], n_out=1, loss_func=F.mse_loss)"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"SuggestedLRs(lr_min=0.002754228748381138, lr_steep=0.0003311311302240938)"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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v2u+bjttuL586jDFRtOxAwAAILzMWV8la6Wzx1JKITwxU8on0mZKbaveqzP+MFfxMR6lxsdo0Q/OiOitUCV1rfrjnM16YWWZUuNjdNtpw3TjzELFx0R94rm7a1t19T8XqqPbqye+MEOj8lIcJHarx2u1eHutXlpVrtfWVqqxrUtpCTE6b3yeLjy+v6YP6fdBkecvNXs79IuX1+ulVeUamZus31w2QVMGZ/j1awIAAACBdNP9S7SjpkVzv3Mqd6RGyGKmFD6hsrFd0r47nj2+eLeKd9VH5Gqpmr0d+ts7W/Xool3yGKMvnjJMX541TGmJn766Z1C/RD3xhRm6+p8Ldd29i/TkrTM0PCe8i6muHq9aO3q0tbpZL6+q0KtrKlTd3KGk2CidNTZPFx6fr5OGZwd0tVJWcpzuumaSLpnUXz9+fq2uuOd93TSzUN8+e5SSuUsfAAAAQlxTe5fe31ajz55QSCGFsMUrtwi1v5S6bvogPbesNKy28Hm9VrUtnapu7lD13o59j/vf9naourn9g4+b2rvlMdLVUwv09TNGKi8tvldfozArSY9/YYau/sciXfOvxXrq1hkamp3s5++s7+1patfd725TbUunWju61dLZrbbOHrV09vg+7lFrZ7e6ej5cURkb7dHpo3J00cT+Om1UjhJiP7maLJBOH52rN7/VT79/Y5MeWrhTb66r1K8uHafTR+c6zQUAAAAci3c27lFXj2XrHsIapVSEqmzaV0oNy07WqaOy9draSv30wrF+33Llb+UNbbr5waXaWPnJAdhJsVHKTolTdkqcRuWl6KThWcpJjdfZY/M0POfIC6Vh2cl64gvTNfufi3TtvxbrqS/O0OB+SX3xbQREWUObrvvXIpU3tmtgeoISYqOUFButjKRYDcyIVmJs1L63uGglxUYpMTZa2SlxOnVUtlLi+25OVF9IjovWzy8aqwuP76/vP7daNz9YrLPG5GpYTrKijFGU52NvHzuWnxav00f3/s6AAAAAgL+9ua5K2SlxmjyIERUIX5RSEaqisU3piTGKj4nS+RP66411VSreWafpQ/u5jnbUtu5p1g33LdHe9m796LzjNCAjQTm+EiorOU5JftjSNSI3RY99Ybqu+eciXfPPRXrqizNVkBn8t2rdVduia/+1WE3tXXry1hlh8z90UwZn6JXbT9I9727XffO3691N1er2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\n",
"text/plain": [
"<Figure size 1440x1080 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"learn.lr_find()"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: left;\">\n",
" <th>epoch</th>\n",
" <th>train_loss</th>\n",
" <th>valid_loss</th>\n",
" <th>time</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>195650.562500</td>\n",
" <td>108441.351562</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>171566.453125</td>\n",
" <td>147749.421875</td>\n",
" <td>00:01</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>150735.703125</td>\n",
" <td>162466.375000</td>\n",
" <td>00:01</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>133809.859375</td>\n",
" <td>100017.156250</td>\n",
" <td>00:01</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>121427.453125</td>\n",
" <td>150790.296875</td>\n",
" <td>00:01</td>\n",
" </tr>\n",
" <tr>\n",
" <td>5</td>\n",
" <td>114360.015625</td>\n",
" <td>107797.859375</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>6</td>\n",
" <td>108452.250000</td>\n",
" <td>114071.171875</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>103272.890625</td>\n",
" <td>116983.789062</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>8</td>\n",
" <td>97968.578125</td>\n",
" <td>83938.859375</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>92169.351562</td>\n",
" <td>106686.109375</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>85372.921875</td>\n",
" <td>78292.906250</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>11</td>\n",
" <td>78749.109375</td>\n",
" <td>82190.203125</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>12</td>\n",
" <td>75201.617188</td>\n",
" <td>86609.187500</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>13</td>\n",
" <td>70753.835938</td>\n",
" <td>81153.445312</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>14</td>\n",
" <td>66044.765625</td>\n",
" <td>83279.562500</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>15</td>\n",
" <td>61045.269531</td>\n",
" <td>76937.382812</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>16</td>\n",
" <td>57437.070312</td>\n",
" <td>81512.687500</td>\n",
" <td>00:01</td>\n",
" </tr>\n",
" <tr>\n",
" <td>17</td>\n",
" <td>52916.996094</td>\n",
" <td>80419.804688</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>18</td>\n",
" <td>50876.402344</td>\n",
" <td>77671.093750</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <td>19</td>\n",
" <td>48133.343750</td>\n",
" <td>77176.562500</td>\n",
" <td>00:00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learn.fit_one_cycle(20, 1e-2)"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"277.8067"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"preds,targs = learn.get_preds()\n",
"r_mse(preds,targs)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Is better than the random forest"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. Conclusion <a name=\"conclusion\"></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Are these models helpful?\n",
"\n",
"I tried two approaches RandomForest and a Neuronal Net and both seem to work in general, but I still have no real feeling if the models are helpful and what the RSME (RootMeanSquaredError) means for the quality of my model in general. Are those good models that would be helpful?\n",
"\n",
"Should I use another metric?\n",
"Are there other metrics besided RSME (RootSquareMeanError) that would make it easier for me to grasp the performance of my model? Should I maybe use a relative metric? e.g. a percentage Metric? or would MeanAbsoluteError help me?\n",
"The OOB score is relative from 0 (bad) to 1 (good). It was arround 0.88. Does that mean it is an okay model?\n",
"\n",
"Or does the real value of the predictions only gets visible when I would have a real use case in which they are used? e.g. is an value 100 below the real value helpful for traffic planners?\n",
"\n",
"### RandomForest\n",
"\n",
"* Results change on every rerun. Therfore: How comparable are the results with the different changes then? Should I fix a seed for the RandomForest, is this possible?\n",
"* What does it mean if the predictions get worse with more trees?\n",
"\n",
"\n",
"### Future Steps\n",
"\n",
"* I really like the waterfall chart for the RandomForest which shows which influence different features have. Is there something similiar for a neural net? e.g. like the visualisation of CNN Layers for image classification\n",
"* Add bavarian holidays to the data\n",
"* Use not only one counting station but the total of all six\n",
"* Use datasets where weekdays and weekends are seperated. Could I train a \"Should I bike or take the bus?\"-Model on this?\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Use different Metrics"
]
},
{
"cell_type": "code",
"execution_count": 120,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"rf_m = rf(xs_final, y)\n",
"rf_preds = rf_m.predict(valid_xs_final)\n",
"\n",
"nn_preds, nn_y = learn.get_preds()"
]
},
{
"cell_type": "code",
"execution_count": 121,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"283.380909\n",
"277.8067\n"
]
}
],
"source": [
"#### Root Mean Squared Error (RMSE)\n",
"print(r_mse(rf_preds, valid_y))\n",
"print(r_mse(nn_preds, nn_y))"
]
},
{
"cell_type": "code",
"execution_count": 122,
"metadata": {},
"outputs": [],
"source": [
"from fastai import metrics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Root Mean Squared Error (RMSE)"
]
},
{
"cell_type": "code",
"execution_count": 123,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"283.380909\n",
"277.8067\n"
]
}
],
"source": [
"# Root Mean Squared Error (RMSE)\n",
"print(r_mse(rf_preds, valid_y))\n",
"print(r_mse(nn_preds, nn_y))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Mean absolute error (MAE)"
]
},
{
"cell_type": "code",
"execution_count": 124,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"217.0179812664159\n",
"tensor(203.6669)\n"
]
}
],
"source": [
"# Mean absolute error (MAE)\n",
"print(mae(rf_preds, valid_y))\n",
"print(mae(nn_preds, nn_y))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Mean absolute percentage error (MAPE)"
]
},
{
"cell_type": "code",
"execution_count": 125,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.24850171045403477\n",
"tensor(0.2220)\n"
]
}
],
"source": [
"# Mean absolute percentage error (MAPE)\n",
"def mape(preds, y): return np.abs((preds - y)/preds).mean()\n",
"\n",
"print(mape(rf_preds, valid_y))\n",
"print(mape(nn_preds, nn_y))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### normalized Mean Absolute Error / nMAE"
]
},
{
"cell_type": "code",
"execution_count": 126,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.21197161576388418\n",
"tensor(0.1915)\n"
]
}
],
"source": [
"def nmae(preds, y): return np.abs((preds - y)).mean() / np.abs(preds).mean()\n",
"\n",
"print(nmae(rf_preds, valid_y))\n",
"print(nmae(nn_preds, nn_y))"
]
}
],
"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.8.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment