2022李宏毅作业hw1—新冠阳性人员数量预测。
事前 :
kaggle地址:
我的git地址:
当然作为新手,我也是参考的其他大神的。参考的过多,我就不一一放地址了,在这里谢过各位大佬。如果和我一样的新手,调试代码看张量流动绝对是一个好用的方法。
作业介绍: 说的是啊 这个美国,好像是有40个州, 这四十个州呢 ,统计了连续三天的新冠阳性人数,和每天的一些社会特征,比如带口罩情况, 居家办公情况等等。现在有一群人比较坏,把第三天的数据遮住了,我们就要用前两天的情况以及第三天的特征,来预测第三天的阳性人数。但幸好的是,我们还是有一些数据可以作为参考的,就是我们的训练集。
一: 数据读取。
(第一步引用的包:)
先从kaggle上把数据下下来看看。点那个data就找到下载的地方了。下载好数据第一步先观察train的数据是什么样子的。如下图,可以看到有很多列,每一列都是一类特征,每一行都是一个样本。黄红蓝是第1,2,3天的测试阳性数据。蓝色的就是我们要预测的值啦。
我们再细看数据: 可以看到第一行是没有用的,他只是标签的名称。然后第一列也是没有用处的,因为他只是标注样本是第几个样本。等会处理数据时都要处理掉。 然后我们可以注意到前40列的数据和后面五十多列是不一样的,一般是一列全1 其他列全0 ,表示的是1所在的那个州,地点标识而已。
看清楚数据的结构,下面我们开始读入数据。csv数据和其他数据的读法差不多。比如你可以选择下面的文件式读法。
也可以选择csv的专门读取excel表格的函数
然后这里要介绍一个取最相关列的操作。 上面的数据我们知道有95列,可是,这90多列,每一列都与结果是相关的吗? 恐怕不一定,肯定有些特征卵用没有。所以我们这里可以找到那些相关的列,用这些特征来预测结果。找特征有很多方法,大家可以百度特征选择,有很多介绍。这里用的是SelectKBest 函数。顺便定义了一个挑特征的函数。column是第一行的特征名称,我传入是为了打印看看是哪些特征重要,要不然他挑了半天我也不知道啊 。k是挑多少个特征。
找好特征后。我们还需要进行训练集和验证集的划分。 我们知道,kaggle下下来只有训练集和测试集,所以我们需要从训练集里分出来一个验证集来作为模型评价。 方法可以是直接截一段,也可以是逢几个挑一个,也可以是随机的。我这里是逢5挑1
取完数据后,一般还要有一个归一化的步骤,防止各个特征的数量级相差过于大。这里用的是Z-score标准化方法。减均值除以标准差
综上所述,我们可以写出我们的dataset函数了。基本上大部分神经网络都是需要读数据这部分的,过程就是把数据从本地文件,读入dataset中去。dataset中一般有三个函数,第一个是初始化__init__: 一般负责把数据从文件取出来。第二个获取数据__getitem__, 负责读第几个数据。第三个获取长度__len__: 负责返回数据集的长度。
一个完整的从csv到可以用的dataset的 代码如下图所示。 这一部分被我放在model——utils的data模块里。
完整代码:
二 模型设计。
数据都读完了,接下来肯定是模型了 。当然这里是一个简单的回归模型我用两个全连接实现的,中间加了一个relu。inDim是传入的参数 ,就是上面我们挑选的重要特征的数量啦。这部分比较简单,一般模型都是包括这两个部分 __init__和forward 也就是初始化和前向传播。初始化中会定义前向传播里需要的模型模块。前向传播里就是输入到输出的流动了 。x是输入的张量,最后输出模型计算结果。 模型也非常简单。
注意网络一般都是按batch大小计算的。我举个例子。 假如我挑了4个特征,那么模型输入长度就是4,输出长度就是1(回归值) 。假如我16个数据1批次, 输入大小就是(16,4) 输出就是(16,1) 这都是自动的 不用我们担心。这一部分被我放在model_utils的model模块里。
完整代码:
三 训练步骤。
训练函数推荐大家自己定义一个的,这样以后面对大部分问题都可以通用。
这个是训练的过程 都是很常规的步骤。
每一个epoch里还有验证步骤。参照训练可以看到每一步的作用。多了一个保存模型的步骤。保存loss最低时的那个模型。
还有绘图: 画出loss的变化情况。
完整的训练代码:这一部分被我放在model_utils的train模块里。
四:测试和保存步骤 。
测试和验证时很相似的。 少的是预测值和真值的比较,因为没有真值 ,多的是预测值得保存。按照kaggle要求保存在csv里 。这一部分被我放在model_utils的evaluate模块里。
完整代码:
五 : 主函数。
万事俱备,只欠东风。就像人的四肢脑袋都齐了,就差个body把他们连起来了,起这个作用的 就是main函数。
调包第一步 除了系统包 还有自己写的
路径和设备 以及一些超参。 在这里 我尝试将一些超参放入字典中。
定义loss 这里采用了mseloss 然后还加上了正则化
定义model和优化器 以及数据传入loader 前面说过这是为了批量处理
训练和测试
完整代码:
事后:
运行主函数 我们将得到 pred.csv。这就是我们得预测结果啦。打开kaggle网址项目所在页, 注册,点击late submission 提交你的pred.csv文件吧。 这也是我第一次用kaggle。 好像我的得分也很低。大家如果想得一个比较高得分,可以多调调超参和模型。fighting!!!
李宏毅老师前年课程的第一个作业也是回归,不过不是新冠。当时我啥都不会写,把网上得copy下来,一步一步调试才慢慢懂一点点。 这次第二次做回归,只能说比第一次熟练了很多,虽然还是不能全部一个人写下来。 写这个文章,与大家共勉。