COVID19 Prediction using SVM, Linear Regression and Bayesian Ridge :
#Importing the libraries
import numpy as np
import [Link] as plt
import [Link] as mcolors
import pandas as pd
import random
import math
import time
from sklearn.linear_model import LinearRegression, BayesianRidge
from sklearn.model_selection import RandomizedSearchCV, train_test_split
from [Link] import PolynomialFeatures
from [Link] import SVR
from [Link] import mean_squared_error, mean_absolute_error
import datetime
import operator
[Link]('fivethirtyeight')
%matplotlib inline
import warnings
[Link]("ignore")
#Imported data from Github repositories
confirmed_df = pd.read_csv('[Link]
master/csse_covid_19_data/csse_covid_19_time_series/
time_series_covid19_confirmed_global.csv')
deaths_df = pd.read_csv('[Link]
csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv')
recoveries_df = pd.read_csv('[Link]
master/csse_covid_19_data/csse_covid_19_time_series/
time_series_covid19_recovered_global.csv')
latest_data = pd.read_csv('[Link]
master/csse_covid_19_data/csse_covid_19_daily_reports/[Link]')
us_medical_data = pd.read_csv('[Link]
master/csse_covid_19_data/csse_covid_19_daily_reports_us/[Link]')
apple_mobility = pd.read_csv('[Link]
2017HotfixDev10/v3/en-us/[Link]')
latest_data.head()
confirmed_df.head()
us_medical_data.head()
cols = confirmed_df.keys()
#Get all the data for outbreak
confirmed = confirmed_df.loc[:, cols[4]:cols[-1]]
deaths = deaths_df.loc[:, cols[4]:cols[-1]]
recoveries = recoveries_df.loc[:, cols[4]:cols[-1]]
dates = [Link]()
world_cases = []
total_deaths = []
mortality_rate = []
recovery_rate = []
total_recovered = []
total_active = []
for i in dates:
confirmed_sum = confirmed[i].sum()
death_sum = deaths[i].sum()
recovered_sum = recoveries[i].sum()
# confirmed, deaths, recovered, and active
world_cases.append(confirmed_sum)
total_deaths.append(death_sum)
total_recovered.append(recovered_sum)
total_active.append(confirmed_sum-death_sum-recovered_sum)
# calculate rates
mortality_rate.append(death_sum/confirmed_sum)
recovery_rate.append(recovered_sum/confirmed_sum)
#Getting Daily increases and moving averages
def daily_increase(data):
d = []
for i in range(len(data)):
if i == 0:
[Link](data[0])
else:
[Link](data[i]-data[i-1])
return d
def moving_average(data, window_size):
moving_average = []
for i in range(len(data)):
if i + window_size < len(data):
moving_average.append([Link](data[i:i+window_size]))
else:
moving_average.append([Link](data[i:len(data)]))
return moving_average
# window size
window = 7
# confirmed cases
world_daily_increase = daily_increase(world_cases)
world_confirmed_avg= moving_average(world_cases, window)
world_daily_increase_avg = moving_average(world_daily_increase, window)
# deaths
world_daily_death = daily_increase(total_deaths)
world_death_avg = moving_average(total_deaths, window)
world_daily_death_avg = moving_average(world_daily_death, window)
# recoveries
world_daily_recovery = daily_increase(total_recovered)
world_recovery_avg = moving_average(total_recovered, window)
world_daily_recovery_avg = moving_average(world_daily_recovery, window)
# active
world_active_avg = moving_average(total_active, window)
days_since_1_22 = [Link]([i for i in range(len(dates))]).reshape(-1, 1)
world_cases = [Link](world_cases).reshape(-1, 1)
total_deaths = [Link](total_deaths).reshape(-1, 1)
total_recovered = [Link](total_recovered).reshape(-1, 1)
#Future Forecasting
days_in_future = 10
future_forcast = [Link]([i for i in range(len(dates)+days_in_future)]).reshape(-1, 1)
adjusted_dates = future_forcast[:-10]
#Convert Integer into Datetime for better visualization
start = '1/22/2020'
start_date = [Link](start, '%m/%d/%Y')
future_forcast_dates = []
for i in range(len(future_forcast)):
future_forcast_dates.append((start_date + [Link](days=i)).strftime('%m/%d/%Y'))
# slightly modify the data to fit the model better (regression models cannot pick the pattern)
X_train_confirmed, X_test_confirmed, y_train_confirmed, y_test_confirmed =
train_test_split(days_since_1_22[50:], world_cases[50:], test_size=0.05, shuffle=False)
#Model for prediction of confirmed cases. I am using support vector machine, bayesian ridge ,
and linear regression in this example. We will show the results in the later section.
svm_confirmed = SVR(shrinking=True, kernel='poly',gamma=0.01, epsilon=1,degree=3, C=0.1)
svm_confirmed.fit(X_train_confirmed, y_train_confirmed)
svm_pred = svm_confirmed.predict(future_forcast)
# check against testing data
svm_test_pred = svm_confirmed.predict(X_test_confirmed)
[Link](y_test_confirmed)
[Link](svm_test_pred)
[Link](['Test Data', 'SVM Predictions'])
print('MAE:', mean_absolute_error(svm_test_pred, y_test_confirmed))
print('MSE:',mean_squared_error(svm_test_pred, y_test_confirmed))
# transform our data for polynomial regression
poly = PolynomialFeatures(degree=5)
poly_X_train_confirmed = poly.fit_transform(X_train_confirmed)
poly_X_test_confirmed = poly.fit_transform(X_test_confirmed)
poly_future_forcast = poly.fit_transform(future_forcast)
bayesian_poly = PolynomialFeatures(degree=5)
bayesian_poly_X_train_confirmed = bayesian_poly.fit_transform(X_train_confirmed)
bayesian_poly_X_test_confirmed = bayesian_poly.fit_transform(X_test_confirmed)
bayesian_poly_future_forcast = bayesian_poly.fit_transform(future_forcast)
# polynomial regression
linear_model = LinearRegression(normalize=True, fit_intercept=False)
linear_model.fit(poly_X_train_confirmed, y_train_confirmed)
test_linear_pred = linear_model.predict(poly_X_test_confirmed)
linear_pred = linear_model.predict(poly_future_forcast)
print('MAE:', mean_absolute_error(test_linear_pred, y_test_confirmed))
print('MSE:',mean_squared_error(test_linear_pred, y_test_confirmed))
print(linear_model.coef_)
[Link](y_test_confirmed)
[Link](test_linear_pred)
[Link](['Test Data', 'Polynomial Regression Predictions'])
# bayesian ridge polynomial regression
tol = [1e-6, 1e-5, 1e-4, 1e-3, 1e-2]
alpha_1 = [1e-7, 1e-6, 1e-5, 1e-4, 1e-3]
alpha_2 = [1e-7, 1e-6, 1e-5, 1e-4, 1e-3]
lambda_1 = [1e-7, 1e-6, 1e-5, 1e-4, 1e-3]
lambda_2 = [1e-7, 1e-6, 1e-5, 1e-4, 1e-3]
normalize = [True, False]
bayesian_grid = {'tol': tol, 'alpha_1': alpha_1, 'alpha_2' : alpha_2, 'lambda_1': lambda_1,
'lambda_2' : lambda_2,
'normalize' : normalize}
bayesian = BayesianRidge(fit_intercept=False)
bayesian_search = RandomizedSearchCV(bayesian, bayesian_grid,
scoring='neg_mean_squared_error', cv=3, return_train_score=True, n_jobs=-1, n_iter=40,
verbose=1)
bayesian_search.fit(bayesian_poly_X_train_confirmed, y_train_confirmed)
bayesian_search.best_params_
bayesian_confirmed = bayesian_search.best_estimator_
test_bayesian_pred = bayesian_confirmed.predict(bayesian_poly_X_test_confirmed)
bayesian_pred = bayesian_confirmed.predict(bayesian_poly_future_forcast)
print('MAE:', mean_absolute_error(test_bayesian_pred, y_test_confirmed))
print('MSE:',mean_squared_error(test_bayesian_pred, y_test_confirmed))
[Link](y_test_confirmed)
[Link](test_bayesian_pred)
[Link](['Test Data', 'Bayesian Ridge Polynomial Predictions'])