数据分析初探——以2020百度&西安交大大数据竞赛:传染病感染人数预测为例

数据分析初探——以2020百度&西安交大大数据竞赛:传染病感染人数预测为例

 emm第一次参加这种比赛试水,虽然初赛的具体情况没有公布,但是感觉已经翻车了ORZ(端午节最后一天冲榜的都太猛了嘤)。已经有将近一年没怎么写程序了,感觉在重新学习python,作为一只菜狗还在ctrlC ctrlZ之间游走,虽然如此本菜在大佬的帮助下还是学习到了很多的知识。想做一个总结&对学到的ML,数据分析,数据挖掘知识进行梳理&练习markdown的书写&整理之前收藏的乱糟糟的链接(这次的文本是用jupter notebook写的,jupyter属实好用:3 !)比赛相关程序是用python写的,但是下面的内容不仅限于此次比赛与python,但可能举例多举此次比赛的例子。python和juyter相关下载配置部署详见后面有关部分。

比赛的大致情况

  这次比赛比赛流程和一般的数据分析比赛的流程差不多,可能多了一个时间有点长(将近2个月)的初赛,复赛是一个月时间,决赛取复赛前一定名次做答辩。每天限制提交2次预测结果,计算误差进行排名,取排名靠前者。报名已经截至了,具体的情况见官网
  比赛的目标是用给出前45天5个城市的相关数据(包括感染人数,人流量密度,城市间人口流动量,城市内人口流动量,温度,湿度,风力,风向等)来预测往后30天5个城市,总计392个地区每日的的新增感染人数。
 官网给了baseline但是是用的paddel的架构,而且效果不太好…

环境配置与相关包的配置

本来这个比赛的目的之一是推广百度自己的paddlepaddle的框架,但是这个不太常用,而且很多API不知道是啥,然后就没用这个。

anaconda和pytorch(顺带tensorflow)的配置

Anaconda是Python的一个开源发行版本,pytorch/tensorflow是神经网络常用的框架,这个上面有安装配置方式 我在安装时没按照这个来,但是一般来说anaconda的安装都是很简单的而且一般下载完后会自动配置环境变量,上网查到的方法也一般都能用(不管安装什么,都比较建议在CSDN等网站找一篇比较detailed,赞比较多,评论大多数都是感谢贴主的安装指南照着安装),安装完anaconda之后在anaconda navigator里或者prompt里安装pytorch,tensorflow,sklearn,numpy,pandas包都很容易。

需要注意:
1.如果你在使用SSR或者VPN科学地上网,可能会出现占用jupyter notebook打开的端口,把SSR关掉就能打开jupyter notebook了。
2.在安装pytorch/tensorflow的时候建议不要在prompt里面使用conda install下载,这样下载的是pytorch和tensorflow的CPU版本,对应的GPU版本下载在后续进行说明。

GPU的配置

配这个是真的麻烦啊啊啊啊,当时搞了好多天。一般电脑里用NVIDIA的显卡可以按照下面的步骤,(原来把详细是步骤放在了收藏夹,后来发现在收藏夹里蒸发了???但是大致步骤如下,大家可以在网上找比较靠谱的教程(有的官方文档提供的安装教程不太好用)然后考虑下面的tips安装)
1.cuda和cudnn的配置(参考网上的一些教程,官网上可以直接下载,但是要选择对版本,而且要在nvidia官网里注册)
2.gpu版本pytorch和tensorflow的下载(参考网上的教程/在navigator里可以下gpu版本)
3.pycuda可以试着用gpu跑普通的程序(还没有尝试,似乎效率不太高)

tips:
1.安装中最容易出问题的是版本不兼容,需要注意python的版本,cuda的版本,显卡的版本,和下载的pytorch/tensorflow的版本,一般来说都是不同版本向下兼容,向上不兼容的,具体的情况可以参考网上的安装说明/另一种方法是安装后对版本升级(升级python &&升级显卡 比如我的电脑用的GeForce的显卡,就安装了GeForce Experience自动升级)
2.tensorflow安装后使用时如果有no module named "tensorflow"的报错可能是因为安装路径不对,改这个很麻烦,建议卸载重下。
3.能使用tensorflow/pytorch之后可能会有报错“ailed to get convolution algorithm. This is probably because cuDNN failed to…”类似的报错,可能是因为显存不够,建议关闭之前的运行的网络/增加显存/简化网络…

