{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "217d65b8",
"metadata": {},
"outputs": [],
"source": [
"#importing all the libraries needed for this implementation. The warnings module was introduced as a way to warn \n",
"#programmers about changes in language or library features in anticipation of backwards incompatible changes coming \n",
"#with Python 3.0. Since warnings are not fatal, a program may encounter the same warn-able situation many times in \n",
"#the course of running a program\n",
"#The filter is set to ignore so that the warnings are not displayed\n",
"import warnings\n",
"warnings.filterwarnings('ignore')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "056db896",
"metadata": {},
"outputs": [],
"source": [
"#The main purpose of the OS module is to interact with the operating system\n",
"import os"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "83977081",
"metadata": {},
"outputs": [],
"source": [
"#Boto3 is the name of the Python SDK for AWS. The module makes it easy to integrate the Python application, library, or script with AWS services including Amazon S3 and more\n",
"#It allows for direct creation, updating and deletion of AWS resources from your Python scripts\n",
"import boto3"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "9a6e2ff5",
"metadata": {},
"outputs": [],
"source": [
"#Python io module allows us to manage the file-related input and output operations\n",
"import io"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "d201b566",
"metadata": {},
"outputs": [],
"source": [
"#SageMaker Python SDK is an open-source library for training and deploying machine learning models on Amazon SageMaker\n",
"import sagemaker"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "431d51e4",
"metadata": {},
"outputs": [],
"source": [
"#For matrix operations and numerical processing\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "ff1d068f",
"metadata": {},
"outputs": [],
"source": [
"#for munging tabular data\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "fa20648e",
"metadata": {},
"outputs": [],
"source": [
"#For charts and visualizations \n",
"from matplotlib import pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "0ecc9072",
"metadata": {},
"outputs": [],
"source": [
"#Scikit-learn is a machine learning library for Python. It features several regression, classification and clustering \n",
"#algorithms including SVMs, gradient boosting, k-means, random forests and DBSCAN. . Using train_test_split() from the\n",
"#data science library scikit-learn, you can split your dataset into subsets that minimize the potential for bias in \n",
"#your evaluation and validation process.\n",
"import sklearn\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "c9718e1d",
"metadata": {},
"outputs": [],
"source": [
"#With Scikit-Learn it is extremely straight forward to implement linear regression models, as all you really need to \n",
"#do is import the LinearRegression class, instantiate it, and call the fit() method along with our training data.\n",
"from sklearn.linear_model import LinearRegression"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "1ca0e38d",
"metadata": {},
"outputs": [],
"source": [
"#importing other modules that makr it easier to work with the data\n",
"import pickle,gzip,urllib,json,csv"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "7d460506",
"metadata": {},
"outputs": [],
"source": [
"#The preprocessing module provides the StandardScaler utility class, which is a quick and easy way to perform the \n",
"#many operations on an array-like dataset\n",
"from sklearn import preprocessing"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "cfc4d436",
"metadata": {},
"outputs": [],
"source": [
"#Get the execution role for the notebook instance. This is the IAM role that you created for your notebook instance.\n",
"#You pass the role to the tuning job.\n",
"from sagemaker import get_execution_role\n",
"role = get_execution_role()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "291a762b",
"metadata": {},
"outputs": [],
"source": [
"#Resources represent an object-oriented interface to Amazon Web Services (AWS). They provide a higher-level \n",
"#abstraction than the raw, low-level calls made by service clients. Defining the S3 resource, bucket name and csv\n",
"#file object\n",
"s3 = boto3.resource('s3')\n",
"bucket_name = 'aws-machinelearning-chez'\n",
"object_key = 'weatherhistory2.csv'"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "e3ca18e0",
"metadata": {},
"outputs": [],
"source": [
"#Use the boto3 client to retrieve the file from bucket aws-machinelearning-chez named weatherhistory.csv. \n",
"#Define Weather dataset as the csv file read in the response from the get_object operation\n",
"s3_client = boto3.client('s3')\n",
"response = s3_client.get_object(Bucket=bucket_name, Key=object_key)\n",
"response_body = response[\"Body\"].read()\n",
"weather_df = pd.read_csv(io.BytesIO(response_body), header=0, delimiter=\",\", low_memory=False)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "b43f2087",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Formatted Date \n",
" Summary \n",
" Precip Type \n",
" Temperature (C) \n",
" Apparent Temperature (C) \n",
" Humidity \n",
" Wind Speed (km/h) \n",
" Wind Bearing (degrees) \n",
" Visibility (km) \n",
" Loud Cover \n",
" Pressure (millibars) \n",
" Daily Summary \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 2006-04-01 00:00:00.000 +0200 \n",
" Partly Cloudy \n",
" rain \n",
" 9.472222 \n",
" 7.388889 \n",
" 0.89 \n",
" 14.1197 \n",
" 251 \n",
" 15.8263 \n",
" 0 \n",
" 1015.13 \n",
" Partly cloudy throughout the day. \n",
" \n",
" \n",
" 1 \n",
" 2006-04-01 01:00:00.000 +0200 \n",
" Partly Cloudy \n",
" rain \n",
" 9.355556 \n",
" 7.227778 \n",
" 0.86 \n",
" 14.2646 \n",
" 259 \n",
" 15.8263 \n",
" 0 \n",
" 1015.63 \n",
" Partly cloudy throughout the day. \n",
" \n",
" \n",
" 2 \n",
" 2006-04-01 02:00:00.000 +0200 \n",
" Mostly Cloudy \n",
" rain \n",
" 9.377778 \n",
" 9.377778 \n",
" 0.89 \n",
" 3.9284 \n",
" 204 \n",
" 14.9569 \n",
" 0 \n",
" 1015.94 \n",
" Partly cloudy throughout the day. \n",
" \n",
" \n",
" 3 \n",
" 2006-04-01 03:00:00.000 +0200 \n",
" Partly Cloudy \n",
" rain \n",
" 8.288889 \n",
" 5.944444 \n",
" 0.83 \n",
" 14.1036 \n",
" 269 \n",
" 15.8263 \n",
" 0 \n",
" 1016.41 \n",
" Partly cloudy throughout the day. \n",
" \n",
" \n",
" 4 \n",
" 2006-04-01 04:00:00.000 +0200 \n",
" Mostly Cloudy \n",
" rain \n",
" 8.755556 \n",
" 6.977778 \n",
" 0.83 \n",
" 11.0446 \n",
" 259 \n",
" 15.8263 \n",
" 0 \n",
" 1016.51 \n",
" Partly cloudy throughout the day. \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Formatted Date Summary Precip Type Temperature (C) \\\n",
"0 2006-04-01 00:00:00.000 +0200 Partly Cloudy rain 9.472222 \n",
"1 2006-04-01 01:00:00.000 +0200 Partly Cloudy rain 9.355556 \n",
"2 2006-04-01 02:00:00.000 +0200 Mostly Cloudy rain 9.377778 \n",
"3 2006-04-01 03:00:00.000 +0200 Partly Cloudy rain 8.288889 \n",
"4 2006-04-01 04:00:00.000 +0200 Mostly Cloudy rain 8.755556 \n",
"\n",
" Apparent Temperature (C) Humidity Wind Speed (km/h) \\\n",
"0 7.388889 0.89 14.1197 \n",
"1 7.227778 0.86 14.2646 \n",
"2 9.377778 0.89 3.9284 \n",
"3 5.944444 0.83 14.1036 \n",
"4 6.977778 0.83 11.0446 \n",
"\n",
" Wind Bearing (degrees) Visibility (km) Loud Cover Pressure (millibars) \\\n",
"0 251 15.8263 0 1015.13 \n",
"1 259 15.8263 0 1015.63 \n",
"2 204 14.9569 0 1015.94 \n",
"3 269 15.8263 0 1016.41 \n",
"4 259 15.8263 0 1016.51 \n",
"\n",
" Daily Summary \n",
"0 Partly cloudy throughout the day. \n",
"1 Partly cloudy throughout the day. \n",
"2 Partly cloudy throughout the day. \n",
"3 Partly cloudy throughout the day. \n",
"4 Partly cloudy throughout the day. "
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Look at the data\n",
"weather_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "ad2e2238",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Index(['Formatted Date', 'Summary', 'Precip Type', 'Temperature (C)',\n",
" 'Apparent Temperature (C)', 'Humidity', 'Wind Speed (km/h)',\n",
" 'Wind Bearing (degrees)', 'Visibility (km)', 'Loud Cover',\n",
" 'Pressure (millibars)', 'Daily Summary'],\n",
" dtype='object')"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Gives an array of colums names \n",
"weather_df.columns"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "748178d6",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Temperature (C) \n",
" Apparent Temperature (C) \n",
" Humidity \n",
" Wind Speed (km/h) \n",
" Wind Bearing (degrees) \n",
" Visibility (km) \n",
" Loud Cover \n",
" Pressure (millibars) \n",
" \n",
" \n",
" \n",
" \n",
" count \n",
" 96453.000000 \n",
" 96453.000000 \n",
" 96453.000000 \n",
" 96453.000000 \n",
" 96453.000000 \n",
" 96453.000000 \n",
" 96453.0 \n",
" 96453.000000 \n",
" \n",
" \n",
" mean \n",
" 11.932678 \n",
" 10.855029 \n",
" 0.734899 \n",
" 10.810640 \n",
" 187.509232 \n",
" 10.347325 \n",
" 0.0 \n",
" 1003.235956 \n",
" \n",
" \n",
" std \n",
" 9.551546 \n",
" 10.696847 \n",
" 0.195473 \n",
" 6.913571 \n",
" 107.383428 \n",
" 4.192123 \n",
" 0.0 \n",
" 116.969906 \n",
" \n",
" \n",
" min \n",
" -21.822222 \n",
" -27.716667 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.0 \n",
" 0.000000 \n",
" \n",
" \n",
" 25% \n",
" 4.688889 \n",
" 2.311111 \n",
" 0.600000 \n",
" 5.828200 \n",
" 116.000000 \n",
" 8.339800 \n",
" 0.0 \n",
" 1011.900000 \n",
" \n",
" \n",
" 50% \n",
" 12.000000 \n",
" 12.000000 \n",
" 0.780000 \n",
" 9.965900 \n",
" 180.000000 \n",
" 10.046400 \n",
" 0.0 \n",
" 1016.450000 \n",
" \n",
" \n",
" 75% \n",
" 18.838889 \n",
" 18.838889 \n",
" 0.890000 \n",
" 14.135800 \n",
" 290.000000 \n",
" 14.812000 \n",
" 0.0 \n",
" 1021.090000 \n",
" \n",
" \n",
" max \n",
" 39.905556 \n",
" 39.344444 \n",
" 1.000000 \n",
" 63.852600 \n",
" 359.000000 \n",
" 16.100000 \n",
" 0.0 \n",
" 1046.380000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Temperature (C) Apparent Temperature (C) Humidity \\\n",
"count 96453.000000 96453.000000 96453.000000 \n",
"mean 11.932678 10.855029 0.734899 \n",
"std 9.551546 10.696847 0.195473 \n",
"min -21.822222 -27.716667 0.000000 \n",
"25% 4.688889 2.311111 0.600000 \n",
"50% 12.000000 12.000000 0.780000 \n",
"75% 18.838889 18.838889 0.890000 \n",
"max 39.905556 39.344444 1.000000 \n",
"\n",
" Wind Speed (km/h) Wind Bearing (degrees) Visibility (km) Loud Cover \\\n",
"count 96453.000000 96453.000000 96453.000000 96453.0 \n",
"mean 10.810640 187.509232 10.347325 0.0 \n",
"std 6.913571 107.383428 4.192123 0.0 \n",
"min 0.000000 0.000000 0.000000 0.0 \n",
"25% 5.828200 116.000000 8.339800 0.0 \n",
"50% 9.965900 180.000000 10.046400 0.0 \n",
"75% 14.135800 290.000000 14.812000 0.0 \n",
"max 63.852600 359.000000 16.100000 0.0 \n",
"\n",
" Pressure (millibars) \n",
"count 96453.000000 \n",
"mean 1003.235956 \n",
"std 116.969906 \n",
"min 0.000000 \n",
"25% 1011.900000 \n",
"50% 1016.450000 \n",
"75% 1021.090000 \n",
"max 1046.380000 "
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Generate descriptive statistics that summarize the central tendency, dispersion and shape of the dataset’s \n",
"#distribution excluding NaN values\n",
"weather_df.describe()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "59c838b9",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" count \n",
" mean \n",
" std \n",
" min \n",
" 25% \n",
" 50% \n",
" 75% \n",
" max \n",
" \n",
" \n",
" \n",
" \n",
" Temperature (C) \n",
" 96453.0 \n",
" 11.932678 \n",
" 9.551546 \n",
" -21.822222 \n",
" 4.688889 \n",
" 12.0000 \n",
" 18.838889 \n",
" 39.905556 \n",
" \n",
" \n",
" Apparent Temperature (C) \n",
" 96453.0 \n",
" 10.855029 \n",
" 10.696847 \n",
" -27.716667 \n",
" 2.311111 \n",
" 12.0000 \n",
" 18.838889 \n",
" 39.344444 \n",
" \n",
" \n",
" Humidity \n",
" 96453.0 \n",
" 0.734899 \n",
" 0.195473 \n",
" 0.000000 \n",
" 0.600000 \n",
" 0.7800 \n",
" 0.890000 \n",
" 1.000000 \n",
" \n",
" \n",
" Wind Speed (km/h) \n",
" 96453.0 \n",
" 10.810640 \n",
" 6.913571 \n",
" 0.000000 \n",
" 5.828200 \n",
" 9.9659 \n",
" 14.135800 \n",
" 63.852600 \n",
" \n",
" \n",
" Wind Bearing (degrees) \n",
" 96453.0 \n",
" 187.509232 \n",
" 107.383428 \n",
" 0.000000 \n",
" 116.000000 \n",
" 180.0000 \n",
" 290.000000 \n",
" 359.000000 \n",
" \n",
" \n",
" Visibility (km) \n",
" 96453.0 \n",
" 10.347325 \n",
" 4.192123 \n",
" 0.000000 \n",
" 8.339800 \n",
" 10.0464 \n",
" 14.812000 \n",
" 16.100000 \n",
" \n",
" \n",
" Loud Cover \n",
" 96453.0 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.000000 \n",
" 0.0000 \n",
" 0.000000 \n",
" 0.000000 \n",
" \n",
" \n",
" Pressure (millibars) \n",
" 96453.0 \n",
" 1003.235956 \n",
" 116.969906 \n",
" 0.000000 \n",
" 1011.900000 \n",
" 1016.4500 \n",
" 1021.090000 \n",
" 1046.380000 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" count mean std min \\\n",
"Temperature (C) 96453.0 11.932678 9.551546 -21.822222 \n",
"Apparent Temperature (C) 96453.0 10.855029 10.696847 -27.716667 \n",
"Humidity 96453.0 0.734899 0.195473 0.000000 \n",
"Wind Speed (km/h) 96453.0 10.810640 6.913571 0.000000 \n",
"Wind Bearing (degrees) 96453.0 187.509232 107.383428 0.000000 \n",
"Visibility (km) 96453.0 10.347325 4.192123 0.000000 \n",
"Loud Cover 96453.0 0.000000 0.000000 0.000000 \n",
"Pressure (millibars) 96453.0 1003.235956 116.969906 0.000000 \n",
"\n",
" 25% 50% 75% max \n",
"Temperature (C) 4.688889 12.0000 18.838889 39.905556 \n",
"Apparent Temperature (C) 2.311111 12.0000 18.838889 39.344444 \n",
"Humidity 0.600000 0.7800 0.890000 1.000000 \n",
"Wind Speed (km/h) 5.828200 9.9659 14.135800 63.852600 \n",
"Wind Bearing (degrees) 116.000000 180.0000 290.000000 359.000000 \n",
"Visibility (km) 8.339800 10.0464 14.812000 16.100000 \n",
"Loud Cover 0.000000 0.0000 0.000000 0.000000 \n",
"Pressure (millibars) 1011.900000 1016.4500 1021.090000 1046.380000 "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"weather_df.describe().transpose()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "8e8c1115",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#A seaborn plot enables us to visualize a statistical plot of the raw data\n",
"import seaborn\n",
"plt.figure(figsize=(15,10))\n",
"plt.tight_layout()\n",
"seaborn.distplot(weather_df['Apparent Temperature (C)'])\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "7d82a835",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RangeIndex: 96453 entries, 0 to 96452\n",
"Data columns (total 12 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 Formatted Date 96453 non-null object \n",
" 1 Summary 96453 non-null object \n",
" 2 Precip Type 95936 non-null object \n",
" 3 Temperature (C) 96453 non-null float64\n",
" 4 Apparent Temperature (C) 96453 non-null float64\n",
" 5 Humidity 96453 non-null float64\n",
" 6 Wind Speed (km/h) 96453 non-null float64\n",
" 7 Wind Bearing (degrees) 96453 non-null int64 \n",
" 8 Visibility (km) 96453 non-null float64\n",
" 9 Loud Cover 96453 non-null int64 \n",
" 10 Pressure (millibars) 96453 non-null float64\n",
" 11 Daily Summary 96453 non-null object \n",
"dtypes: float64(6), int64(2), object(4)\n",
"memory usage: 8.8+ MB\n"
]
}
],
"source": [
"#Prints a concise summary of the dataframe\n",
"weather_df.info()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "c246ca16",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Formatted Date False\n",
"Summary False\n",
"Precip Type True\n",
"Temperature (C) False\n",
"Apparent Temperature (C) False\n",
"Humidity False\n",
"Wind Speed (km/h) False\n",
"Wind Bearing (degrees) False\n",
"Visibility (km) False\n",
"Loud Cover False\n",
"Pressure (millibars) False\n",
"Daily Summary False\n",
"dtype: bool"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#check if there is any null value in a particular column\n",
"weather_df.isnull().any()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "6c9c0621",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Formatted Date False\n",
"Summary False\n",
"Precip Type False\n",
"Temperature (C) False\n",
"Apparent Temperature (C) False\n",
"Humidity False\n",
"Wind Speed (km/h) False\n",
"Wind Bearing (degrees) False\n",
"Visibility (km) False\n",
"Loud Cover False\n",
"Pressure (millibars) False\n",
"Daily Summary False\n",
"dtype: bool"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#check if there are all null values in a particular column\n",
"weather_df.isnull().all()"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "9a09da4e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Formatted Date 0.00\n",
"Summary 0.00\n",
"Precip Type 0.54\n",
"Temperature (C) 0.00\n",
"Apparent Temperature (C) 0.00\n",
"Humidity 0.00\n",
"Wind Speed (km/h) 0.00\n",
"Wind Bearing (degrees) 0.00\n",
"Visibility (km) 0.00\n",
"Loud Cover 0.00\n",
"Pressure (millibars) 0.00\n",
"Daily Summary 0.00\n",
"dtype: float64"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#calculate the percentage of null values in each column\n",
"round(100*(weather_df.isnull().sum()/len(weather_df.index)),2)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "b0903331",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"rain 85224\n",
"snow 10712\n",
"Name: Precip Type, dtype: int64"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#determine what values are in this column and what the count is of each value\n",
"weather_df['Precip Type'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "cbc2584b",
"metadata": {},
"outputs": [],
"source": [
"#Handling missing values by imputation of the mode i.e. rain\n",
"weather_df.loc[weather_df['Precip Type'].isnull(),'Precip Type']='rain'"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "9ff40c89",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Formatted Date 0.0\n",
"Summary 0.0\n",
"Precip Type 0.0\n",
"Temperature (C) 0.0\n",
"Apparent Temperature (C) 0.0\n",
"Humidity 0.0\n",
"Wind Speed (km/h) 0.0\n",
"Wind Bearing (degrees) 0.0\n",
"Visibility (km) 0.0\n",
"Loud Cover 0.0\n",
"Pressure (millibars) 0.0\n",
"Daily Summary 0.0\n",
"dtype: float64"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#calculate the percentage of null values in each column for the second time\n",
"round(100*(weather_df.isnull().sum()/len(weather_df.index)),2)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "0b15207d",
"metadata": {},
"outputs": [],
"source": [
"#Input binary values in Precip type column for rain and snow\n",
"weather_df.loc[weather_df['Precip Type']=='rain','Precip Type']=1\n",
"weather_df.loc[weather_df['Precip Type']=='snow','Precip Type']=0"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "1fd8dc2e",
"metadata": {},
"outputs": [],
"source": [
"weather_df_num=weather_df[list(weather_df.dtypes[weather_df.dtypes!='odject'].index)]"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "2f744270",
"metadata": {},
"outputs": [],
"source": [
"#Drop columns that are irrelevant to the model training\n",
"to_drop = ['Formatted Date','Summary','Daily Summary']\n",
"weather_df.drop(to_drop, inplace=True, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "dc3b792f",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Precip Type \n",
" Temperature (C) \n",
" Apparent Temperature (C) \n",
" Humidity \n",
" Wind Speed (km/h) \n",
" Wind Bearing (degrees) \n",
" Visibility (km) \n",
" Loud Cover \n",
" Pressure (millibars) \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 1 \n",
" 9.472222 \n",
" 7.388889 \n",
" 0.89 \n",
" 14.1197 \n",
" 251 \n",
" 15.8263 \n",
" 0 \n",
" 1015.13 \n",
" \n",
" \n",
" 1 \n",
" 1 \n",
" 9.355556 \n",
" 7.227778 \n",
" 0.86 \n",
" 14.2646 \n",
" 259 \n",
" 15.8263 \n",
" 0 \n",
" 1015.63 \n",
" \n",
" \n",
" 2 \n",
" 1 \n",
" 9.377778 \n",
" 9.377778 \n",
" 0.89 \n",
" 3.9284 \n",
" 204 \n",
" 14.9569 \n",
" 0 \n",
" 1015.94 \n",
" \n",
" \n",
" 3 \n",
" 1 \n",
" 8.288889 \n",
" 5.944444 \n",
" 0.83 \n",
" 14.1036 \n",
" 269 \n",
" 15.8263 \n",
" 0 \n",
" 1016.41 \n",
" \n",
" \n",
" 4 \n",
" 1 \n",
" 8.755556 \n",
" 6.977778 \n",
" 0.83 \n",
" 11.0446 \n",
" 259 \n",
" 15.8263 \n",
" 0 \n",
" 1016.51 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Precip Type Temperature (C) Apparent Temperature (C) Humidity \\\n",
"0 1 9.472222 7.388889 0.89 \n",
"1 1 9.355556 7.227778 0.86 \n",
"2 1 9.377778 9.377778 0.89 \n",
"3 1 8.288889 5.944444 0.83 \n",
"4 1 8.755556 6.977778 0.83 \n",
"\n",
" Wind Speed (km/h) Wind Bearing (degrees) Visibility (km) Loud Cover \\\n",
"0 14.1197 251 15.8263 0 \n",
"1 14.2646 259 15.8263 0 \n",
"2 3.9284 204 14.9569 0 \n",
"3 14.1036 269 15.8263 0 \n",
"4 11.0446 259 15.8263 0 \n",
"\n",
" Pressure (millibars) \n",
"0 1015.13 \n",
"1 1015.63 \n",
"2 1015.94 \n",
"3 1016.41 \n",
"4 1016.51 "
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"weather_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "ff648831",
"metadata": {},
"outputs": [],
"source": [
"weather_df_num=weather_df[list(weather_df.dtypes[weather_df.dtypes!='odject'].index)]"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "3bc98770",
"metadata": {},
"outputs": [],
"source": [
"#Separating the training and the test datasets. The feature that we are predicting is temperature, so we separate \n",
"#it out into a column on its own (weather_y) leaving the rest of the data in weather_x\n",
"weather_df_y = weather_df_num.pop('Temperature (C)')\n",
"weather_df_x = weather_df_num"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "62fe9537",
"metadata": {},
"outputs": [],
"source": [
"#In supervised machine learning, we add data to the model and tell it what the output will be based on the various \n",
"#conditions of that data. The model then learns from these features and is then able to make a prediction for new \n",
"#values \n",
"#So we now split the data into train and test\n",
"\n",
"train_x,test_x,train_y,test_y = train_test_split(weather_df_x,weather_df_y,test_size = 0.2,random_state=4)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "56acf2bc",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Precip Type \n",
" Apparent Temperature (C) \n",
" Humidity \n",
" Wind Speed (km/h) \n",
" Wind Bearing (degrees) \n",
" Visibility (km) \n",
" Loud Cover \n",
" Pressure (millibars) \n",
" \n",
" \n",
" \n",
" \n",
" 70626 \n",
" 1 \n",
" 21.061111 \n",
" 0.31 \n",
" 12.5580 \n",
" 110 \n",
" 16.1000 \n",
" 0 \n",
" 1005.87 \n",
" \n",
" \n",
" 52457 \n",
" 1 \n",
" 25.016667 \n",
" 0.36 \n",
" 18.4989 \n",
" 352 \n",
" 10.3523 \n",
" 0 \n",
" 1025.36 \n",
" \n",
" \n",
" 90690 \n",
" 1 \n",
" 0.738889 \n",
" 0.89 \n",
" 17.1304 \n",
" 270 \n",
" 15.8263 \n",
" 0 \n",
" 1014.75 \n",
" \n",
" \n",
" 69528 \n",
" 1 \n",
" 13.772222 \n",
" 0.78 \n",
" 14.4900 \n",
" 300 \n",
" 15.8263 \n",
" 0 \n",
" 1014.56 \n",
" \n",
" \n",
" 92419 \n",
" 1 \n",
" 23.288889 \n",
" 0.82 \n",
" 6.3917 \n",
" 357 \n",
" 16.1000 \n",
" 0 \n",
" 1022.05 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Precip Type Apparent Temperature (C) Humidity Wind Speed (km/h) \\\n",
"70626 1 21.061111 0.31 12.5580 \n",
"52457 1 25.016667 0.36 18.4989 \n",
"90690 1 0.738889 0.89 17.1304 \n",
"69528 1 13.772222 0.78 14.4900 \n",
"92419 1 23.288889 0.82 6.3917 \n",
"\n",
" Wind Bearing (degrees) Visibility (km) Loud Cover \\\n",
"70626 110 16.1000 0 \n",
"52457 352 10.3523 0 \n",
"90690 270 15.8263 0 \n",
"69528 300 15.8263 0 \n",
"92419 357 16.1000 0 \n",
"\n",
" Pressure (millibars) \n",
"70626 1005.87 \n",
"52457 1025.36 \n",
"90690 1014.75 \n",
"69528 1014.56 \n",
"92419 1022.05 "
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Look at the training dataset. It has all columns except the temperature column\n",
"train_x.head()"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "2f30439e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"70626 21.061111\n",
"52457 25.016667\n",
"90690 4.422222\n",
"69528 13.772222\n",
"92419 23.288889\n",
"Name: Temperature (C), dtype: float64"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_y.head()"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "a936d649",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"37443 -2.288889\n",
"86534 8.861111\n",
"2082 9.805556\n",
"53130 27.222222\n",
"45196 17.705556\n",
"Name: Temperature (C), dtype: float64"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_y.head()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "16b30e84",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(19291, 8)"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_x.shape"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "6e7af2d1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(77162, 8)"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_x.shape"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "f97f3a15",
"metadata": {},
"outputs": [],
"source": [
"#Using polynomial regression to train the model. Polynomial Regression is a one of the types of linear regression in \n",
"#which the relationship between the independent variable x and dependent variable y is modeled as an nth degree \n",
"#polynomial. In this case that degree is 4\n",
"\n",
"from sklearn.preprocessing import PolynomialFeatures\n",
"poly = PolynomialFeatures(degree = 4)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "794b8782",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"PolynomialFeatures(degree=4)"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Now we train the model\n",
"X_poly = poly.fit_transform(train_x)\n",
"poly.fit(X_poly, train_y)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "033f87aa",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DecisionTreeRegressor(random_state=0)"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Now we use Decision Tree Regressor to train the model\n",
"#Decision tree builds regression or classification models in the form of a tree structure. It breaks down a dataset\n",
"#into smaller and smaller subsets while at the same time an associated decision tree is incrementally developed. \n",
"#The final result is a tree with decision nodes and leaf nodes. \n",
"\n",
"from sklearn.tree import DecisionTreeRegressor\n",
"regressor = DecisionTreeRegressor(random_state=0)\n",
"regressor.fit(train_x,train_y)"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "a3cc05b3",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.00803046229678356"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#We now look at how well out model has been trained by feeding it test data and getting it to make a prediction and\n",
"#then comparing its output to test data output\n",
"\n",
"prediction3 = regressor.predict(test_x)\n",
"np.mean((prediction3-test_y)**2)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "278387c1",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" actual \n",
" prediction \n",
" diff \n",
" \n",
" \n",
" \n",
" \n",
" 37443 \n",
" -2.288889 \n",
" -2.266667 \n",
" -2.222222e-02 \n",
" \n",
" \n",
" 86534 \n",
" 8.861111 \n",
" 8.855556 \n",
" 5.555555e-03 \n",
" \n",
" \n",
" 2082 \n",
" 9.805556 \n",
" 9.811111 \n",
" -5.555555e-03 \n",
" \n",
" \n",
" 53130 \n",
" 27.222222 \n",
" 27.222222 \n",
" 0.000000e+00 \n",
" \n",
" \n",
" 45196 \n",
" 17.705556 \n",
" 17.705556 \n",
" 3.552714e-15 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 55387 \n",
" -10.066667 \n",
" -10.000000 \n",
" -6.666667e-02 \n",
" \n",
" \n",
" 25976 \n",
" 9.972222 \n",
" 9.972222 \n",
" 0.000000e+00 \n",
" \n",
" \n",
" 32423 \n",
" 12.777778 \n",
" 12.777778 \n",
" -6.217249e-14 \n",
" \n",
" \n",
" 26570 \n",
" 15.277778 \n",
" 15.277778 \n",
" 0.000000e+00 \n",
" \n",
" \n",
" 45834 \n",
" 2.200000 \n",
" 2.200000 \n",
" 4.440892e-16 \n",
" \n",
" \n",
"
\n",
"
19291 rows × 3 columns
\n",
"
"
],
"text/plain": [
" actual prediction diff\n",
"37443 -2.288889 -2.266667 -2.222222e-02\n",
"86534 8.861111 8.855556 5.555555e-03\n",
"2082 9.805556 9.811111 -5.555555e-03\n",
"53130 27.222222 27.222222 0.000000e+00\n",
"45196 17.705556 17.705556 3.552714e-15\n",
"... ... ... ...\n",
"55387 -10.066667 -10.000000 -6.666667e-02\n",
"25976 9.972222 9.972222 0.000000e+00\n",
"32423 12.777778 12.777778 -6.217249e-14\n",
"26570 15.277778 15.277778 0.000000e+00\n",
"45834 2.200000 2.200000 4.440892e-16\n",
"\n",
"[19291 rows x 3 columns]"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Now look at the difference between predicted and actual\n",
"pd.DataFrame({'actual':test_y,\n",
" 'prediction':prediction3,\n",
" 'diff':(test_y-prediction3)})"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "3914b5fa",
"metadata": {},
"outputs": [],
"source": [
"#Now look at the difference between predicted and actual\n",
"df=pd.DataFrame({'actual':test_y,\n",
" 'prediction':prediction3,\n",
" 'diff':(test_y-prediction3)})"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "b82a4136",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6cAAAJUCAYAAADpbVBzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA/ZklEQVR4nO3de7gkZX0u7OcHg4wIogIqiDomgkRFESaKwQOKB4xnP42RaMCoeIgxurdJxpgdB6PGbI2Ync9DSMwGv4hnDSrGA8ZRUIhyElTwPCBRDEFBUEdB3u+P6hkWw5oDzpp6a2bu+7rWNd3Va3U/U11V3U931VvVWgsAAAD0tF3vAAAAAKCcAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHS3qHeAuXbfffe2ZMmSTb6fy396eXbbabdND7RA5Fm3KWVJ5FmfKWVJ5NmQKeWZUpZEnvWZUpZEng2ZUp4pZUnkWZ8pZUnk2ZAp5VmoLGedddZ/t9b2mPfG1tpkfg466KC2EF7x6VcsyP0sFHnWbUpZWpNnfaaUpTV5NmRKeaaUpTV51mdKWVqTZ0OmlGdKWVqTZ32mlKU1eTZkSnkWKkuSM9s6+qDdegEAAOhOOQUAAKA75RQAAIDuJjUgEgAAwNiuueaaXHLJJXnkro/MBRdc0DvOGlPKc1OzLF68OHvvvXd22GGHjf4b5RQAANimXXLJJdlll11ys91uljvc8g6946zxvau+l7122at3jCQ3LUtrLZdffnkuueSS3OUud9nox7BbLwAAsE1btWpVdtttt1RV7yhbharKbrvtllWrVt2kv1NOAQCAbZ5iurB+lfmpnAIAANDdJh9zWlWLk3w2yY6z+3tfa+0VVXWbJO9OsiTJyiS/01r70aY+HgAAwOa0ZNnJC3p/K1/76AW9vxUrVuRmN7tZfuu3futXvo+dd945V1999QKm2nQL8c3pz5M8tLV27yQHJDm8qg5OsizJp1pr+yT51Ow6AAAAm2DFihX5/Oc/3zvGgtvkctoGqyv3DrOfluTxSU6YTT8hyRM29bEAAAC2Vk94whNy0EEH5R73uEeOO+64JMnHPvaxHHjggbn3ve+dww47LCtXrsxb3/rWHHvssTnggANy6qmn5qijjsr73ve+Nfez8847J0muvvrqHHbYYTnwwAOz//7756STTury/9pY1Vrb9Dup2j7JWUnumuRNrbU/q6orWmu3mvM7P2qt3Xqevz06ydFJstueux30whNfuMl5VqxckUOXHLrJ97NQ5Fm3KWVJ5FmfKWVJ5NmQKeWZUpZEnvWZUpZEng2ZUp4pZUnkWZ8pZUmmk+eRuz4yd77rnXPVz6/KLjvukt969TkLev+ff/l9Nur3fvTDH+XWt7l1fvazn+XRhz46b3vf2/KURzwlH/i3D+ROS+605va/fc3f5hY73yLPe9HzkiQvft6L87DDH5bHPOExSZJ99twn3/j+N3LttdfmZz/9WXa55S754eU/zGMf+ticdu5pqao1v7OxVs+bm+Kib16Uj1/58RtMO+Yhx5zVWls63+8vyHlOW2u/THJAVd0qyQer6p434W+PS3JckixdurQtP3T5JudZvmJ5FuJ+Foo86zalLIk86zOlLIk8GzKlPFPKksizPlPKksizIVPKM6UsiTzrM6UsyXTyXHDBBdlrl73yvaw+l+fCltONPT/ocX97XD74wQ8mSb7/n9/Pv574r3nIgx+Sg/c/+Ab3s8uOu2TnHXdec32nHXbKbW5+mzXXK5W9dtkr11xzTV7yv16Sz372s9luu+1y6fcvzfY/3T63v/3t1/zOxrp+3my8KxdfmeX3WX6DacfkmHX+/oKU09Vaa1dU1Yokhyf5QVXt2Vr7flXtmeS/FvKxAAAAthYrVqzIKaecktNPPz077bRTDj300Nxj/3vk+yu/v8G/XbRoUa677rokSWstv/jFL5Ik73jHO3LZZZflrLPOyg477JAlS5bc5HOPjmmTjzmtqj1m35imqm6e5GFJLkzyoSRHzn7tyCTT3sEZAACgkyuvvDK3vvWts9NOO+XCCy/MGWeckZ///Of5zGc+k+985ztJkh/+8IdJkl122SVXXXXVmr9dsmRJzjrrrCTJSSedlGuuuWbNfd72trfNDjvskE9/+tO56KKLRv5f3TQL8c3pnklOmB13ul2S97TWPlJVpyd5T1U9K8nFSZ6yAI8FAACwWS30qV82xuGHH563vvWtude97pW73e1uOfjgg7Pb7rvluOOOy5Oe9KRcd911ue1tb5tPfvKTeexjH5snP/nJOemkk/L3f//3ec5znpPHP/7xue9975vDDjsst7jFLZIkv/d7v5fHPvaxWbp0aQ444IDst99+o/+/bopNLqettfOS3OgI39ba5UkO29T7BwAA2NrtuOOO+bd/+7cbTPveVcNxno961KNuMH3ffffNeeedd4NpZ5xxxprLf/3Xf50k2X333XP66afP+3hTO8dpsjDnOQUAAIBNopwCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0N1CnOcUYEEtWXbyvNN7nHMMANgGLd91ge/vyoW9vw1YsWJFXv/61+cjH/lIPvShD+WrX/1qli1bNu/vXnHFFTnxxBPzghe8IEnyve99Ly960Yvyvve9b8zISZRTYEtygxeKVcmKY2fTx93gAwD08Mtf/jLbb7/9Tfqbxz3ucXnc4x63ztuvuOKKvPnNb15TTvfaa68uxTSxWy8AAEB3K1euzH777Zcjjzwy97rXvfLkJz85P/vpz7JkyZK88pWvzAMe8IC8973vzSc+8Ync//73z4EHHpinPOUpufrqq5MkH/vYx7LffvvlAQ94QD7wgQ+sud/jjz8+L3zhC5MkP/jBD/LEJz4x9773vXPve987n//857Ns2bJ861vfygEHHJA/+ZM/ycqVK3PPe94zSbJq1ao885nPzP77759HPOAR+fSnP73mPp/0pCfl8MMPzz777JM//dM/XZB5oJwCAABMwNe+9rUcffTROe+883LLW94yJ/zTCUmSxYsX57TTTsvDHvawvOpVr8opp5ySs88+O0uXLs0b3vCGrFq1Ks95znPy4Q9/OKeeemouvfTSee//RS96UR784AfnS1/6Us4+++zc4x73yGtf+9r8+q//es4999y87nWvu8Hvv+lNb0qSnH/++XnzP785Rx55ZFatWpUkOffcc/Pud787559/ft797nfnu9/97ib//5VTAACACbjjHe+YQw45JEny9Kc/PV84/QtJkqc+9alJkjPOOCNf/epXc8ghh+SAAw7ICSeckIsuuigXXnhh7nKXu2SfffZJVeXpT3/6vPf/7//+73n+85+fJNl+++2z667rP7b2tNNOyzOe8YwkyV33vWvufOc75+tf/3qS5LDDDsuuu+6axYsX5+53v3suuuiiTf7/O+YUAABgAqpq3uu3uMUtkiSttTz84Q/PO9/5zhv83rnnnnujv10IrbV13rbjjjuuubz99tvn2muv3eTH880pAADABFx88cU5/fTTkyTvfOc785v3/80b3H7wwQfnc5/7XL75zW8mSX7605/m61//evbbb7985zvfybe+9a01fzufww47LG95y1uSDIMr/fjHP84uu+ySq666at7ff9CDHpR3vOMdSZJvfeNbufjii3O3u91t0/+j6+CbUwAAgLk6nQngN37jN3LCCSfkuc99bvbZZ58se9WyvP24t6+5fY899sjxxx+fpz3tafn5z3+eJHnVq16VfffdN8cdd1we/ehHZ/fdd88DHvCAfPnLX77R/f/d3/1djj766LztbW/L9ttvn7e85S25//3vn0MOOST3vOc986hHPSp/+Id/uOb3X/CCF+R5z3te9t9//7TtWo4//vgbfGO60JRTAACACdhuu+3y1re+dc317131vaxcufIGv/PQhz40X/ziF2/0t4cffnguvPDCG00/6qijctRRRyVJbne72+Wkk0660e+ceOKJN7i+utguXrw4xx9//Jose+2y143uM0k+8pGPbPD/tjHs1gsAAEB3yikAAEBnS5YsmXdX3G2JcgoAAEB3yikAAADdKacAAAB0p5wCAADQnVPJAAAAzLH/Cfsv6P2df+T5N/lvli9fnut2uC75efKgBz0oD3vYw3Lqqafmec97XnbYYYecfvrp+cu//Mt89KMfzW//9m/nda973YJm7kE5BQAAmKhXvvKVay6/4x3vyEtf+tI885nPTJL8wz/8Qy677LLsuOOOveItKOUUAABgAl796lfn7W9/e+54xztmjz32yD733CdHHXVUHvOYx+SKK67Ie97znnz84x/PKaeckquuuio/+clPcr/73S8ve9nL8tSnPrV3/E2mnAIAAHR21lln5V3velfOOeecXHvttTnwwAOzzz33WXP7s5/97Jx22ml5zGMekyc/+clJkp133jnnnntup8QLTzkFAADo7NRTT80Tn/jE7LTTTkmSxz3ucZ0Tjc9ovQAAABNQVb0jdOWbUzabJctOnnf6ysVHzLm2Kllx7HBx+ZWbPxQAAEzQgx70oBx11FFZtmxZrr322nz4wx/O0456Wu9Yo1JOAQAA5vhVTv2yqQ488MA89alPzQEHHJA73/nOeeADHzh6ht6UUwAAgAl4+ctfnpe//OVrrn/vqu9lr132WnP9+OOPv8HvX3311WNFG4VjTgEAAOhOOQUAAKA75RQAANjmtdZ6R9iq/CrzUzkFAAC2aYsXL87ll1+uoC6Q1louv/zyLF68+Cb9nQGRAACAbdree++dSy65JJdecWl+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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df1= df.head(25)\n",
"df1.plot(kind='bar', figsize=(16,10))\n",
"plt.grid(which='major', linestyle='-',linewidth='0.5', color='green')\n",
"plt.grid(which='minor', linestyle=':',linewidth='0.5', color='black')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "23224eb6",
"metadata": {},
"outputs": [],
"source": [
"#Import metrics library\n",
"from sklearn import metrics"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "2780f7e7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.021708741547046377\n"
]
}
],
"source": [
"#Print results of MAE\n",
"print(metrics.mean_absolute_error(test_y, prediction3))"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "860e7137",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.00803046229678357\n"
]
}
],
"source": [
"#Print results of MSE\n",
"print(metrics.mean_squared_error(test_y, prediction3))"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "edbe23f3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.08961284671732937\n"
]
}
],
"source": [
"#Print results of RMSE\n",
"print(np.sqrt(metrics.mean_squared_error(test_y, prediction3)))"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "fb7ce592",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"RandomForestRegressor(max_depth=10, random_state=0)"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Using Random Forest to train our model\n",
"from sklearn.ensemble import RandomForestRegressor\n",
"regr = RandomForestRegressor(max_depth=10,random_state=0,n_estimators=100)\n",
"regr.fit(train_x,train_y)"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "e2afeb22",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.008141637115617098"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#We now look at how well out model has been trained by feeding it test data and getting it to make a prediction and\n",
"#then comparing its output to test data output\n",
"\n",
"prediction4 = regr.predict(test_x)\n",
"np.mean((prediction4-test_y)**2)"
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "57855a0b",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" actual \n",
" prediction \n",
" diff \n",
" \n",
" \n",
" \n",
" \n",
" 37443 \n",
" -2.288889 \n",
" -2.482177 \n",
" 0.193288 \n",
" \n",
" \n",
" 86534 \n",
" 8.861111 \n",
" 8.892260 \n",
" -0.031149 \n",
" \n",
" \n",
" 2082 \n",
" 9.805556 \n",
" 9.847246 \n",
" -0.041690 \n",
" \n",
" \n",
" 53130 \n",
" 27.222222 \n",
" 27.203396 \n",
" 0.018826 \n",
" \n",
" \n",
" 45196 \n",
" 17.705556 \n",
" 17.713716 \n",
" -0.008160 \n",
" \n",
" \n",
" ... \n",
" ... \n",
" ... \n",
" ... \n",
" \n",
" \n",
" 55387 \n",
" -10.066667 \n",
" -10.071566 \n",
" 0.004899 \n",
" \n",
" \n",
" 25976 \n",
" 9.972222 \n",
" 9.913953 \n",
" 0.058269 \n",
" \n",
" \n",
" 32423 \n",
" 12.777778 \n",
" 12.781718 \n",
" -0.003940 \n",
" \n",
" \n",
" 26570 \n",
" 15.277778 \n",
" 15.275648 \n",
" 0.002130 \n",
" \n",
" \n",
" 45834 \n",
" 2.200000 \n",
" 2.187450 \n",
" 0.012550 \n",
" \n",
" \n",
"
\n",
"
19291 rows × 3 columns
\n",
"
"
],
"text/plain": [
" actual prediction diff\n",
"37443 -2.288889 -2.482177 0.193288\n",
"86534 8.861111 8.892260 -0.031149\n",
"2082 9.805556 9.847246 -0.041690\n",
"53130 27.222222 27.203396 0.018826\n",
"45196 17.705556 17.713716 -0.008160\n",
"... ... ... ...\n",
"55387 -10.066667 -10.071566 0.004899\n",
"25976 9.972222 9.913953 0.058269\n",
"32423 12.777778 12.781718 -0.003940\n",
"26570 15.277778 15.275648 0.002130\n",
"45834 2.200000 2.187450 0.012550\n",
"\n",
"[19291 rows x 3 columns]"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Now look at the difference between predicted and actual\n",
"pd.DataFrame({'actual':test_y,\n",
" 'prediction':prediction4,\n",
" 'diff':(test_y-prediction4)})"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "af4663b4",
"metadata": {},
"outputs": [],
"source": [
"#Now look at the difference between predicted and actual\n",
"df2=pd.DataFrame({'actual':test_y,\n",
" 'prediction':prediction4,\n",
" 'diff':(test_y-prediction4)})"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "5413c801",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6cAAAJUCAYAAADpbVBzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA/uklEQVR4nO3de7hcZX03/O8PgkQEUQEVRI2tIFURhFSxnlA8YD37aq1WC1bFQ63V57FtrH1qsGrtoxX79BUtrX3At+JZC4r1gCUKClVOggqeA1LFUhQENQpyv3+sSdiEnQTMzrpXks/nuvaVmTV7z3yzZq01851Z617VWgsAAAD0tE3vAAAAAKCcAgAA0J1yCgAAQHfKKQAAAN0ppwAAAHS3qHeAuXbddde2ZMmSjb6fy396eXbZYZeND7RA5Fm3KWVJ5FmfKWVJ5NmQKeWZUpZEnvWZUpZEng2ZUp4pZUnkWZ8pZUnk2ZAp5VmoLGedddZ/t9Z2m/fG1tpkfg488MC2EF59yqsX5H4WijzrNqUsrcmzPlPK0po8GzKlPFPK0po86zOlLK3JsyFTyjOlLK3Jsz5TytKaPBsypTwLlSXJmW0dfdBuvQAAAHSnnAIAANCdcgoAAEB3kxoQCQAAYGzXXHNNLrnkkjx650fnggsu6B1njSnlublZFi9enD333DPbbbfdTf4b5RQAANiqXXLJJdlpp51yi11ukTvd+k6946zxvau+lz122qN3jCQ3L0trLZdffnkuueSS3O1ud7vJj2G3XgAAYKu2atWq7LLLLqmq3lG2CFWVXXbZJatWrbpZf6ecAgAAWz3FdGH9KvNTOQUAAKC7jT7mtKoWJ/lsku1n9/eB1tqrq+p2Sd6bZEmSlUl+p7X2o419PAAAgE1pybKTFvT+Vr7hsQt6fytWrMgtbnGL/NZv/davfB877rhjrr766gVMtfEW4pvTnyd5eGttvyT7Jzm0qg5KsizJp1treyX59Ow6AAAAG2HFihX5/Oc/3zvGgtvoctoGqyv3drOfluSJSY6bTT8uyZM29rEAAAC2VE960pNy4IEH5l73uleOOeaYJMnHP/7xHHDAAdlvv/1yyCGHZOXKlXn729+eo446Kvvvv39OPfXUHH744fnABz6w5n523HHHJMnVV1+dQw45JAcccED23XffnHDCCV3+XzdVtdY2/k6qtk1yVpK7J3lra+3PquqK1tpt5vzOj1prt53nb49IckSS7LL7Lge+5PiXbHSeFStX5OAlB2/0/SwUedZtSlkSedZnSlkSeTZkSnmmlCWRZ32mlCWRZ0OmlGdKWRJ51mdKWZLp5Hn0zo/OXe9+11z186uy0/Y75bded86C3v/nX3Xfm/R7P/rhj3Lb2902P/vZz/LYgx+bd3zgHXnao56WD/3bh3KXJXdZc/vfvv5vc6sdb5UXvvSFSZKXvfBlecShj8jjnvS4JMleu++Vb3z/G7n22mvzs5/+LDvdeqf88PIf5vEPf3xOO/e0VNWa37mpVs+bm+Oib16UT1z5iRtMO/JhR57VWls63+8vyHlOW2u/TLJ/Vd0myYer6t4342+PSXJMkixdurQtP3j5RudZvmJ5FuJ+Foo86zalLIk86zOlLIk8GzKlPFPKksizPlPKksizIVPKM6UsiTzrM6UsyXTyXHDBBdljpz3yvaw+l+fCltOben7QY/72mHz4wx9Oknz/P7+ffz3+X/Owhz4sB+170A3uZ6ftd8qO2++45voO2+2Q293ydmuuVyp77LRHrrnmmrz8f708n/3sZ7PNNtvk0u9fmm1/um3ueMc7rvmdm+r6eXPTXbn4yiy/7/IbTDsyR67z9xeknK7WWruiqlYkOTTJD6pq99ba96tq9yT/tZCPBQAAsKVYsWJFTj755Jx++unZYYcdcvDBB+de+94r31/5/Q3+7aJFi3LdddclSVpr+cUvfpEkede73pXLLrssZ511VrbbbrssWbLkZp97dEwbfcxpVe02+8Y0VXXLJI9IcmGSE5McNvu1w5JMewdnAACATq688src9ra3zQ477JALL7wwZ5xxRn7+85/nM5/5TL7zne8kSX74wx8mSXbaaadcddVVa/52yZIlOeuss5IkJ5xwQq655po193n7298+2223XU455ZRcdNFFI/+vbp6F+OZ09yTHzY473SbJ+1prH62q05O8r6qem+TiJE9bgMcCAADYpBb61C83xaGHHpq3v/3tuc997pN73OMeOeigg7LLrrvkmGOOyVOe8pRcd911uf3tb59PfepTefzjH5+nPvWpOeGEE/L3f//3ef7zn58nPvGJud/97pdDDjkkt7rVrZIkv/d7v5fHP/7xWbp0afbff//ss88+o/+/bo6NLqettfOS3OgI39ba5UkO2dj7BwAA2NJtv/32+bd/+7cbTPveVcNxno95zGNuMH3vvffOeeedd4NpZ5xxxprLf/3Xf50k2XXXXXP66afP+3hTO8dpsjDnOQUAAICNopwCAADQnXIKAABAd8opAAAA3SmnAAAAdKecAgAA0N1CnOcUYEEtWXbSvNN7nHMMANgKLd95ge/vyoW9vw1YsWJF3vSmN+WjH/1oTjzxxHz1q1/NsmXL5v3dK664Iscff3xe/OIXJ0m+973v5aUvfWk+8IEPjBk5iXIKbE5u8EKxKllx1Gz6uBt8AIAefvnLX2bbbbe9WX/zhCc8IU94whPWefsVV1yRo48+ek053WOPPboU08RuvQAAAN2tXLky++yzTw477LDc5z73yVOf+tT87Kc/y5IlS/Ka17wmD3rQg/L+978/n/zkJ/OABzwgBxxwQJ72tKfl6quvTpJ8/OMfzz777JMHPehB+dCHPrTmfo899ti85CUvSZL84Ac/yJOf/OTst99+2W+//fL5z38+y5Yty7e+9a3sv//++ZM/+ZOsXLky9773vZMkq1atynOe85zsu+++edSDHpVTTjllzX0+5SlPyaGHHpq99torf/qnf7og80A5BQAAmICvfe1rOeKII3Leeefl1re+dY77p+OSJIsXL85pp52WRzziEXnta1+bk08+OWeffXaWLl2aN7/5zVm1alWe//zn5yMf+UhOPfXUXHrppfPe/0tf+tI89KEPzZe+9KWcffbZude97pU3vOEN+fVf//Wce+65eeMb33iD33/rW9+aJDn//PNz9D8fncMOOyyrVq1Kkpx77rl573vfm/PPPz/vfe97893vfnej///KKQAAwATc+c53zgMf+MAkybOe9ax84fQvJEme/vSnJ0nOOOOMfPWrX80DH/jA7L///jnuuONy0UUX5cILL8zd7na37LXXXqmqPOtZz5r3/v/93/89L3rRi5Ik2267bXbeef3H1p522ml59rOfnSS5+953z13vetd8/etfT5Iccsgh2XnnnbN48eLc8573zEUXXbTR/3/HnAIAAExAVc17/Va3ulWSpLWWRz7ykXn3u999g98799xzb/S3C6G1ts7btt9++zWXt91221x77bUb/Xi+OQUAAJiAiy++OKeffnqS5N3vfnd+8wG/eYPbDzrooHzuc5/LN7/5zSTJT3/603z961/PPvvsk+985zv51re+teZv53PIIYfkbW97W5JhcKUf//jH2WmnnXLVVVfN+/sPechD8q53vStJ8q1vfCsXX3xx7nGPe2z8f3QdfHMKAAAwV6czAfzGb/xGjjvuuLzgBS/IXnvtlWWvXZZ3HvPONbfvtttuOfbYY/OMZzwjP//5z5Mkr33ta7P33nvnmGOOyWMf+9jsuuuuedCDHpQvf/nLN7r/v/u7v8sRRxyRd7zjHdl2223ztre9LQ94wAPywAc+MPe+973zmMc8Jn/4h3+45vdf/OIX54UvfGH23XfftG1ajj322Bt8Y7rQlFMAAIAJ2GabbfL2t799zfXvXfW9rFy58ga/8/CHPzxf/OIXb/S3hx56aC688MIbTT/88MNz+OGHJ0nucIc75IQTTrjR7xx//PE3uL662C5evDjHHnvsmix77LTHje4zST760Y9u8P92U9itFwAAgO6UUwAAgM6WLFky7664WxPlFAAAgO6UUwAAALpTTgEAAOhOOQUAAKA7p5IBAACYY9/j9l3Q+zv/sPNv9t8sX7481213XfLz5CEPeUge8YhH5NRTT80LX/jCbLfddjn99NPzl3/5l/nYxz6W3/7t384b3/jGBc3cg3IKAAAwUa95zWvWXH7Xu96VV7ziFXnOc56TJPmHf/iHXHbZZdl+++17xVtQyikAAMAEvO51r8s73/nO3PnOd85uu+2Wve69Vw4//PA87nGPyxVXXJH3ve99+cQnPpGTTz45V111VX7yk5/k/ve/f175ylfm6U9/eu/4G005BQAA6Oyss87Ke97znpxzzjm59tprc8ABB2Sve++15vbnPe95Oe200/K4xz0uT33qU5MkO+64Y84999xOiReecgoAANDZqaeemic/+cnZYYcdkiRPeMITOican9F6AQAAJqCqekfoyjenbDJLlp007/SVi58559qqZMVRw8XlV276UAAAMEEPechDcvjhh2fZsmW59tpr85GPfCTPOPwZvWONSjkFAACY41c59cvGOuCAA/L0pz89+++/f+5617vmwQ9+8OgZelNOAQAAJuBVr3pVXvWqV625/r2rvpc9dtpjzfVjjz32Br9/9dVXjxVtFI45BQAAoDvlFAAAgO6UUwAAYKvXWusdYYvyq8xP5RQAANiqLV68OJdffrmCukBaa7n88suzePHim/V3BkQCAAC2anvuuWcuueSSXHrFpfnx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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df1= df2.head(25)\n",
"df1.plot(kind='bar', figsize=(16,10))\n",
"plt.grid(which='major', linestyle='-',linewidth='0.5', color='green')\n",
"plt.grid(which='minor', linestyle=':',linewidth='0.5', color='black')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "a3e3ce21",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0432385808682435\n"
]
}
],
"source": [
"#Print results of MAE for Random Forest\n",
"print(metrics.mean_absolute_error(test_y, prediction4))"
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "f38df479",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.008141637115617032\n"
]
}
],
"source": [
"#Print results of MSE for Random Forest\n",
"print(metrics.mean_squared_error(test_y, prediction4))"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "39a5e097",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.09023102080558011\n"
]
}
],
"source": [
"#Print results of RMSE for Random Forest\n",
"print(np.sqrt(metrics.mean_squared_error(test_y, prediction4)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "52c3359c",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "conda_python3",
"language": "python",
"name": "conda_python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}