Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
ML_intro_DutchShellFish.ipynb
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "ML_intro_DutchShellFish.ipynb",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/dvorkbod/caab1b6ce5bb5a8cabc742ddef477b22/ml_intro_dutchshellfish.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "LLX2X2KqVsl6",
"colab_type": "text"
},
"source": [
"# EMODnet workshop on machine learning"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "GJBs_flRovLc"
},
"source": [
"## Getting Started\n",
"\n",
"The document you are reading is a [Jupyter notebook](https://jupyter.org/), hosted in Colaboratory. It is not a static page, but an interactive environment that lets you write and execute code in Python and other languages.\n",
"\n",
"For example, here is a **code cell** with a short Python script that computes a value, stores it in a variable, and prints the result:"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "gJr_9dXGpJ05",
"outputId": "6cc9ba17-a11e-4f8b-a94e-c4a2b2bee4a8",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"seconds_in_a_day = 24 * 60 * 60\n",
"seconds_in_a_day"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"86400"
]
},
"metadata": {
"tags": []
},
"execution_count": 1
}
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "2fhs6GZ4qFMx"
},
"source": [
"To execute the code in the above cell, select it with a click and then either press the play button to the left of the code, or use the keyboard shortcut \"Command/Ctrl+Enter\".\n",
"\n",
"All cells modify the same global state, so variables that you define by executing a cell can be used in other cells:"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "-gE-Ez1qtyIA",
"outputId": "027661c2-9854-4c4c-8cba-1a50729e871d",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"seconds_in_a_week = 7 * seconds_in_a_day\n",
"seconds_in_a_week"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"604800"
]
},
"metadata": {
"tags": []
},
"execution_count": 2
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2h6A2gfMubRf",
"colab_type": "text"
},
"source": [
"## Introduction"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "UJ4YJYHwuGq8",
"colab_type": "text"
},
"source": [
"Let's implement some machine learning techniques to perform classification and regression.\n",
"I have prepared a dataset for you, describing some shellfish habitat locations on the Dutch coast."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6rikOsS4uxsI",
"colab_type": "text"
},
"source": [
"We first import some packages to facilitate data manipulation and plotting.\n",
"We will be using `pandas` dataframes. For plotting, we will use `matplotlib` and `seaborn`. Throughout the text, you will encounter some more import statements. I could have included them all here, but I prefer to keep them close to where we first use them, so you can easily know what to google for inspiration or more explanation."
]
},
{
"cell_type": "code",
"metadata": {
"id": "n3TDojlMz6Sh",
"colab_type": "code",
"colab": {}
},
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "EkIrN8CQvLfP",
"colab_type": "text"
},
"source": [
"I have prepared different datasets. The datasets consist of 20 000 samples, but differ in the number of classes they contain. This will make the classification easier or harder (as good as impossible).\n",
"\n",
"Datsets are publicly hosted at gist.github.com."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3WZGd9J4vq8q",
"colab_type": "text"
},
"source": [
"Uncomment one `url` below to choose your dataset.\n",
"Best to start with the small 3 classes dataset first."
]
},
{
"cell_type": "code",
"metadata": {
"id": "trHN43K3z84B",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 198
},
"outputId": "48e7bb1f-3a92-4d71-a1fb-a06f3fb9a532"
},
"source": [
"# Small many classes dataset\n",
"#url = 'https://gist.githubusercontent.com/dvorkbod/1c50ff0091b7bbd3e9e8cb8f2a2800fd/raw/16ed8f92e493c2fa5e22867b45556c8b66d544dc/DutchShellFish_restricted_manyclasses.csv'\n",
"\n",
"# Tiny many classes dataset\n",
"#url = 'https://gist.githubusercontent.com/dvorkbod/1c50ff0091b7bbd3e9e8cb8f2a2800fd/raw/16ed8f92e493c2fa5e22867b45556c8b66d544dc/DutchShellFish_restricted_tinysample.csv'\n",
"\n",
"# Small 7 classes dataset\n",
"#url = 'https://gist.githubusercontent.com/dvorkbod/1c50ff0091b7bbd3e9e8cb8f2a2800fd/raw/16ed8f92e493c2fa5e22867b45556c8b66d544dc/DutchShellFish_restricted_7classes.csv'\n",
"\n",
"# Small 5 classes dataset\n",
"#url = 'https://gist.githubusercontent.com/dvorkbod/1c50ff0091b7bbd3e9e8cb8f2a2800fd/raw/16ed8f92e493c2fa5e22867b45556c8b66d544dc/DutchShellFish_restricted_5classes.csv'\n",
"\n",
"# Small 3 classes dataset\n",
"url = 'https://gist.githubusercontent.com/dvorkbod/433cc731c5d497d1db6140225361dbdb/raw/4fb2d10a5bb782c3f643315d6d5fb487964b1367/DutchShellFish_restricted_3classes.csv'\n",
"\n",
"# Tiny 3 classes dataset\n",
"#url = 'https://gist.githubusercontent.com/dvorkbod/433cc731c5d497d1db6140225361dbdb/raw/4fb2d10a5bb782c3f643315d6d5fb487964b1367/DutchShellFish_restricted_3classes_tiny.csv'\n",
"\n",
"class_df = pd.read_csv(url)"
],
"execution_count": 1,
"outputs": [
{
"output_type": "error",
"ename": "NameError",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-1-50755b92b673>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m#url = 'https://gist.githubusercontent.com/dvorkbod/433cc731c5d497d1db6140225361dbdb/raw/4fb2d10a5bb782c3f643315d6d5fb487964b1367/DutchShellFish_restricted_3classes_tiny.csv'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mclass_df\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'pd' is not defined"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kmq3GeO6y-ud",
"colab_type": "text"
},
"source": [
"## First look at the data"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TRea8LxfwLK4",
"colab_type": "text"
},
"source": [
"Now that we have picked a dataset, let's take a look at the column names. These are the *features* of the objects in the dataset, as well as the *class* of the object."
]
},
{
"cell_type": "code",
"metadata": {
"id": "ZzN7miGuW7mj",
"colab_type": "code",
"outputId": "9620cbab-ea20-4e3f-cd5f-0f88da2c7c89",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 119
}
},
"source": [
"class_df.columns"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Index(['datecollected', 'yearcollected', 'monthcollected', 'decimallongitude',\n",
" 'decimallatitude', 'Bedabundance', 'fishing', 'bathy', 'BO_phosphate',\n",
" 'BO_nitrate', 'BO_salinity', 'BO_sstmax', 'BO_sstmean', 'BO_dissox',\n",
" 'BO2_curvelmax_bdmax', 'BO2_lightbotmax_bdmax', 'coastdist',\n",
" 'substrate', 'scientificname'],\n",
" dtype='object')"
]
},
"metadata": {
"tags": []
},
"execution_count": 5
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eH5IOuSYwVfF",
"colab_type": "text"
},
"source": [
"The `scientificname` is the name of the shellfish observed at the given longitude and latitude.\n",
"The remainding indicators describe the seawater conditions at that location, as well as the fishing intensity.\n",
"More to the point, we have:\n",
"\n",
"* datecollected, monthcollected: YMD and month of sampling\n",
"* decimallongitude, decimallatitude: location of sampling\n",
"* Bedabundance: count of individuals per m² (#/m^2)\n",
"* fishing: fishing intensity (average number of hours spent by Fishing ships in a square kilometre over a month)\n",
"* bathy: bathymetry information\n",
"* BO_phosphate, BO_nitrate, BO_salinity: environmental layers: phosphate, nitrate, salinity\n",
"* BO_sstmax, BO_sstmean: : max and mean sea surface temperature\n",
"* BO_dissox: dissolved oxygen\n",
"* BO2_curvelmax_bdmax: Current velocity (maximum at max depth)\n",
"* BO2_lightbotmax_bdmax: Light at bottom (maximum at max depth)\n",
"* coastdist: distance to the coast in meters\n",
"* substrate: type of substrate\n",
"* scientificname: species"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Hnbu9316xX5n",
"colab_type": "text"
},
"source": [
"We can observe class distributions by plotting the number of times each `scientificname` is present in the dataset."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cZ3pwXhPycxK",
"colab_type": "text"
},
"source": [
"Let's create `label_id` to refer to `scientificname`. That way, if we later want to classify something else, we have to adjust our code in only one location."
]
},
{
"cell_type": "code",
"metadata": {
"id": "VU9XHeYXyUhO",
"colab_type": "code",
"colab": {}
},
"source": [
"label_id = 'scientificname'"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "s0tON_k90Did",
"colab_type": "code",
"outputId": "d8ba5785-0f89-436b-cdd1-d68cb27ea1ee",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 295
}
},
"source": [
"unique, counts = np.unique(class_df[label_id], return_counts=True)\n",
"\n",
"plt.bar(unique, counts, 1)\n",
"plt.title('Class Frequency')\n",
"plt.xlabel('Class')\n",
"plt.ylabel('Frequency')\n",
"plt.show()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nJM2OiLZWx2Gr8ufS//gzqWagHKpaDGxTGh+VZWZm1scGSuK4GRgraYykDYCDgRktjsnMbJ00IA5V\nRcRKSZ8FrgbWA6ZFxJ0tDmsg8KG7/smfS//jz6QCRUSrYzAzswFkoByqMjOzfsKJw8zMKnHiGEAk\nPSfp1tKrctcrkl4t6eI64qubpBUNyj4t6dAWxLJ/nV3fSDpW0pcrzvOS/dPkfF+QNHhN5q24nlGS\nLpO0QNLfJZ2SF7v0NM9oSfO6mXa8pHfXE201ku6TtFWD8lq/J63icxwDiKQVEbFpq+Nolb7efkmi\n+Bt5vq/WWVr3scCKiPhehXnWaP9Iug9oi4jaboDLfXkjcEZE/DS7EZoKLI2Ir/Qw32jg8oh4fS/E\nMCgiVr7c5XSz7PvohX1YZ4y9yS2OtUD+2jlO0lxJd0jaMcvfWWqd3CJps/IvOEk7S7opp98uaWxr\nt6S68i9zSeMk3ZDbcqmkYVm+vaRrJN2W++i1kjaVNKu0zyZm3dHZmea5wDxgm+xgc27OPyvrfULS\naTl8jqRTJf1F0j2SDszyPSRdXor1NEmfyOETJc3PWLtLDjtJuj6XeWRpOV+SNC9fX2iwT7aW9If8\nXOdJenuWnyFptqQ7JR2XZUcCrwauk3Rdlq0oLetASefk8IdyebdJ+kPFj2pP4KmI+ClARDwHfBH4\nL0mDc39eltu7QNKU0rzrSToz4/6dpI0znnNK+/qFX/yS2iRdn8PHSjpP0p+B8/Lz/WN+nnMl/Uej\nYBvt45z3b5J+LukuSRdr1Zba5xr8DXb9nhxYWseKfN8jY5oBzM+yX0uak9s8mf4mIvwaIC/gOeDW\n0uvDWX4f8Lkc/gxwVg7/BnhrDm9Kcfn1aGBelv0QOCSHNwA2bvU2rmb7VzQoOxb4cg7fDrwzh48H\nTs7hG4H35/BGwODcF5tn2VZAO6DcP88Du+W04RTd3YzJ8S3y/RPAaTl8DnARxQ+xnSj6VQPYg+LX\ncmesp+V8WwJ382KLf2g32/UXYMOM72FgfeDNwB3AJvmZ3gm8qbx/gKOA/5vD6wGbdYl9PeB64I2l\n789WjfYzcCBwTg7fAYzsLubVfHZHAic1KL8FeGPulwdy32xMkbTb8vNYCYzL+hcCHyvt9wO7bkPO\nd31pP84hv9v52W+Uw2OB2Q1iariPM5bgxb+pabz43buPxn+Dn2DV78mBXfczxffkcfI71uWz6twX\nW7b676/8cotjYHkyIsaVXheUpl2S73MovuAAfwZ+kL8qh8ZLm8B/BY6R9FVgu4h4ss7g6yRpCMU2\n/j6LpgPvkLQZxT+7SwEi4qmIeIIiSXxb0u3ANRT9oY3Iee+PiBtyeDfgDxFxb86/tJsQfh0Rz0fE\n/NJyurMceAo4W9IHgCe6qXdFRDwdxeGPJbnctwGXRsTjEbGC4nN/e5f5bgYOU3G46w0R8ViWHyRp\nLsU/650pklwVfwbOkfRJiuTT22ZGxMP5PbyEYlsB7o2IW3O4/P1u1ozSd3t94ExJd1Ak+0b7oKd9\nvDAi/pzDPyvFCI3/Bpt1U+d3LB0p6TbgBopeM/rV0QAnjrXH0/n+HHljZ0ScCPwfil8tf+5sPneK\niF8A+wNPAldK2rPvwm25QyhaE2+OiHHAQxStESh+/VX1dGlY+b6SVf/GNoLihlaKHp8vBt4HXNXE\nMl/4XFcnIv4AvIOiW55zJB0qaQzwZWBCRLwRuIIXt/cli+gacy7308DXKf6RzZG0ZTPxpPkUv+Rf\nIGlzYFuK1l7X9ZbHm9kP5X3ddbvKn+cXKT7rXShaJj2enG+guxjLca42Rkmv6LLuF2KUtAfwbmD3\niNiFItF391m1hBPHWkzSayPijoj4DsWv0B27TH8NcE9EnApcRnHIYECKiOXAss7j+cDHgd/nr+1F\nkg4AkLRhHpceAiyJiGclvYvuewW9gaLlMibn36JCWPdTnKfYUNJQYEIuY1NgSERcSfGPbJcKy/wj\ncECeF9gEeH+WvUDSdsBDEXEmcBYwHtic4p/TckkjKJ5t0+kxYLPS+EOS/i3/ub2/tNzXRsSNEfEN\noINV+49bnVnAYOUVcCpOjn+f4jBYZ4vrPZK2yHMYB1C0cJp1Hy8mpg/2UG8I8EAUFzx8nMYtp572\n8baSds/hjwJ/WsMY96do/XQX47KIeCJ/7O1WYR19woljYNlYq16Oe+Jq6n8hT+7dDjwL/LbL9IOA\neZJuBV4PnFtDzL1psKRFpdeXukyfBHw3t3ccxXkOKP5BHJnlfwFeBfwcaMtDFocCf2u0wojooOiu\n/5I8dHBBo3rdzLuQ4pj8vHy/JSdtBlye8fwJ6LodPS1zLsWx8psozt2cFRG3dKm2B3CbpFuADwOn\nRMRtuf6/Ab9g1X/KU4GrOk+OA0cDl1PsqwdK9b6bJ37n5bTbKsQdFP+APyRpAfC/FIfrjilVuwn4\nFcW5ql9FxOxmlw8cB5wiaTbFL/7unA5Mys9yRxq0Llezj+8GjpB0FzAMOKNCjGcC78x1795o3ekq\nYFCu40SKHy/9ii/HNbOWU3G1WVtEfLbVsXRHvXhp8EDnFoeZmVXiFoeZmVXiFoeZmVXixGFmZpU4\ncZiZWSVOHGYvk6RXSTpfRY+WcY2QAAABY0lEQVSvcyRdKel16qZXV7OBbkA8Otasv5Ik4FJgekQc\nnGW7sPpuR8wGLLc4zF6edwHPRsSPOwvyZruFnePd9ciqBr3YSlove1GdlzfbfbHvN8msZ25xmL08\nr6fo1K4nS4D3RMRTKrqu/yVFP0kfBa6OiBOyC47BFHe8j+y8ySy7KjHrV5w4zOq3PnCapHEU3WG8\nLstvBqZJWp+id91bJd0DvEbSDyk6IvxdSyI264EPVZm9PHfSpdfXBhr2yNqoF9uIWJb1rgc+TdFJ\noVm/4sRh9vJcC2xYfkqbpDeyas+xDXtkbdSLrYqn2L0iIn5F0YX5+L7ZDLPm+VCV2csQESHp/cDJ\n+UCspyi6zy4/0vV04FfZpfhVvNgr6h7AVyQ9C6yg6KV3JPDT7NIc4Gu1b4RZRe6ryszMKvGhKjMz\nq8SJw8zMKnHiMDOzSpw4zMysEicOMzOrxInDzMwqceIwM7NK/j9aCW0Y5KicEgAAAABJRU5ErkJg\ngg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "X-nmOZrwyxWm",
"colab_type": "text"
},
"source": [
"In the three-class dataset, we have one class that is more prevalent, and two that are about equally common."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Z3GTrmLdy5Qk",
"colab_type": "text"
},
"source": [
"#### Consider plotting the substrate distribution as well. You can repurpose the code from above!"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tRsHeXqq0TlG",
"colab_type": "text"
},
"source": [
"## Correlation of descriptors"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XZ2vhTlY0ZJn",
"colab_type": "text"
},
"source": [
"A first step in machine learning is often to look at the correlation between different indicators. Some indicators that are highly correlated with each other could end up being redundant."
]
},
{
"cell_type": "code",
"metadata": {
"id": "fBqNPtuT1rBZ",
"colab_type": "code",
"outputId": "00da37d2-78ad-4fff-b769-6b0c490b6669",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 355
}
},
"source": [
"corr = class_df.corr()\n",
"ax = sns.heatmap(\n",
" corr, \n",
" vmin=-1, vmax=1, center=0,\n",
" cmap=sns.diverging_palette(20, 220, n=200),\n",
" square=True\n",
")\n",
"ax.set_xticklabels(\n",
" ax.get_xticklabels(),\n",
" rotation=45,\n",
" horizontalalignment='right'\n",
");"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nSUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u2K55AU30_tj",
"colab_type": "text"
},
"source": [
"#### Given your knowledge of marine ecology, do the above correlations surprise you? Do they make sense?\n",
"This type of expert knowledge is sometimse also called domain knowledge. Incorporating domain knowledge in feature selection and so on used to be a very important step in achieving good results in machine learning.\n",
"\n",
"These days, when doing deep learning, this is often no longer the case: The machine is fed with so much raw data that it lears the domain knowledge by itself!"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_zlZFf5qGgAv",
"colab_type": "text"
},
"source": [
"Bedabundance isn't really correlated to anything else. Let's take a look at this feature."
]
},
{
"cell_type": "code",
"metadata": {
"id": "uKlfnlywGpVc",
"colab_type": "code",
"outputId": "adf86000-a7b4-437b-cccf-42ab477abdce",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 170
}
},
"source": [
"class_df['Bedabundance'].describe()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"count 20000.000000\n",
"mean 10.482118\n",
"std 71.786574\n",
"min 0.020000\n",
"25% 0.221000\n",
"50% 0.702000\n",
"75% 3.184500\n",
"max 4304.176000\n",
"Name: Bedabundance, dtype: float64"
]
},
"metadata": {
"tags": []
},
"execution_count": 9
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "I8pnPi1DGwE2",
"colab_type": "text"
},
"source": [
"Those percentiles are weird! That max value seems very high compared to the 75% percentile. Let's plot all of the values."
]
},
{
"cell_type": "code",
"metadata": {
"id": "IxLcFTuLG7AW",
"colab_type": "code",
"outputId": "adf7149d-c12d-423c-d85c-3a3a7f60196a",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 286
}
},
"source": [
"plt.scatter(np.arange(0,len(class_df)),class_df['Bedabundance'].sort_values())"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7f6bef92ef28>"
]
},
"metadata": {
"tags": []
},
"execution_count": 10
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "f8mtkp1ZIbCy",
"colab_type": "text"
},
"source": [
"So, it turns out there are some major differences between the Bedabundances. In case you wanted to chop off the data after the 90% percentile, comment out the next line of code. When continuing on with the rest of this notebook, try to think about what effects this could have. Not every technique will be equally strongly affected."
]
},
{
"cell_type": "code",
"metadata": {
"id": "sqyFF40zIEKp",
"colab_type": "code",
"colab": {}
},
"source": [
"class_df = class_df[class_df['Bedabundance'] < class_df['Bedabundance'].quantile(.90)]"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "PoGew_ESJce7",
"colab_type": "text"
},
"source": [
"If you did remove the top 10% of the Bedabundance sites, consider checking what happened to the correlation matrix."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "r8C_mJN1aSg9",
"colab_type": "text"
},
"source": [
"## Classification"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bmwkrwsMQG5u",
"colab_type": "text"
},
"source": [
"To prepare the data for classification, we will separate the class, the `label_id`, from the features.\n",
"\n",
"We will store the labels in a dataframe `y`, and the features in a dataframe `x`."
]
},
{
"cell_type": "code",
"metadata": {
"id": "IOjrO1U03EgV",
"colab_type": "code",
"outputId": "0c1530b8-a4fc-4c71-fde9-8aa4fa4139cd",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 68
}
},
"source": [
"y = class_df[label_id]\n",
"x = class_df.drop([label_id], axis=1)\n",
"\n",
"print (\"dataset : \",class_df.shape)\n",
"print (\"x : \",x.shape)\n",
"print (\"y : \",y.shape)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"dataset : (18000, 19)\n",
"x : (18000, 18)\n",
"y : (18000,)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "06RaiysHQcv-",
"colab_type": "text"
},
"source": [
"the `head()` command on a dataframe returns the first 5 rows. We often use it to take a look at the columns of the dataset."
]
},
{
"cell_type": "code",
"metadata": {
"id": "5OMdKwqmAqRF",
"colab_type": "code",
"outputId": "189af76b-f3b6-447f-9b77-57abce1da9e5",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 258
}
},
"source": [
"x.head()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"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>datecollected</th>\n",
" <th>yearcollected</th>\n",
" <th>monthcollected</th>\n",
" <th>decimallongitude</th>\n",
" <th>decimallatitude</th>\n",
" <th>Bedabundance</th>\n",
" <th>fishing</th>\n",
" <th>bathy</th>\n",
" <th>BO_phosphate</th>\n",
" <th>BO_nitrate</th>\n",
" <th>BO_salinity</th>\n",
" <th>BO_sstmax</th>\n",
" <th>BO_sstmean</th>\n",
" <th>BO_dissox</th>\n",
" <th>BO2_curvelmax_bdmax</th>\n",
" <th>BO2_lightbotmax_bdmax</th>\n",
" <th>coastdist</th>\n",
" <th>substrate</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2011-04-11</td>\n",
" <td>2011</td>\n",
" <td>4</td>\n",
" <td>4.083333</td>\n",
" <td>52.000000</td>\n",
" <td>2.474</td>\n",
" <td>3.580371</td>\n",
" <td>9.470000</td>\n",
" <td>1.3149</td>\n",
" <td>23.789000</td>\n",
" <td>32.712002</td>\n",
" <td>20.052999</td>\n",
" <td>12.533</td>\n",
" <td>5.696</td>\n",
" <td>0.197045</td>\n",
" <td>51.959618</td>\n",
" <td>1163.095498</td>\n",
" <td>Muddy sand</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2014-06-26</td>\n",
" <td>2014</td>\n",
" <td>6</td>\n",
" <td>3.733333</td>\n",
" <td>51.766667</td>\n",
" <td>0.617</td>\n",
" <td>2.567846</td>\n",
" <td>4.050000</td>\n",
" <td>1.3208</td>\n",
" <td>22.468000</td>\n",
" <td>33.276001</td>\n",
" <td>19.679001</td>\n",
" <td>12.216</td>\n",
" <td>5.707</td>\n",
" <td>0.194461</td>\n",
" <td>52.213890</td>\n",
" <td>2891.283835</td>\n",
" <td>Sand</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2006-07-05</td>\n",
" <td>2006</td>\n",
" <td>7</td>\n",
" <td>4.625000</td>\n",
" <td>53.133333</td>\n",
" <td>0.256</td>\n",
" <td>1.027181</td>\n",
" <td>21.440001</td>\n",
" <td>0.8338</td>\n",
" <td>16.073000</td>\n",
" <td>33.201000</td>\n",
" <td>19.153000</td>\n",
" <td>11.706</td>\n",
" <td>5.962</td>\n",
" <td>0.330311</td>\n",
" <td>0.000172</td>\n",
" <td>9061.493935</td>\n",
" <td>Coarse substrate</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2007-04-24</td>\n",
" <td>2007</td>\n",
" <td>4</td>\n",
" <td>6.166667</td>\n",
" <td>53.550000</td>\n",
" <td>2.177</td>\n",
" <td>7.273304</td>\n",
" <td>13.780000</td>\n",
" <td>0.9326</td>\n",
" <td>21.235001</td>\n",
" <td>31.950001</td>\n",
" <td>19.655001</td>\n",
" <td>11.557</td>\n",
" <td>6.291</td>\n",
" <td>0.272504</td>\n",
" <td>52.218163</td>\n",
" <td>5174.087562</td>\n",
" <td>Sand</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2015-05-04</td>\n",
" <td>2015</td>\n",
" <td>5</td>\n",
" <td>3.883333</td>\n",
" <td>51.866667</td>\n",
" <td>0.353</td>\n",
" <td>14.173340</td>\n",
" <td>6.980000</td>\n",
" <td>1.3188</td>\n",
" <td>23.136999</td>\n",
" <td>33.012001</td>\n",
" <td>19.698999</td>\n",
" <td>12.213</td>\n",
" <td>5.697</td>\n",
" <td>0.202623</td>\n",
" <td>20.613363</td>\n",
" <td>4246.686223</td>\n",
" <td>Sand</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" datecollected yearcollected ... coastdist substrate\n",
"0 2011-04-11 2011 ... 1163.095498 Muddy sand\n",
"1 2014-06-26 2014 ... 2891.283835 Sand\n",
"2 2006-07-05 2006 ... 9061.493935 Coarse substrate\n",
"3 2007-04-24 2007 ... 5174.087562 Sand\n",
"4 2015-05-04 2015 ... 4246.686223 Sand\n",
"\n",
"[5 rows x 18 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 13
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "J6E46_tRan48",
"colab_type": "text"
},
"source": [
"The \"datecollected\" feature is a string. Let's drop it, and use month and year instead."
]
},
{
"cell_type": "code",
"metadata": {
"id": "ge44Tf1dcTtb",
"colab_type": "code",
"colab": {}
},
"source": [
"x.drop(['datecollected'], axis=1,inplace=True)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "KozS6EEvfV2Y",
"colab_type": "code",
"colab": {}
},
"source": [
"x = pd.concat([x, pd.get_dummies(x['yearcollected'], prefix='month_')], axis=1)\n",
"x = pd.concat([x, pd.get_dummies(x['monthcollected'], prefix='year_')], axis=1)\n",
"x = pd.concat([x, pd.get_dummies(x['substrate'])], axis=1)\n",
"\n",
"x.drop(['yearcollected'], axis=1,inplace=True)\n",
"x.drop(['monthcollected'], axis=1,inplace=True)\n",
"x.drop(['substrate'], axis=1,inplace=True)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "1CPyeRjSQteC",
"colab_type": "text"
},
"source": [
"A more indepth examination is possible with the `describe()` command."
]
},
{
"cell_type": "code",
"metadata": {
"id": "3yh49IMBQ1gN",
"colab_type": "code",
"outputId": "482ce3da-773f-44f1-e7a4-7fc51fd96f96",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 334
}
},
"source": [
"x.describe()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"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>decimallongitude</th>\n",
" <th>decimallatitude</th>\n",
" <th>Bedabundance</th>\n",
" <th>fishing</th>\n",
" <th>bathy</th>\n",
" <th>BO_phosphate</th>\n",
" <th>BO_nitrate</th>\n",
" <th>BO_salinity</th>\n",
" <th>BO_sstmax</th>\n",
" <th>BO_sstmean</th>\n",
" <th>BO_dissox</th>\n",
" <th>BO2_curvelmax_bdmax</th>\n",
" <th>BO2_lightbotmax_bdmax</th>\n",
" <th>coastdist</th>\n",
" <th>month__2004</th>\n",
" <th>month__2005</th>\n",
" <th>month__2006</th>\n",
" <th>month__2007</th>\n",
" <th>month__2008</th>\n",
" <th>month__2009</th>\n",
" <th>month__2010</th>\n",
" <th>month__2011</th>\n",
" <th>month__2012</th>\n",
" <th>month__2013</th>\n",
" <th>month__2014</th>\n",
" <th>month__2015</th>\n",
" <th>month__2016</th>\n",
" <th>month__2017</th>\n",
" <th>year__3</th>\n",
" <th>year__4</th>\n",
" <th>year__5</th>\n",
" <th>year__6</th>\n",
" <th>year__7</th>\n",
" <th>year__8</th>\n",
" <th>year__9</th>\n",
" <th>Coarse substrate</th>\n",
" <th>Mixed sediment</th>\n",
" <th>Muddy sand</th>\n",
" <th>Sand</th>\n",
" <th>Sandy mud</th>\n",
" <th>Seabed</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>1.800000e+04</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.00000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" <td>18000.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>4.532537</td>\n",
" <td>52.589559</td>\n",
" <td>1.684170</td>\n",
" <td>4.120040</td>\n",
" <td>14.889183</td>\n",
" <td>1.085573</td>\n",
" <td>20.360427</td>\n",
" <td>32.908975</td>\n",
" <td>19.461016</td>\n",
" <td>11.883879</td>\n",
" <td>5.904686</td>\n",
" <td>0.250199</td>\n",
" <td>2.048642e+01</td>\n",
" <td>8619.186728</td>\n",
" <td>0.049667</td>\n",
" <td>0.046111</td>\n",
" <td>0.070222</td>\n",
" <td>0.081111</td>\n",
" <td>0.074056</td>\n",
" <td>0.072500</td>\n",
" <td>0.071278</td>\n",
" <td>0.069556</td>\n",
" <td>0.067889</td>\n",
" <td>0.071333</td>\n",
" <td>0.081611</td>\n",
" <td>0.084611</td>\n",
" <td>0.084222</td>\n",
" <td>0.075833</td>\n",
" <td>0.008222</td>\n",
" <td>0.40850</td>\n",
" <td>0.323889</td>\n",
" <td>0.216778</td>\n",
" <td>0.030167</td>\n",
" <td>0.003278</td>\n",
" <td>0.009167</td>\n",
" <td>0.055278</td>\n",
" <td>0.001333</td>\n",
" <td>0.011889</td>\n",
" <td>0.829722</td>\n",
" <td>0.097167</td>\n",
" <td>0.004611</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>0.856364</td>\n",
" <td>0.746854</td>\n",
" <td>2.580633</td>\n",
" <td>5.357022</td>\n",
" <td>6.801131</td>\n",
" <td>0.216050</td>\n",
" <td>2.560947</td>\n",
" <td>0.463071</td>\n",
" <td>0.313240</td>\n",
" <td>0.267694</td>\n",
" <td>0.201641</td>\n",
" <td>0.050850</td>\n",
" <td>2.468351e+01</td>\n",
" <td>5502.211419</td>\n",
" <td>0.217261</td>\n",
" <td>0.209732</td>\n",
" <td>0.255528</td>\n",
" <td>0.273013</td>\n",
" <td>0.261869</td>\n",
" <td>0.259321</td>\n",
" <td>0.257295</td>\n",
" <td>0.254404</td>\n",
" <td>0.251562</td>\n",
" <td>0.257388</td>\n",
" <td>0.273779</td>\n",
" <td>0.278310</td>\n",
" <td>0.277729</td>\n",
" <td>0.264739</td>\n",
" <td>0.090305</td>\n",
" <td>0.49157</td>\n",
" <td>0.467971</td>\n",
" <td>0.412061</td>\n",
" <td>0.171050</td>\n",
" <td>0.057160</td>\n",
" <td>0.095306</td>\n",
" <td>0.228528</td>\n",
" <td>0.036491</td>\n",
" <td>0.108389</td>\n",
" <td>0.375887</td>\n",
" <td>0.296193</td>\n",
" <td>0.067750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>3.162500</td>\n",
" <td>51.383333</td>\n",
" <td>0.020000</td>\n",
" <td>0.000054</td>\n",
" <td>-0.240000</td>\n",
" <td>0.739700</td>\n",
" <td>14.152000</td>\n",
" <td>31.379000</td>\n",
" <td>18.707001</td>\n",
" <td>11.377000</td>\n",
" <td>5.671000</td>\n",
" <td>0.109856</td>\n",
" <td>7.068152e-07</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.00000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>3.800000</td>\n",
" <td>51.850000</td>\n",
" <td>0.206000</td>\n",
" <td>0.709532</td>\n",
" <td>9.420000</td>\n",
" <td>0.874500</td>\n",
" <td>18.339001</td>\n",
" <td>32.581001</td>\n",
" <td>19.256001</td>\n",
" <td>11.644000</td>\n",
" <td>5.735000</td>\n",
" <td>0.210191</td>\n",
" <td>8.470287e-04</td>\n",
" <td>4296.762423</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.00000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>4.458333</td>\n",
" <td>52.550000</td>\n",
" <td>0.567000</td>\n",
" <td>1.895385</td>\n",
" <td>15.940000</td>\n",
" <td>1.090600</td>\n",
" <td>20.849001</td>\n",
" <td>32.956001</td>\n",
" <td>19.462999</td>\n",
" <td>11.895000</td>\n",
" <td>5.823000</td>\n",
" <td>0.246820</td>\n",
" <td>4.290867e-01</td>\n",
" <td>7548.709778</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.00000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>5.125000</td>\n",
" <td>53.450000</td>\n",
" <td>1.828000</td>\n",
" <td>5.317977</td>\n",
" <td>20.520000</td>\n",
" <td>1.295800</td>\n",
" <td>22.563000</td>\n",
" <td>33.236000</td>\n",
" <td>19.642000</td>\n",
" <td>12.051000</td>\n",
" <td>6.099000</td>\n",
" <td>0.287816</td>\n",
" <td>5.153546e+01</td>\n",
" <td>11853.852833</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1.00000</td>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>6.541667</td>\n",
" <td>53.700000</td>\n",
" <td>13.276000</td>\n",
" <td>53.632763</td>\n",
" <td>30.340000</td>\n",
" <td>1.493800</td>\n",
" <td>24.700001</td>\n",
" <td>34.037998</td>\n",
" <td>21.150000</td>\n",
" <td>12.841000</td>\n",
" <td>6.366000</td>\n",
" <td>0.371960</td>\n",
" <td>5.532480e+01</td>\n",
" <td>25144.521954</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.00000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" decimallongitude decimallatitude ... Sandy mud Seabed\n",
"count 18000.000000 18000.000000 ... 18000.000000 18000.000000\n",
"mean 4.532537 52.589559 ... 0.097167 0.004611\n",
"std 0.856364 0.746854 ... 0.296193 0.067750\n",
"min 3.162500 51.383333 ... 0.000000 0.000000\n",
"25% 3.800000 51.850000 ... 0.000000 0.000000\n",
"50% 4.458333 52.550000 ... 0.000000 0.000000\n",
"75% 5.125000 53.450000 ... 0.000000 0.000000\n",
"max 6.541667 53.700000 ... 1.000000 1.000000\n",
"\n",
"[8 rows x 41 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 16
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "e14Q5NLuQ5-u",
"colab_type": "text"
},
"source": [
"We will split the dataset in a training set and a test set."
]
},
{
"cell_type": "code",
"metadata": {
"id": "-wcnBiFY3enc",
"colab_type": "code",
"outputId": "f4dcb49e-2592-496e-eada-dc45727fc8ca",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 51
}
},
"source": [
"#Selective import Scikit Learn \n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Generate Training and Validation Sets\n",
"x_train, x_test, y_train, y_test = train_test_split(x,y, test_size=0.3) #0.3 data as data test\n",
"\n",
"#converting to float 32bit - not actually needed\n",
"#x_train = np.array(x_train).astype(np.float32)\n",
"#x_test = np.array(x_test).astype(np.float32)\n",
"#y_train = np.array(y_train).astype(np.float32)\n",
"#y_test = np.array(y_test).astype(np.float32)\n",
"\n",
"#print data split for validation\n",
"print(x_train.shape, y_train.shape)\n",
"print(x_test.shape, y_test.shape)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"(12600, 41) (12600,)\n",
"(5400, 41) (5400,)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "wTMvlbZTafQX",
"colab_type": "text"
},
"source": [
"### Neural Network Classification"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZdT1CDW9SLBh",
"colab_type": "text"
},
"source": [
"Let's dive straight in with a neural network classifier. Spoiler: It won't work very well on factory settings. Or even when fiddling with the hidden layer sizes and learning rates. Nevertheless, there are some settings where the network starts to learn a little bit.\n",
"The starting `hidden_layer_sizes=(100,5), max_iter=2000, alpha=0.01, solver='adam'` is not one of those settings.\n",
"\n",
"\n",
"> Hidden layer sizes allow to specify how big the network has to be.\n",
">\n",
"> The alpha term determines how fast it learns from the input it gets. If it becomes too large, the network reacts too fast and goes all over the place.\n",
">\n",
"> There are three different solvers for weight optimization in the MLPClassifier:\n",
">\n",
">> ‘lbfgs’ is an optimizer in the family of quasi-Newton methods.\n",
">> ‘sgd’ refers to stochastic gradient descent.\n",
">> ‘adam’ refers to a stochastic gradient-based optimizer proposed by Kingma, Diederik, and Jimmy Ba\n",
">>\n",
">> Note: The default solver ‘adam’ works pretty well on relatively large datasets (with thousands of training samples or more) in terms of both training time and validation score. For small datasets, however, ‘lbfgs’ can converge faster and perform better.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "sKUZY0Bv3kOk",
"colab_type": "code",
"colab": {}
},
"source": [
"#Importing our model\n",
"from sklearn.neural_network import MLPClassifier\n",
"\n",
"#model initialization\n",
"Model = MLPClassifier(hidden_layer_sizes=(400,20), max_iter=2000, alpha=0.001, #try changing hidden layers and learning rate alpha\n",
" solver='adam', verbose=0, random_state=121) #try verbose=0 to train with out logging\n",
"#train our model\n",
"h=Model.fit(x_train,y_train)\n",
"#use our model to predict\n",
"NN_pred=Model.predict(x_test)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ppus2z6E31Ee",
"colab_type": "code",
"outputId": "04a9f27d-d25b-44b3-ad44-d7a7c8f7dc76",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 312
}
},
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.plot(h.loss_curve_)\n",
"plt.title('Loss History')\n",
"plt.xlabel('epoch')\n",
"plt.legend(['Loss'])"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f6be9a27d30>"
]
},
"metadata": {
"tags": []
},
"execution_count": 19
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "h4vZ09zD3sBX",
"colab_type": "code",
"outputId": "1cc7d264-c08d-4b68-925b-a8cec6f05af6",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 187
}
},
"source": [
"#scikit for machine learning reporting\n",
"from sklearn.metrics import mean_squared_error \n",
"from sklearn.metrics import classification_report\n",
"from sklearn.metrics import confusion_matrix\n",
"from sklearn.metrics import accuracy_score\n",
"\n",
"print(classification_report(y_test,NN_pred)) # Print summary report"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Ensis 0.66 0.12 0.21 1971\n",
"Liocarcinus holsatus 0.46 0.84 0.60 1803\n",
" Ophiura ophiura 0.37 0.40 0.38 1626\n",
"\n",
" accuracy 0.45 5400\n",
" macro avg 0.50 0.45 0.40 5400\n",
" weighted avg 0.51 0.45 0.39 5400\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SRph9qp1x0SE",
"colab_type": "text"
},
"source": [
"The reported averages include macro average (averaging the unweighted mean per label), weighted average (averaging the support-weighted mean per label), sample average (only for multilabel classification) and micro average (averaging the total true positives, false negatives and false positives) "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vgjavnP1x6sz",
"colab_type": "text"
},
"source": [
"We also take a look at the confusion matrix, showing which objects get (mis)classified as which."
]
},
{
"cell_type": "code",
"metadata": {
"id": "LHbjy6cPx3pu",
"colab_type": "code",
"outputId": "3a9fbeef-57d3-45b1-b597-d17940f84c83",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 68
}
},
"source": [
"print(confusion_matrix(y_test, NN_pred)) # Print Confusion matrix "
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"[[ 245 891 835]\n",
" [ 34 1521 248]\n",
" [ 90 893 643]]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "EImqfRjCyEzU",
"colab_type": "code",
"outputId": "5f40f333-547b-4208-d9c8-4001a8fd3cba",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"print('accuracy is ',accuracy_score(NN_pred,y_test)) # Print accuracy score"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"accuracy is 0.4461111111111111\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SWF-KORKBeia",
"colab_type": "text"
},
"source": [
"### Decision trees"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2hin43bNvFrK",
"colab_type": "text"
},
"source": [
"Decision Trees are a non-parametric supervised learning method used for classification and regression. The goal is to create a model that predicts the value of a target variable by learning simple decision rules inferred from the data features.\n",
"\n",
"It will do so by learning a set of if-then-else decision rules. The deeper the tree, the more complex the decision rules and the fitter the model.\n",
"\n",
"Some advantages of decision trees are:\n",
"\n",
"> Simple to understand and to interpret. Trees can be visualised.\n",
"> \n",
"> Requires little data preparation. Other techniques often require data normalisation, dummy variables need to be created and blank values to be removed. > Able to handle both numerical and categorical data. Other techniques are usually specialised in analysing datasets that have only one type of variable.\n",
"> \n",
"> Able to handle multi-output problems.\n",
"> \n",
"> Uses a white box model. If a given situation is observable in a model, the explanation for the condition is easily explained by boolean logic. By contrast, in a black box model (e.g., in an artificial neural network), results may be more difficult to interpret.\n",
"> \n",
"> Possible to validate a model using statistical tests. That makes it possible to account for the reliability of the model.\n",
"> \n",
"> Performs well even if its assumptions are somewhat violated by the true model from which the data were generated.\n",
"\n",
"The disadvantages of decision trees include:\n",
"\n",
"> Decision-tree learners can create over-complex trees that do not generalise the data well. This is called overfitting. Mechanisms such as pruning, setting the minimum number of samples required at a leaf node or setting the maximum depth of the tree are necessary to avoid this problem.\n",
"> \n",
"> Decision trees can be unstable because small variations in the data might result in a completely different tree being generated. This problem is mitigated by using decision trees within an ensemble.\n",
"> \n",
"> The problem of learning an optimal decision tree is known to be NP-complete under several aspects of optimality and even for simple concepts. Consequently, practical decision-tree learning algorithms are based on heuristic algorithms such as the greedy algorithm where locally optimal decisions are made at each node. Such algorithms cannot guarantee to return the globally optimal decision tree. This can be mitigated by training multiple trees in an ensemble learner, where the features and samples are randomly sampled with replacement.\n",
"> \n",
"> There are concepts that are hard to learn because decision trees do not express them easily, such as XOR, parity or multiplexer problems.\n",
"> \n",
"> Decision tree learners create biased trees if some classes dominate. It is therefore recommended to balance the dataset prior to fitting with the decision tree.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0vPwdZqCv9ed",
"colab_type": "text"
},
"source": [
"**Which of these advantages and disadvantages do you think will come in to play here?**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "X9vyVw4O85K1",
"colab_type": "code",
"colab": {}
},
"source": [
"from sklearn import tree\n",
"\n",
"treemodel = tree.DecisionTreeClassifier()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ATzGuiGK85Nl",
"colab_type": "code",
"outputId": "a47560d2-6924-4ed9-a34a-de7174ce6285",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 119
}
},
"source": [
"treemodel.fit(x_train, y_train)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,\n",
" max_features=None, max_leaf_nodes=None,\n",
" min_impurity_decrease=0.0, min_impurity_split=None,\n",
" min_samples_leaf=1, min_samples_split=2,\n",
" min_weight_fraction_leaf=0.0, presort=False,\n",
" random_state=None, splitter='best')"
]
},
"metadata": {
"tags": []
},
"execution_count": 24
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "wJst5XPa85Qj",
"colab_type": "code",
"outputId": "667a370c-ad0e-483b-b64c-2da2f49a363d",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 187
}
},
"source": [
"tree_pred = treemodel.predict(x_test)\n",
"\n",
"from sklearn.metrics import accuracy_score\n",
"\n",
"print(classification_report(y_test,tree_pred))"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Ensis 0.50 0.50 0.50 1971\n",
"Liocarcinus holsatus 0.51 0.49 0.50 1803\n",
" Ophiura ophiura 0.37 0.39 0.38 1626\n",
"\n",
" accuracy 0.46 5400\n",
" macro avg 0.46 0.46 0.46 5400\n",
" weighted avg 0.46 0.46 0.46 5400\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "8zFt6yZtMpmf",
"colab_type": "code",
"outputId": "382e5a46-496e-4209-b991-c87d22ad609c",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"score = accuracy_score(y_test, tree_pred)\n",
"print(score)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"0.46166666666666667\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "pinQL9ij85Tb",
"colab_type": "code",
"outputId": "804a78f9-b98b-43f4-aaed-0d536340476c",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 68
}
},
"source": [
"confusion_matrix(y_test, tree_pred)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[979, 399, 593],\n",
" [440, 886, 477],\n",
" [529, 469, 628]])"
]
},
"metadata": {
"tags": []
},
"execution_count": 27
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "onAtGY3jBb_s",
"colab_type": "text"
},
"source": [
"### Random Forest"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BVo9hS61wSDI",
"colab_type": "text"
},
"source": [
"We will now test an upgrade to decision trees, a random forest. A random forest consists of---you might have guessed it---a number of decision trees forming an *ensemble*.\n",
"\n",
"In random forests, each tree in the ensemble is built from a sample drawn with replacement from the training set.\n",
"\n",
"Furthermore, when splitting each node during the construction of a tree, the best split is found either from all input features or a random subset of size `max_features`.\n",
"\n",
"The purpose of these two sources of randomness is to decrease the variance of the forest estimator. Indeed, individual decision trees typically exhibit high variance and tend to overfit. The injected randomness in forests yield decision trees with somewhat decoupled prediction errors. By taking an average of those predictions, some errors can cancel out. Random forests achieve a reduced variance by combining diverse trees, sometimes at the cost of a slight increase in bias. In practice the variance reduction is often significant hence yielding an overall better model."
]
},
{
"cell_type": "code",
"metadata": {
"id": "mzGeCRcjBYnm",
"colab_type": "code",
"outputId": "47634300-1524-48d8-d766-80a50311e67d",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"from sklearn.model_selection import train_test_split\n",
"import pandas as pd\n",
"import numpy as np\n",
"from keras.models import Sequential\n",
"from keras.layers import Dense, Activation, Flatten\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.metrics import f1_score\n",
"from sklearn.metrics import accuracy_score\n",
"from keras.callbacks import ModelCheckpoint\n",
"from sklearn.metrics import accuracy_score"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "mH4diUkO85WD",
"colab_type": "code",
"colab": {}
},
"source": [
"parameters = {'bootstrap': True,\n",
" 'min_samples_leaf': 3,\n",
" 'n_estimators': 50, \n",
" 'min_samples_split': 10,\n",
" 'max_features': 'sqrt',\n",
" 'max_depth': 6,\n",
" 'max_leaf_nodes': None}"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "K5IQO1jO85Yj",
"colab_type": "code",
"colab": {}
},
"source": [
"RF_model = RandomForestClassifier(**parameters)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "b4_wqRKqBoc_",
"colab_type": "code",
"outputId": "67a9178c-0dce-48db-8616-f01ca3945b44",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 136
}
},
"source": [
"RF_model.fit(x_train, y_train)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',\n",
" max_depth=6, max_features='sqrt', max_leaf_nodes=None,\n",
" min_impurity_decrease=0.0, min_impurity_split=None,\n",
" min_samples_leaf=3, min_samples_split=10,\n",
" min_weight_fraction_leaf=0.0, n_estimators=50,\n",
" n_jobs=None, oob_score=False, random_state=None,\n",
" verbose=0, warm_start=False)"
]
},
"metadata": {
"tags": []
},
"execution_count": 31
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "ikbJL8LjBuTH",
"colab_type": "code",
"colab": {}
},
"source": [
"RF_pred = RF_model.predict(x_test)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "RSYmRU1OBzX-",
"colab_type": "code",
"outputId": "51777687-8b5d-4156-a056-2fa957f09bbf",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"score = accuracy_score(y_test, RF_pred)\n",
"print(score)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"0.5459259259259259\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "_deYDZ6rzSUl",
"colab_type": "code",
"outputId": "bae2a21a-096d-4aba-e7d4-d026ddd10d44",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 187
}
},
"source": [
"print(classification_report(y_test,RF_pred))"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Ensis 0.58 0.58 0.58 1971\n",
"Liocarcinus holsatus 0.55 0.80 0.65 1803\n",
" Ophiura ophiura 0.46 0.22 0.30 1626\n",
"\n",
" accuracy 0.55 5400\n",
" macro avg 0.53 0.53 0.51 5400\n",
" weighted avg 0.53 0.55 0.52 5400\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "P3WhBFVSaejT",
"colab_type": "code",
"outputId": "bbcb545e-7a75-47f3-e47a-028b3b46b766",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 68
}
},
"source": [
"confusion_matrix(y_test, RF_pred)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[1146, 545, 280],\n",
" [ 218, 1441, 144],\n",
" [ 619, 646, 361]])"
]
},
"metadata": {
"tags": []
},
"execution_count": 35
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fhV-k3MOcVR1",
"colab_type": "text"
},
"source": [
"#### ADA-boost classifier"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "RtjDAoLiw8dW",
"colab_type": "text"
},
"source": [
"Not all classes seemed as easily recognised, earlier on. Especially the third class seemed to present the classifier with difficulties. We will now test the ADA-boost classifier. \n",
"\n",
"An AdaBoost classifier is a meta-estimator that begins by fitting a classifier on the original dataset and then fits additional copies of the classifier on the same dataset but where the weights of incorrectly classified instances are adjusted such that subsequent classifiers focus more on difficult cases.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "SIHPr7yNcUl_",
"colab_type": "code",
"colab": {}
},
"source": [
"# Load libraries\n",
"from sklearn.ensemble import AdaBoostClassifier\n",
"from sklearn import datasets\n",
"# Import train_test_split function\n",
"from sklearn.model_selection import train_test_split\n",
"#Import scikit-learn metrics module for accuracy calculation\n",
"from sklearn import metrics"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "I0kA7-zocYzQ",
"colab_type": "code",
"colab": {}
},
"source": [
"# Create adaboost classifer object\n",
"abc = AdaBoostClassifier(n_estimators=50,\n",
" learning_rate=1)\n",
"# Train Adaboost Classifer\n",
"model = abc.fit(x_train, y_train)\n",
"\n",
"#Predict the response for test dataset\n",
"ADA_pred = model.predict(x_test)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "37bc_ORAc00K",
"colab_type": "code",
"outputId": "10c5ee59-fa8f-4df8-b845-34745136d123",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"score = accuracy_score(y_test, ADA_pred)\n",
"score"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.5274074074074074"
]
},
"metadata": {
"tags": []
},
"execution_count": 38
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "vF9ZboXxzV2J",
"colab_type": "code",
"outputId": "76bd0140-cb02-4be7-aaaa-540d3f94da83",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 187
}
},
"source": [
"print(classification_report(y_test,ADA_pred))"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" Ensis 0.58 0.53 0.56 1971\n",
"Liocarcinus holsatus 0.56 0.72 0.63 1803\n",
" Ophiura ophiura 0.39 0.31 0.35 1626\n",
"\n",
" accuracy 0.53 5400\n",
" macro avg 0.51 0.52 0.51 5400\n",
" weighted avg 0.52 0.53 0.52 5400\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "5MxdNqMScsqQ",
"colab_type": "code",
"outputId": "cf900bf0-25bc-4827-e623-ee4d5bdcae56",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 68
}
},
"source": [
"confusion_matrix(y_test, ADA_pred)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[1050, 460, 461],\n",
" [ 186, 1293, 324],\n",
" [ 566, 555, 505]])"
]
},
"metadata": {
"tags": []
},
"execution_count": 40
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tKdMeJuMbBr-",
"colab_type": "text"
},
"source": [
"## Regression"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "OTo6J0M-JMQ9",
"colab_type": "text"
},
"source": [
"### Linear Regression"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "UOpNcwVscXDr",
"colab_type": "text"
},
"source": [
"We will now perform some regression techniques. Trying to predict bed abundance might be a bit of a stretch, but we can try. Perhaps the phyisco chemical characteristics might be easier. Remember how they these were quite correlated, after all."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "G3H-cotjJ_U8",
"colab_type": "text"
},
"source": [
"We first create a new dataset and again define the target and create dummy variables for year and month."
]
},
{
"cell_type": "code",
"metadata": {
"id": "qBsb51FxbId6",
"colab_type": "code",
"outputId": "aac3bba3-1736-4a27-c779-2900e09f6cf7",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"reg_df = class_df# pd.read_csv(url)\n",
"\n",
"print (\"dataset : \",reg_df.shape)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"dataset : (18000, 19)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "Dhyvs9x4bKDs",
"colab_type": "code",
"outputId": "09f808fc-cdb8-4309-8fea-a8d8d5e6545d",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 68
}
},
"source": [
"target = 'BO2_curvelmax_bdmax'\n",
"#target = 'Bedabundance'\n",
"\n",
"y = reg_df[target]\n",
"\n",
"x = reg_df.drop([target], axis=1)\n",
"x = pd.concat([x, pd.get_dummies(reg_df['scientificname'])], axis=1)\n",
"x = pd.concat([x, pd.get_dummies(x['yearcollected'], prefix='year_')], axis=1)\n",
"x = pd.concat([x, pd.get_dummies(x['monthcollected'], prefix='month_')], axis=1)\n",
"x = pd.concat([x, pd.get_dummies(x['substrate'])], axis=1)\n",
"\n",
"x.drop(['scientificname'], axis=1,inplace=True)\n",
"x.drop(['datecollected'], axis=1,inplace=True)\n",
"x.drop(['yearcollected'], axis=1,inplace=True)\n",
"x.drop(['monthcollected'], axis=1,inplace=True)\n",
"x.drop(['substrate'], axis=1,inplace=True)\n",
"x.drop(['decimallatitude'], axis=1,inplace=True)\n",
"x.drop(['decimallongitude'], axis=1,inplace=True)\n",
"\n",
"print (\"dataset : \",reg_df.shape)\n",
"print (\"x : \",x.shape)\n",
"print (\"y : \",y.shape)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"dataset : (18000, 19)\n",
"x : (18000, 41)\n",
"y : (18000,)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "P2Xkcowad0Q9",
"colab_type": "code",
"outputId": "5d11a938-63d6-4709-9d4e-39f5ae64bdf7",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"from sklearn.linear_model import LinearRegression\n",
"model = LinearRegression(fit_intercept=True)\n",
"\n",
"x_train, x_test, y_train, y_test = train_test_split(x,y, test_size=0.3) #0.3 data as data test\n",
"model.fit(x_train,y_train)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)"
]