题目介绍
是一个DNN二分类问题,给定前4天的信息,预测第五天这个人有没有阳
2022ML网站ML 2022 Spring (ntu.edu.tw)
老师给的基线代码:https://colab.research.google.com/drive/1FTcG6CE-HILnvFztEFKdauMlPKfQvm5Z#scrollTo=YdttVRkAfu2t
kaggle提交: ML2022Spring-hw1 | Kaggle
公榜baseline:
bossline 私榜0.88509,公榜0.85800
以上可能需要科学上网
题目解答
simple baseline
拿到代码跑一遍可以获得1.6145的基线
medium baseline
在此基础上改小batchsize可以轻松达到medium baseline。
这其中的道理目前猜测是小的batchsize训练过程中引入了一定的噪音所以获得了更好的泛化表现(不过可能也是强行解释,如果有懂得人可以评论说一说哈)
关于模型结构并没有动很多,只是把relu改为了leakyrelu。简单尝试了一下增加模型复杂度,效果并不好,我觉得现有的数据规模不大,并且数据之间的关联性可能没有那么强,所以用一个简单的模型效果可能就已经不错了。如果要动模型结构的话应该是同时加复杂度和正则的方向继续改进,可能会有提升,不过因为已经到了bossline就没接着做了。
strong baseline
关于达到strong baseline,这步需要特征筛选。理论上神经网络应该也能自己筛选特征,但是可能是不够深,数据不够多,简单的DNN配上简单的数据是有极限的。所以只好帮他筛选筛选。
我的方法是拿线性回归单模输出输入的权重绝对值,删除小的。反正后续还能用他来ensemble。省事。
特征数量对模型表现影响还是比较大的,需要稍微精细一点
筛选完特征之后,DNN单模能够达到私榜0.933+公榜0.890分数,成功越过strong baseline。而且还超过了一些。
boss baseline
DNN单模距离bossbase还有一小段距离,直接用线性回归+DNN单模做一个平均权重的ensemble,就超过了boss baseline。
过程记录
修改 | 私榜 | 公榜 | 备注 |
baseline | 1.6145 | ||
加线性层 | 1.5947 | ||
线性层+batchsize1024 | 2.0333 | ||
线性层+batchsize128 | 1.2539 | ||
线性层+batchsize64 | 1.23344 | ||
线性层+batchsize64+l2正则 | 1.15726 | ||
线性层+batchsize64+l2正则+训练7k轮 | 1.46195 | ||
sklearn单模尝试 | |||
线性回归单模 | 1.01366 | ||
决策树回归 | 6.69577 | ||
单模线性回归(保留了42个特征) | 0.91216 | 0.89979 | |
ensemble模型结果 | |||
dnn特征数量52+batchsize64+正则+ensemble线性单模 | 0.92129 | 0.96981 | |
dnn特征数量62+batchsize64+正则+ensemble线性单模 | 0.87775 | 0.84749 | 单模lr 0.921+0.909 单模dnn 0.933+0.890 |
DNN模型结构
class My_Model(nn.Module):
def __init__(self, input_dim):
super(My_Model, self).__init__()
# TODO: modify model's structure, be aware of dimensions.
self.layers = nn.Sequential(
nn.Linear(input_dim, 16),
nn.LeakyReLU(0.05),
nn.Linear(16, 8),
nn.LeakyReLU(0.05),
nn.Linear(8, 1)
)
可能的改进方向
目前看的话,DNN模型可以加复杂度和正则尝试一下,另外不同的梯度优化方法我并没有尝试,学习率没有尝试。
预处理现在是前5天预测1天的信息,可以预处理为前1天预测后一天的信息,训练出来再ensemble
代码开源
百度网盘:链接:百度网盘 请输入提取码 提取码:ncm3
Github:____