写这个Notebook的配置

这个文档书写用到的是jupyter notebook,编辑目录等需要下载扩展文件nbextension具体下载方法,目录怎么搞
ps.jupyter notebook运行完一个文件后,在首页点前面的方块shutdowm以免占内存

数据处理

一些数据处理软件的选择

 数据处理方法和相关软件有很多种,并不是越复杂越高端越好,需要根据实际情况进行选择。Excel一般情况下都是超好用的!
 在先前发的文章中有提到过SPSS,stata(虽然只是吐槽一下)在这个的最后面,还有SAS啥的对于一般的数据处理,简单的数据分析(计量上的面板数据多元logit,probit回归)都可以handle,而且用stata,spss之类有数据显示页面,能直接看着整个数据操作,而且很好学,而且很多都和excel一样能直接按button操作,python和matlab需要写和csv,excel的接口,暂时不能看到完整的数据状态,如果写相关程序不熟练会耗费更多的精力或者感觉很烦躁。
 R没学过,但是听说相关的时序处理的包比较多但是处理的数据量不如python,而且比python慢。And,SQL,去年暑假计划好要学SQL的,但是最后竟然下了好多次没有下下来就鸽了(可能现在科学上个网在官网下会比较快,或者找国内的镜像)。
 然后就是这次比赛主要使用的python的pandas包,开始还觉得pandas不好用。。。后来我就真香了!pandas真香!

这次比赛的数据处理

比赛提供的数据格式

 把比赛用的数据包下载之后整理了一下各个包里的数据格式,提供的数据没有做train-data和test_data的划分,数据的内容主要是下面几种:

density: 数据完整 时间(按小时) 地点(经纬度) 人口流动量
infection:数据完整 时间(按天) 地点(按区域(两个变量:城市&区域)) 新增感染
weather: 有缺失 时间(按小时) 地点(按城市) 温度、湿度(有百分比)、风向:九个方向(加上无风)
     风速(<12km/h,16-24km/h,24-34km/h,三档&空白(包括无风和缺失值))
     风力(0,1,2,3,4,❤️,无缺失值)
     天气(cloudy moderaterain rain overcast sunny fog lightrain)     
p.s.风力和天气无缺失值
migration:数据完整 时间(按天) 地点:出发——到达(城市) 城市间迁徙指数
transfer :数据完整 时间(日均小时)地点 :(城市内:出发经纬度,到达经纬度) 城市中迁移强度
grid_attr: 数据完整 地点:经纬度 属于该城市的哪个区域

数据处理的主要步骤

下面主要是在这次比赛中用到的,更系统一点的方法看这里
1.观察数据格式类型,了解数据内涵。
2.可视化。
 (1)看基本走势,(这个很重要,我们第一次提交就是直接根据infection的走势拟合了一个函数直接预测,有人拟合的好就直接进复赛辽)
 (2)数据之间的关系
 (3)数据情况(描述性统计)(噪声大的考虑分箱等方法降噪,噪声特别大的舍弃这个特征)。
3.缺失值处理。
 (1)直接删除一些具体的做法
 (2)pandas fillina函数的使用具体看这里
 (3)用KNN或者决策树等方法填充
5.异常值处理。
 这次没怎么用…主要数据实在(全是噪声ORZ)
4.数据格式转换。
 (1)数据的编码与转换,详细见后面的部分。
 (2)数据格式转换,主要做CNN等神经网络的时候的输入格式的调整。

stata,SPSS数据处理的一些方法

这些功能都能在pandas中实现

 混着用软件做数据处理属实弟弟行为,但是当时太菜了就没想太多ORZ,还是应该学好一样来做处理(首推pandas!)
 因为开始的时候还不太会用pandas就想用其他的软件。开始使用SPSS,但是SPSS没有批量处理多个文件的能力,且无法提取符号和数字混合的变量(例如带%¥)
于是又用了stata,stata在查看数据窗口可以完成字符型变量与数值变量的转换,最妙的是
即使你不知道对应程序怎么写,在窗口上点按钮操作后会自动出现相应的代码,另外stata
支持正则表达式的提取,详见

