前言
最近想要入门机器学习/深度学习的天坑,经同学与CS自学指南的介绍,最终还是选择从李宏毅老师这门“国语授课”的课程入坑。
李宏毅老师的课程授课风趣幽默,深入浅出,覆盖内容广泛,更重要的是实验全部开源且精心设计,对小白非常友好。
在这里写下blog,也是记录一下入坑实验的流程,给之后想自学的同学提供一份经验。
免责声明
这个blog仅仅是笔者实验的经历、思路与体会,并非是提供参考答案(况且这都22Spring的了,没人会来Copy这个吧),李弘毅老师及课程组拥有最终的解释权利。
If anyone consider this content inappropriate, feel free to contact me at meltlilith0409@foxmail.com, I’ll instantly delete this blog.
实验的开始:摸着colab与kaggle过河
实验的代码(以及运行环境)集成在google colab上,使用非常的方便,这里推荐所有同学入坑时看过网页上week1的教程视频。(2023 spring还专门准备了一节课的colab tutorial,羡慕,可惜目前已经404)
之后有一部分实验的colab已经下架,但是所有ipynb文件都被保留在李宏毅老师官方批准的github上,下载下来自行导入colab,还是可以做的。
部分实验由于下架,在notebook中的下载链接失效,此时需要前往提供的kaggle比赛地址上下载训练集与测试集,直接导入colab。
另外kaggle也是调参训练后评测的地方(没错,这门课目前仍然可以进行开源的测试),所以一定要记得注册账号。
Lab1:Covid-19 Cases Prediction
Given survey results in the past 5 days in a specific state in U.S., then predict the percentage of new tested positive cases in the 5th day.
实验目的:
- 熟悉pytorch操作
- 用深度神经网络DNN解决一个regression(回归)问题
实验代码:
请自行Refer to code。
实验TODO list:
自行尝试并更改Neural Network Model
根据实验数据集选择对结果有影响的Feature
自定义一个optimization algorithm
尝试使用L2 regularization
自行更改hyperparameters 炼丹
Simple baseline(40%得分):2.18964
学会整个google colab的操作后,将产出结果(.csv)下载导出,提交到kaggle里即可。(经典送分捞人)
Medium baseline(60%得分):1.48651
很容易发现的是,实验最开始使用了所有特征,其中包括了大量与测试结果完全没有干系的feature,很影响训练效果。
feature里包括各类参数,例如:
- 以One-hotter表示的所在州信息(1-37列)
- COVID-like illness (4)
- Behavior Indicators (8)
- Mental Health Indicators (5)
- Tested Positive Cases (1)
中间三个因素出现了5次,代表Day1-Day5的所有已知数据;Tested Positive Cases只出现了四次——因为第五次就是要我们预测的啊(
我们可以先(根据常识与)同现频率去找到与Tested Positive Cases同现频率高的因素,这些因素可以作为我们的Feature。
python的pandas库是读写csv文件非常优秀的库,也是本次实验中一开始就import了的库,推荐使用。官方主页
在选择训练要素之前,我们可以先可视化一下训练集的数据,找与Tested_Positive.4相关系数比较高的属性拿来作为输入参数。
data_visual = pd.read_csv('./covid.train.csv') #读取做可视化
print( f'train {data_visual.shape}' )
display( data_visual.head() ) #数据的head部分,前5条记录
display( data_visual.describe() ) #数据的描述,包括中位数,平均值等
corr_matrix = data_visual.corr() #计算所有系数间的同现矩阵
corr = corr_matrix.loc['tested_positive.4',:].sort_values()[:-1]#去掉末尾与自己的同现后,把与tested_positive.4同现的同现系数行提出来
corr = pd.DataFrame({'tested_positive.4':corr})
display(corr)#变成一张表展示一下
corr_factors = corr[-32:].index.tolist() #取前32个相关系数作为参数
print([data_visual.columns.get_loc(c) for c in corr_factors]) #找到他们在训练集中的编号
找到的属性号列表这里就不放出了,在colab里自己跑一遍的速度是很快的。
之后根据得到的属性号列表,我们修改hyperparameter中的select_all属性,将其改为false,再自己换一个seed后直接train,即可拿下60%。
另外,configuration里面的其他东西个人感觉是不太需要调,不过也可以尝试着用调参的方式慢慢玩,毕竟colab跑一遍挺快的是吧(梅开二度)。
Strong Baseline:1.14420
Strong,我们可以尝试根据hint试试不同的网络结构和optimization了。
首先是网络结构。更改网络结构主要就是几个点:网络层数、神经元type、神经元个数。
实验一这种Regression网络,一般来说和李老师上课讲的一样,设在1-4层内就够了。示例代码里给到2层,我自己试了试1/3/4层+ReLU的效果。(到这儿为止是一天的量)
3层:Train loss: 1.0506, Valid loss: 1.4989(下图pred(1))
1层:Train loss: 1.0970, Valid loss: 1.3068(下图pred(2))
4层:Train loss: 1.0829, Valid loss: 1.3270(下图pred(3))
如此一看,1层居然是效果最好的。
其实,这也是有理由的。参考这篇知乎专栏:如何确定神经网络的层数和隐藏层神经元数量,我们知道:
我们的线性回归函数是从一个连续空间映射到另一个连续空间的函数,因而一层hidden layer足矣。
下一个问题是Neuron的个数。同样摘自上文专栏,我们约计2k7的样本,输入层32神经元,输出层1个神经元,可取的范围大概是在8~40个,经测试,取8个神经元的时候效果最好。
再然后,我们可以尝试更改网络架构中的优化算法。
目前,算法中使用的Optimizer是SGD,我们可以尝试着根据Pytorch给出的算法list来进行替代。
通过阅读他人的经验Blog,我尝试着使用了Adam算法。Adam算法在使用的时候可以适当调高学习率(从预设的1e-5调到1e-4),最后学习出来的效果是很不错的。(甚至public过了Boss Baseline)
最后,还可以尝试Neuron的不同种类(ReLU,LeakyReLU和Sigmoid)。
我三种都做了尝试,在我选择的条件下区别并不大,LeakyReLU略优一点点。
Boss Baseline:0.88509
L2 Regularation
Boss baseline不好过,需要更精准的特征选择+归一化,也需要调参和对网络结构的优化,第一遍学习我就不过多的在这上面花费时间了,留待之后继续优化吧。
Conclusion
从最开始拿到Lab代码一筹莫展到实验最后对regression有了初步的了解,Lab1是一个非常优秀的入门实验,能带第一次接触机器学习的小白走过pytorch的许多基础步骤,了解一些基本概念。
在完成实验的过程中,我参考了许多优秀的Blog和经验贴,也都贴在了上面。
可惜没有NTU COOL的账号,我真的很想看看课程的标准solution。