Created
December 29, 2019 18:04
-
-
Save sabineri/8807e46d263d775f71720a5af89df7b8 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<a href=\"https://www.bigdatauniversity.com\"><img src = \"https://ibm.box.com/shared/static/cw2c7r3o20w9zn8gkecaeyjhgw3xdgbj.png\" width = 400, align = \"center\"></a>\n", | |
"# <center>Density-Based Clustering</center>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Most of the traditional clustering techniques, such as k-means, hierarchical and fuzzy clustering, can be used to group data without supervision. \n", | |
"\n", | |
"However, when applied to tasks with arbitrary shape clusters, or clusters within cluster, the traditional techniques might be unable to achieve good results. That is, elements in the same cluster might not share enough similarity or the performance may be poor.\n", | |
"Additionally, Density-based Clustering locates regions of high density that are separated from one another by regions of low density. Density, in this context, is defined as the number of points within a specified radius.\n", | |
"\n", | |
"\n", | |
"\n", | |
"In this section, the main focus will be manipulating the data and properties of DBSCAN and observing the resulting clustering." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Import the following libraries:\n", | |
"<ul>\n", | |
" <li> <b>numpy as np</b> </li>\n", | |
" <li> <b>DBSCAN</b> from <b>sklearn.cluster</b> </li>\n", | |
" <li> <b>make_blobs</b> from <b>sklearn.datasets.samples_generator</b> </li>\n", | |
" <li> <b>StandardScaler</b> from <b>sklearn.preprocessing</b> </li>\n", | |
" <li> <b>matplotlib.pyplot as plt</b> </li>\n", | |
"</ul> <br>\n", | |
"Remember <b> %matplotlib inline </b> to display plots" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Solving environment: failed\n", | |
"\n", | |
"PackagesNotFoundError: The following packages are not available from current channels:\n", | |
"\n", | |
" - basemap==1.1.0\n", | |
"\n", | |
"Current channels:\n", | |
"\n", | |
" - https://conda.anaconda.org/conda-forge/linux-64\n", | |
" - https://conda.anaconda.org/conda-forge/noarch\n", | |
" - https://repo.anaconda.com/pkgs/main/linux-64\n", | |
" - https://repo.anaconda.com/pkgs/main/noarch\n", | |
" - https://repo.anaconda.com/pkgs/free/linux-64\n", | |
" - https://repo.anaconda.com/pkgs/free/noarch\n", | |
" - https://repo.anaconda.com/pkgs/r/linux-64\n", | |
" - https://repo.anaconda.com/pkgs/r/noarch\n", | |
" - https://repo.anaconda.com/pkgs/pro/linux-64\n", | |
" - https://repo.anaconda.com/pkgs/pro/noarch\n", | |
"\n", | |
"To search for alternate channels that may provide the conda package you're\n", | |
"looking for, navigate to\n", | |
"\n", | |
" https://anaconda.org\n", | |
"\n", | |
"and use the search bar at the top of the page.\n", | |
"\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"# Notice: For visualization of map, you need basemap package.\n", | |
"# if you dont have basemap install on your machine, you can use the following line to install it\n", | |
"#!conda install -c conda-forge basemap==1.1.0 matplotlib==2.2.2 -y\n", | |
"# Notice: you maight have to refresh your page and re-run the notebook after installation" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import sklearn\n", | |
"import numpy as np \n", | |
"from sklearn.cluster import DBSCAN \n", | |
"from sklearn.datasets.samples_generator import make_blobs \n", | |
"from sklearn.preprocessing import StandardScaler \n", | |
"import matplotlib.pyplot as plt \n", | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"\n", | |
"Note: you may need to restart the kernel to use updated packages.\n" | |
] | |
} | |
], | |
"source": [ | |
"conda config --append channels conda-forge" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Solving environment: failed\n", | |
"\n", | |
"PackagesNotFoundError: The following packages are not available from current channels:\n", | |
"\n", | |
" - basemap==1.1.0\n", | |
"\n", | |
"Current channels:\n", | |
"\n", | |
" - https://conda.anaconda.org/conda-forge/linux-64\n", | |
" - https://conda.anaconda.org/conda-forge/noarch\n", | |
" - https://repo.anaconda.com/pkgs/main/linux-64\n", | |
" - https://repo.anaconda.com/pkgs/main/noarch\n", | |
" - https://repo.anaconda.com/pkgs/free/linux-64\n", | |
" - https://repo.anaconda.com/pkgs/free/noarch\n", | |
" - https://repo.anaconda.com/pkgs/r/linux-64\n", | |
" - https://repo.anaconda.com/pkgs/r/noarch\n", | |
" - https://repo.anaconda.com/pkgs/pro/linux-64\n", | |
" - https://repo.anaconda.com/pkgs/pro/noarch\n", | |
"\n", | |
"To search for alternate channels that may provide the conda package you're\n", | |
"looking for, navigate to\n", | |
"\n", | |
" https://anaconda.org\n", | |
"\n", | |
"and use the search bar at the top of the page.\n", | |
"\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"!conda install -c conda-forge basemap==1.1.0 matplotlib==2.2.2 -y" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Data generation\n", | |
"The function below will generate the data points and requires these inputs:\n", | |
"<ul>\n", | |
" <li> <b>centroidLocation</b>: Coordinates of the centroids that will generate the random data. </li>\n", | |
" <ul> <li> Example: input: [[4,3], [2,-1], [-1,4]] </li> </ul>\n", | |
" <li> <b>numSamples</b>: The number of data points we want generated, split over the number of centroids (# of centroids defined in centroidLocation) </li>\n", | |
" <ul> <li> Example: 1500 </li> </ul>\n", | |
" <li> <b>clusterDeviation</b>: The standard deviation between the clusters. The larger the number, the further the spacing. </li>\n", | |
" <ul> <li> Example: 0.5 </li> </ul>\n", | |
"</ul>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def createDataPoints(centroidLocation, numSamples, clusterDeviation):\n", | |
" # Create random data and store in feature matrix X and response vector y.\n", | |
" X, y = make_blobs(n_samples=numSamples, centers=centroidLocation, \n", | |
" cluster_std=clusterDeviation)\n", | |
" \n", | |
" # Standardize features by removing the mean and scaling to unit variance\n", | |
" X = StandardScaler().fit_transform(X)\n", | |
" return X, y" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Use <b>createDataPoints</b> with the <b>3 inputs</b> and store the output into variables <b>X</b> and <b>y</b>." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"X, y = createDataPoints([[4,3], [2,-1], [-1,4]] , 1500, 0.5)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Modeling\n", | |
"DBSCAN stands for Density-Based Spatial Clustering of Applications with Noise. This technique is one of the most common clustering algorithms which works based on density of object.\n", | |
"The whole idea is that if a particular point belongs to a cluster, it should be near to lots of other points in that cluster.\n", | |
"\n", | |
"It works based on two parameters: Epsilon and Minimum Points \n", | |
"__Epsilon__ determine a specified radius that if includes enough number of points within, we call it dense area \n", | |
"__minimumSamples__ determine the minimum number of data points we want in a neighborhood to define a cluster.\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([0, 1, 1, ..., 1, 2, 1])" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"epsilon = 0.3\n", | |
"minimumSamples = 7\n", | |
"db = DBSCAN(eps=epsilon, min_samples=minimumSamples).fit(X)\n", | |
"labels = db.labels_\n", | |
"labels" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Distinguish outliers\n", | |
"Lets Replace all elements with 'True' in core_samples_mask that are in the cluster, 'False' if the points are outliers." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([ True, True, True, ..., True, True, True])" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Firts, create an array of booleans using the labels from db.\n", | |
"core_samples_mask = np.zeros_like(db.labels_, dtype=bool)\n", | |
"core_samples_mask[db.core_sample_indices_] = True\n", | |
"core_samples_mask" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"3" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Number of clusters in labels, ignoring noise if present.\n", | |
"n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)\n", | |
"n_clusters_" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{-1, 0, 1, 2}" | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Remove repetition in labels by turning it into a set.\n", | |
"unique_labels = set(labels)\n", | |
"unique_labels" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Data visualization" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Create colors for the clusters.\n", | |
"colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels)))\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# Plot the points with colors\n", | |
"for k, col in zip(unique_labels, colors):\n", | |
" if k == -1:\n", | |
" # Black used for noise.\n", | |
" col = 'k'\n", | |
"\n", | |
" class_member_mask = (labels == k)\n", | |
"\n", | |
" # Plot the datapoints that are clustered\n", | |
" xy = X[class_member_mask & core_samples_mask]\n", | |
" plt.scatter(xy[:, 0], xy[:, 1],s=50, c=[col], marker=u'o', alpha=0.5)\n", | |
"\n", | |
" # Plot the outliers\n", | |
" xy = X[class_member_mask & ~core_samples_mask]\n", | |
" plt.scatter(xy[:, 0], xy[:, 1],s=50, c=[col], marker=u'o', alpha=0.5)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Practice\n", | |
"To better underestand differences between partitional and density-based clusteitng, try to cluster the above dataset into 3 clusters using k-Means. \n", | |
"Notice: do not generate data again, use the same dataset as above." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"'c' argument looks like a single numeric RGB or RGBA sequence, which should be avoided as value-mapping will have precedence in case its length matches with 'x' & 'y'. Please use a 2-D array with a single row if you really want to specify the same RGB or RGBA value for all points.\n", | |
"'c' argument looks like a single numeric RGB or RGBA sequence, which should be avoided as value-mapping will have precedence in case its length matches with 'x' & 'y'. Please use a 2-D array with a single row if you really want to specify the same RGB or RGBA value for all points.\n", | |
"'c' argument looks like a single numeric RGB or RGBA sequence, which should be avoided as value-mapping will have precedence in case its length matches with 'x' & 'y'. Please use a 2-D array with a single row if you really want to specify the same RGB or RGBA value for all points.\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# write your code here\n", | |
"from sklearn.cluster import KMeans \n", | |
"k = 3\n", | |
"k_means3 = KMeans(init = \"k-means++\", n_clusters = k, n_init = 12)\n", | |
"k_means3.fit(X)\n", | |
"fig = plt.figure(figsize=(6, 4))\n", | |
"ax = fig.add_subplot(1, 1, 1)\n", | |
"for k, col in zip(range(k), colors):\n", | |
" my_members = (k_means3.labels_ == k)\n", | |
" plt.scatter(X[my_members, 0], X[my_members, 1], c=col, marker=u'o', alpha=0.5)\n", | |
"plt.show()\n", | |
"\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Double-click __here__ for the solution.\n", | |
"\n", | |
"<!-- Your answer is below:\n", | |
"\n", | |
"\n", | |
"from sklearn.cluster import KMeans \n", | |
"k = 3\n", | |
"k_means3 = KMeans(init = \"k-means++\", n_clusters = k, n_init = 12)\n", | |
"k_means3.fit(X)\n", | |
"fig = plt.figure(figsize=(6, 4))\n", | |
"ax = fig.add_subplot(1, 1, 1)\n", | |
"for k, col in zip(range(k), colors):\n", | |
" my_members = (k_means3.labels_ == k)\n", | |
" plt.scatter(X[my_members, 0], X[my_members, 1], c=col, marker=u'o', alpha=0.5)\n", | |
"plt.show()\n", | |
"\n", | |
"\n", | |
"-->" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"\n", | |
"\n", | |
"\n", | |
"<h1 align=center> Weather Station Clustering using DBSCAN & scikit-learn </h1>\n", | |
"<hr>\n", | |
"\n", | |
"DBSCAN is specially very good for tasks like class identification on a spatial context. The wonderful attribute of DBSCAN algorithm is that it can find out any arbitrary shape cluster without getting affected by noise. For example, this following example cluster the location of weather stations in Canada.\n", | |
"<Click 1>\n", | |
"DBSCAN can be used here, for instance, to find the group of stations which show the same weather condition. As you can see, it not only finds different arbitrary shaped clusters, can find the denser part of data-centered samples by ignoring less-dense areas or noises.\n", | |
"\n", | |
"let's start playing with the data. We will be working according to the following workflow: </font>\n", | |
"1. Loading data\n", | |
"- Overview data\n", | |
"- Data cleaning\n", | |
"- Data selection\n", | |
"- Clusteing" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### About the dataset\n", | |
"\n", | |
"\t\t\n", | |
"<h4 align = \"center\">\n", | |
"Environment Canada \n", | |
"Monthly Values for July - 2015\t\n", | |
"</h4>\n", | |
"<html>\n", | |
"<head>\n", | |
"<style>\n", | |
"table {\n", | |
" font-family: arial, sans-serif;\n", | |
" border-collapse: collapse;\n", | |
" width: 100%;\n", | |
"}\n", | |
"\n", | |
"td, th {\n", | |
" border: 1px solid #dddddd;\n", | |
" text-align: left;\n", | |
" padding: 8px;\n", | |
"}\n", | |
"\n", | |
"tr:nth-child(even) {\n", | |
" background-color: #dddddd;\n", | |
"}\n", | |
"</style>\n", | |
"</head>\n", | |
"<body>\n", | |
"\n", | |
"<table>\n", | |
" <tr>\n", | |
" <th>Name in the table</th>\n", | |
" <th>Meaning</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td><font color = \"green\"><strong>Stn_Name</font></td>\n", | |
" <td><font color = \"green\"><strong>Station Name</font</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td><font color = \"green\"><strong>Lat</font></td>\n", | |
" <td><font color = \"green\"><strong>Latitude (North+, degrees)</font></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td><font color = \"green\"><strong>Long</font></td>\n", | |
" <td><font color = \"green\"><strong>Longitude (West - , degrees)</font></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>Prov</td>\n", | |
" <td>Province</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>Tm</td>\n", | |
" <td>Mean Temperature (°C)</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>DwTm</td>\n", | |
" <td>Days without Valid Mean Temperature</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>D</td>\n", | |
" <td>Mean Temperature difference from Normal (1981-2010) (°C)</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td><font color = \"black\">Tx</font></td>\n", | |
" <td><font color = \"black\">Highest Monthly Maximum Temperature (°C)</font></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>DwTx</td>\n", | |
" <td>Days without Valid Maximum Temperature</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td><font color = \"black\">Tn</font></td>\n", | |
" <td><font color = \"black\">Lowest Monthly Minimum Temperature (°C)</font></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>DwTn</td>\n", | |
" <td>Days without Valid Minimum Temperature</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>S</td>\n", | |
" <td>Snowfall (cm)</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>DwS</td>\n", | |
" <td>Days without Valid Snowfall</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>S%N</td>\n", | |
" <td>Percent of Normal (1981-2010) Snowfall</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td><font color = \"green\"><strong>P</font></td>\n", | |
" <td><font color = \"green\"><strong>Total Precipitation (mm)</font></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>DwP</td>\n", | |
" <td>Days without Valid Precipitation</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>P%N</td>\n", | |
" <td>Percent of Normal (1981-2010) Precipitation</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>S_G</td>\n", | |
" <td>Snow on the ground at the end of the month (cm)</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>Pd</td>\n", | |
" <td>Number of days with Precipitation 1.0 mm or more</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>BS</td>\n", | |
" <td>Bright Sunshine (hours)</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>DwBS</td>\n", | |
" <td>Days without Valid Bright Sunshine</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>BS%</td>\n", | |
" <td>Percent of Normal (1981-2010) Bright Sunshine</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>HDD</td>\n", | |
" <td>Degree Days below 18 °C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>CDD</td>\n", | |
" <td>Degree Days above 18 °C</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>Stn_No</td>\n", | |
" <td>Climate station identifier (first 3 digits indicate drainage basin, last 4 characters are for sorting alphabetically).</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>NA</td>\n", | |
" <td>Not Available</td>\n", | |
" </tr>\n", | |
"\n", | |
"\n", | |
"</table>\n", | |
"\n", | |
"</body>\n", | |
"</html>\n", | |
"\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 1-Download data\n", | |
"To download the data, we will use **`!wget`**. To download the data, we will use `!wget` to download it from IBM Object Storage. \n", | |
"__Did you know?__ When it comes to Machine Learning, you will likely be working with large datasets. As a business, where can you host your data? IBM is offering a unique opportunity for businesses, with 10 Tb of IBM Cloud Object Storage: [Sign up now for free](http://cocl.us/ML0101EN-IBM-Offer-CC)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"!wget -O weather-stations20140101-20141231.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/weather-stations20140101-20141231.csv" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 2- Load the dataset\n", | |
"We will import the .csv then we creates the columns for year, month and day." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import csv\n", | |
"import pandas as pd\n", | |
"import numpy as np\n", | |
"\n", | |
"filename='weather-stations20140101-20141231.csv'\n", | |
"\n", | |
"#Read csv\n", | |
"pdf = pd.read_csv(filename)\n", | |
"pdf.head(5)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 3-Cleaning\n", | |
"Lets remove rows that dont have any value in the __Tm__ field." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"pdf = pdf[pd.notnull(pdf[\"Tm\"])]\n", | |
"pdf = pdf.reset_index(drop=True)\n", | |
"pdf.head(5)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 4-Visualization\n", | |
"Visualization of stations on map using basemap package. The matplotlib basemap toolkit is a library for plotting 2D data on maps in Python. Basemap does not do any plotting on it’s own, but provides the facilities to transform coordinates to a map projections. \n", | |
"\n", | |
"Please notice that the size of each data points represents the average of maximum temperature for each station in a year. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from mpl_toolkits.basemap import Basemap\n", | |
"import matplotlib.pyplot as plt\n", | |
"from pylab import rcParams\n", | |
"%matplotlib inline\n", | |
"rcParams['figure.figsize'] = (14,10)\n", | |
"\n", | |
"llon=-140\n", | |
"ulon=-50\n", | |
"llat=40\n", | |
"ulat=65\n", | |
"\n", | |
"pdf = pdf[(pdf['Long'] > llon) & (pdf['Long'] < ulon) & (pdf['Lat'] > llat) &(pdf['Lat'] < ulat)]\n", | |
"\n", | |
"my_map = Basemap(projection='merc',\n", | |
" resolution = 'l', area_thresh = 1000.0,\n", | |
" llcrnrlon=llon, llcrnrlat=llat, #min longitude (llcrnrlon) and latitude (llcrnrlat)\n", | |
" urcrnrlon=ulon, urcrnrlat=ulat) #max longitude (urcrnrlon) and latitude (urcrnrlat)\n", | |
"\n", | |
"my_map.drawcoastlines()\n", | |
"my_map.drawcountries()\n", | |
"# my_map.drawmapboundary()\n", | |
"my_map.fillcontinents(color = 'white', alpha = 0.3)\n", | |
"my_map.shadedrelief()\n", | |
"\n", | |
"# To collect data based on stations \n", | |
"\n", | |
"xs,ys = my_map(np.asarray(pdf.Long), np.asarray(pdf.Lat))\n", | |
"pdf['xm']= xs.tolist()\n", | |
"pdf['ym'] =ys.tolist()\n", | |
"\n", | |
"#Visualization1\n", | |
"for index,row in pdf.iterrows():\n", | |
"# x,y = my_map(row.Long, row.Lat)\n", | |
" my_map.plot(row.xm, row.ym,markerfacecolor =([1,0,0]), marker='o', markersize= 5, alpha = 0.75)\n", | |
"#plt.text(x,y,stn)\n", | |
"plt.show()\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 5- Clustering of stations based on their location i.e. Lat & Lon\n", | |
"\n", | |
"__DBSCAN__ form sklearn library can runs DBSCAN clustering from vector array or distance matrix. In our case, we pass it the Numpy array Clus_dataSet to find core samples of high density and expands clusters from them. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from sklearn.cluster import DBSCAN\n", | |
"import sklearn.utils\n", | |
"from sklearn.preprocessing import StandardScaler\n", | |
"sklearn.utils.check_random_state(1000)\n", | |
"Clus_dataSet = pdf[['xm','ym']]\n", | |
"Clus_dataSet = np.nan_to_num(Clus_dataSet)\n", | |
"Clus_dataSet = StandardScaler().fit_transform(Clus_dataSet)\n", | |
"\n", | |
"# Compute DBSCAN\n", | |
"db = DBSCAN(eps=0.15, min_samples=10).fit(Clus_dataSet)\n", | |
"core_samples_mask = np.zeros_like(db.labels_, dtype=bool)\n", | |
"core_samples_mask[db.core_sample_indices_] = True\n", | |
"labels = db.labels_\n", | |
"pdf[\"Clus_Db\"]=labels\n", | |
"\n", | |
"realClusterNum=len(set(labels)) - (1 if -1 in labels else 0)\n", | |
"clusterNum = len(set(labels)) \n", | |
"\n", | |
"\n", | |
"# A sample of clusters\n", | |
"pdf[[\"Stn_Name\",\"Tx\",\"Tm\",\"Clus_Db\"]].head(5)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"As you can see for outliers, the cluster label is -1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"set(labels)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 6- Visualization of clusters based on location\n", | |
"Now, we can visualize the clusters using basemap:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from mpl_toolkits.basemap import Basemap\n", | |
"import matplotlib.pyplot as plt\n", | |
"from pylab import rcParams\n", | |
"%matplotlib inline\n", | |
"rcParams['figure.figsize'] = (14,10)\n", | |
"\n", | |
"my_map = Basemap(projection='merc',\n", | |
" resolution = 'l', area_thresh = 1000.0,\n", | |
" llcrnrlon=llon, llcrnrlat=llat, #min longitude (llcrnrlon) and latitude (llcrnrlat)\n", | |
" urcrnrlon=ulon, urcrnrlat=ulat) #max longitude (urcrnrlon) and latitude (urcrnrlat)\n", | |
"\n", | |
"my_map.drawcoastlines()\n", | |
"my_map.drawcountries()\n", | |
"#my_map.drawmapboundary()\n", | |
"my_map.fillcontinents(color = 'white', alpha = 0.3)\n", | |
"my_map.shadedrelief()\n", | |
"\n", | |
"# To create a color map\n", | |
"colors = plt.get_cmap('jet')(np.linspace(0.0, 1.0, clusterNum))\n", | |
"\n", | |
"\n", | |
"\n", | |
"#Visualization1\n", | |
"for clust_number in set(labels):\n", | |
" c=(([0.4,0.4,0.4]) if clust_number == -1 else colors[np.int(clust_number)])\n", | |
" clust_set = pdf[pdf.Clus_Db == clust_number] \n", | |
" my_map.scatter(clust_set.xm, clust_set.ym, color =c, marker='o', s= 20, alpha = 0.85)\n", | |
" if clust_number != -1:\n", | |
" cenx=np.mean(clust_set.xm) \n", | |
" ceny=np.mean(clust_set.ym) \n", | |
" plt.text(cenx,ceny,str(clust_number), fontsize=25, color='red',)\n", | |
" print (\"Cluster \"+str(clust_number)+', Avg Temp: '+ str(np.mean(clust_set.Tm)))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 7- Clustering of stations based on their location, mean, max, and min Temperature\n", | |
"In this section we re-run DBSCAN, but this time on a 5-dimensional dataset:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from sklearn.cluster import DBSCAN\n", | |
"import sklearn.utils\n", | |
"from sklearn.preprocessing import StandardScaler\n", | |
"sklearn.utils.check_random_state(1000)\n", | |
"Clus_dataSet = pdf[['xm','ym','Tx','Tm','Tn']]\n", | |
"Clus_dataSet = np.nan_to_num(Clus_dataSet)\n", | |
"Clus_dataSet = StandardScaler().fit_transform(Clus_dataSet)\n", | |
"\n", | |
"# Compute DBSCAN\n", | |
"db = DBSCAN(eps=0.3, min_samples=10).fit(Clus_dataSet)\n", | |
"core_samples_mask = np.zeros_like(db.labels_, dtype=bool)\n", | |
"core_samples_mask[db.core_sample_indices_] = True\n", | |
"labels = db.labels_\n", | |
"pdf[\"Clus_Db\"]=labels\n", | |
"\n", | |
"realClusterNum=len(set(labels)) - (1 if -1 in labels else 0)\n", | |
"clusterNum = len(set(labels)) \n", | |
"\n", | |
"\n", | |
"# A sample of clusters\n", | |
"pdf[[\"Stn_Name\",\"Tx\",\"Tm\",\"Clus_Db\"]].head(5)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 8- Visualization of clusters based on location and Temperture\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from mpl_toolkits.basemap import Basemap\n", | |
"import matplotlib.pyplot as plt\n", | |
"from pylab import rcParams\n", | |
"%matplotlib inline\n", | |
"rcParams['figure.figsize'] = (14,10)\n", | |
"\n", | |
"my_map = Basemap(projection='merc',\n", | |
" resolution = 'l', area_thresh = 1000.0,\n", | |
" llcrnrlon=llon, llcrnrlat=llat, #min longitude (llcrnrlon) and latitude (llcrnrlat)\n", | |
" urcrnrlon=ulon, urcrnrlat=ulat) #max longitude (urcrnrlon) and latitude (urcrnrlat)\n", | |
"\n", | |
"my_map.drawcoastlines()\n", | |
"my_map.drawcountries()\n", | |
"#my_map.drawmapboundary()\n", | |
"my_map.fillcontinents(color = 'white', alpha = 0.3)\n", | |
"my_map.shadedrelief()\n", | |
"\n", | |
"# To create a color map\n", | |
"colors = plt.get_cmap('jet')(np.linspace(0.0, 1.0, clusterNum))\n", | |
"\n", | |
"\n", | |
"\n", | |
"#Visualization1\n", | |
"for clust_number in set(labels):\n", | |
" c=(([0.4,0.4,0.4]) if clust_number == -1 else colors[np.int(clust_number)])\n", | |
" clust_set = pdf[pdf.Clus_Db == clust_number] \n", | |
" my_map.scatter(clust_set.xm, clust_set.ym, color =c, marker='o', s= 20, alpha = 0.85)\n", | |
" if clust_number != -1:\n", | |
" cenx=np.mean(clust_set.xm) \n", | |
" ceny=np.mean(clust_set.ym) \n", | |
" plt.text(cenx,ceny,str(clust_number), fontsize=25, color='red',)\n", | |
" print (\"Cluster \"+str(clust_number)+', Avg Temp: '+ str(np.mean(clust_set.Tm)))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Want to learn more?\n", | |
"\n", | |
"IBM SPSS Modeler is a comprehensive analytics platform that has many machine learning algorithms. It has been designed to bring predictive intelligence to decisions made by individuals, by groups, by systems – by your enterprise as a whole. A free trial is available through this course, available here: [SPSS Modeler](http://cocl.us/ML0101EN-SPSSModeler).\n", | |
"\n", | |
"Also, you can use Watson Studio to run these notebooks faster with bigger datasets. Watson Studio is IBM's leading cloud solution for data scientists, built by data scientists. With Jupyter notebooks, RStudio, Apache Spark and popular libraries pre-packaged in the cloud, Watson Studio enables data scientists to collaborate on their projects without having to install anything. Join the fast-growing community of Watson Studio users today with a free account at [Watson Studio](https://cocl.us/ML0101EN_DSX)\n", | |
"\n", | |
"### Thanks for completing this lesson!\n", | |
"\n", | |
"Notebook created by: <a href = \"https://ca.linkedin.com/in/saeedaghabozorgi\">Saeed Aghabozorgi</a>\n", | |
"\n", | |
"<hr>\n", | |
"Copyright © 2018 [Cognitive Class](https://cocl.us/DX0108EN_CC). This notebook and its source code are released under the terms of the [MIT License](https://bigdatauniversity.com/mit-license/)." | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python", | |
"language": "python", | |
"name": "conda-env-python-py" | |
}, | |
"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.6.7" | |
}, | |
"widgets": { | |
"state": {}, | |
"version": "1.1.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment