数据分析初探——以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 |