项目名称:Covid-19 全球性预测
成员及分工:
数据集:COVID19 Global Forecasting (Week 5)
Github地址:https://github.com/ChengchengDu/data_mining_project
注:数据集处理代码、数据挖掘代码以及挖掘过程报告已经按照一定的顺序整理在这个notebook中
运行建议:如果要对本课程项目代码进行运行,只需要把该notebook与数据集放在同一个目录下运行即可
白宫科学技术政策办公室(OSTP)召集了一个联盟研究小组和公司(包括Kaggle)来准备COVID-19开放研究数据集(CORD-19),以尝试解决有关COVID-19的关键开放科学问题。这些问题来自美国国家科学,工程和医学研究院(NASEM)和世界卫生组织(WHO)。
Kaggle正在发起COVID-19预测挑战,以帮助回答NASEM / WHO问题的一部分。尽管面临的挑战是为每个地区确定5月12日至6月7日之间确诊病例和死亡人数的分位数估计间隔,但主要目标不仅是产生准确的预测。还可以识别出可能影响COVID-19传输速率的因素。
上述挑战是一个回归分析问题。我们组所采用的数据集是Kaggle中COVID19 Global Forecasting (Week 5)任务的数据集。我们通过构建不同的模型并对比分析不同模型在这些数据集上的优劣的方式,对COVID-19未来在世界范围内的传播趋势进行分析。
采集数据集中的数据,将区域(如全美国)分成适当的n*n(如20*20)的数量级的小数据集,然后在每个小区域集上又根据时间统计各个时间段的确诊病例和死亡人数,最后可以得到根据时间段和区域统计的数据统计,完成初步的数据准备。
- 使用XGBOOST对训练集进行训练,在测试集上对该地区新冠肺炎确认人数和死亡人数进行预测
- 使用RandomForest对训练集进行训练,在测试集上对该地区新冠肺炎确认人数和死亡人数进行预测
- 使用logistic regression对训练集进行训练,在测试集上对该地区新冠肺炎确认人数和死亡人数进行预测
通过所构建的模型实现对未来COVID-19在确诊人数和死亡人数上较为准确的预测。
预测结果主要利用加权Pinball Loss指标,对各个模型在测试数据集上的性能进行评估。加权Pinball Loss的定义如下所示: $$ \text{score}=\frac{1}{N_f}\sum_fw_f\frac{1}{N_\tau}\sum_\tau L_\tau(y_i,\hat{y}_i)$$ 其中, $$L_\tau(y, \hat{y})=(y-\hat{y})\tau\ \ \text{if}\ y\geq \hat{y}\\ =(\hat{y}-y)(1-\tau)\ \ \text{if}\ \hat{y}\gt y$$ 并且有, $y$是真实值
$\hat{y}$是预测值
$\tau$是需要被预测的分位数
$N_f$是总的预测数
$N_\tau$是总的需要被预测的分位数
$w$是权重因子
Field Name | Definition |
---|---|
Id | id |
County | 县 |
Province_State | 省份/州 |
Country_Region | 国家 |
Population | 人口数 |
Date | 时间 |
Target | 确诊/死亡 |
TargetValue | 确诊数/死亡数 |
import pandas as pd
import numpy as np
import itertools
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import plotly.express as px
import statsmodels.api as sm
import warnings
warnings.simplefilter('ignore')
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.style.use('ggplot')
train=pd.read_csv("./train.csv")
test=pd.read_csv("./test.csv")
sample = pd.read_csv('./submission.csv')
train.head(10)
train.shape
test.head(10)
test.shape
sample.head(10)
sample.shape
#查看训练集各列数据类型
train.info()
train.isnull().sum()
test.isnull().sum()
sample.isnull().sum()
fig = px.pie(train, values='TargetValue', names='Target')
fig.update_traces(textposition='inside')
fig.update_layout(uniformtext_minsize=12, uniformtext_mode='hide')
fig.show()