1.数据类型的转换
声明数值变量的方法:gen variable=.
字符到数值的转换:
   gen v5_change=.
   replace v5_change=0 if v5==“Quiet”
   replace v5_change=1if v5==“East”
在例如logit回归(附一个logistic回归结果回归系数&OR值解读and SPSS二项logistic回归的方法和解释)中需要将分类变量转化为哑变量,避免将分类元的数值作为倍数关系处理。(例如在分类变量:性别中,将男变为0,女变为1)。在python 的pandas库中有更好的处理方法在后面会提到。

2.缺失值处理
 关于缺失值,实际上SPSS提供了取总体平均值,中位数,以及缺失值前后非缺失值平均数,中位数,线性估计。但是如果变量是int型,SPSS处理后会变成float。然后有人告诉我了一个神奇偏方(PS:此方法仅供娱乐):先按照上述方法补全缺失值再取整,SPSS中取整数参考(SPSS中:转换->计算变量->函数组->字符串->Char.substr())(取整方法:或者调整SPSS总体数据格式)

python pandas包的使用

pandas包除了在数据处理上有很多好用的函数外,值得一提的还有Pandas的数据存储方式 ,相较于使用列表\字典的嵌套更节省空间。

 一般来说pandas包和numpy包是配合使用的。官方文档关于pandas包的学习强列推荐:这个里面有教程和习题,同样也可以当成工具书使用。
 下面是一些写程序过程中常用的points,写在这里方便以后copy:

(1)读取csv文件加表头(不要学我这样的菜狗路径带中文):

import pandas as pd
name=['date','hour','grid','infect','density','w_temp','w_humid','w_toward','w_speed','w_force','w_w','trans_1','trans_2']
data=pd.read_csv(r"C:\Users\10539\Desktop\数据竞赛\数据整理\except_migration.csv",header=None,names=name)#none表示原文件没有表头,header=i表示从第i+1行开始
data.head()#看前5排(加表头)
date hour grid infect density w_temp w_humid w_toward w_speed w_force w_w trans_1 trans_2
0 0 0 0 0.0 951.8 16 76 0 1 1 3 8.2 7.8
1 0 0 1 0.0 987.2 16 76 0 1 1 3 17.9 14.1
2 0 0 2 0.0 665.5 16 76 0 1 1 3 8.7 8.9
3 0 0 3 0.0 818.0 16 76 0 1 1 3 5.7 7.9
4 0 0 4 0.0 1797.9 16 76 0 1 1 3 12.6 15.6

(2)选几排:

a=data[['date','hour']]
a.head()
date hour
0 0 0
1 0 0
2 0 0
3 0 0
4 0 0

(3)索引:

#方法1:loc 得到series或者dataframe
b=data.loc[3,['date']]
b
date    0.0
Name: 3, dtype: float64
#方法2:[]  两种方法最后得到的值的形式不同
data['hour'][400]#先列后行
1

(4)取值(数据类型不发生改变):

a=data[['date','hour']].values
a
array([[ 0,  0],
       [ 0,  0],
       [ 0,  0],
       ...,
       [44, 23],
       [44, 23],
       [44, 23]], dtype=int64)
a=data.loc[:,['date','hour']].values
a
array([[ 0,  0],
       [ 0,  0],
       [ 0,  0],
       ...,
       [44, 23],
       [44, 23],
       [44, 23]], dtype=int64)
a=data.loc[:,'date'].values#注意pandas中[]作为索引和表示列表的双重作用
a
array([ 0,  0,  0, ..., 44, 44, 44], dtype=int64)

(5)变量变换,以标准化为例(注意其中lambda函数的使用):

data[['density','w_temp','w_humid','trans_1','trans_2']]=data[['density','w_temp','w_humid','trans_1','trans_2']].transform(lambda x:(x-x.mean())/x.std())

(6)去掉行/列

data=data.drop(['w_humid','w_toward','w_force'],axis=1)
data.tail()#看后5排
date hour grid infect density w_temp w_speed w_w trans_1 trans_2
423355 44 23 387 6.375000 143.4 7 1 1 0.5 0.8
423356 44 23 388 41.083333 99.0 7 1 1 0.8 0.9
423357 44 23 389 25.375000 0.2 7 1 1 0.0 0.0
423358 44 23 390 29.000000 121.3 7 1 1 1.0 1.8
423359 44 23 391 4.1250
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值