HW1:regression
HW1:Regression
任务描述
新冠检测预测:根据前4天的特征和核酸检测结果,预测第5天的核酸检测结果为阳性的可能性
数据
两个文件covid.train.csv
和covid.test.csv
-
train
2699x118,2699个样本,每个样本的118维特征包括
-
1:id,样本编号
-
37:此样本所属的州(共37个州,ont-hot编码)
-
16x5:此样本过去5天的特征(症状、日常活动、精神状况等)和核酸检测结果
-
-
test
2699x117,与118维特征相比,不包含第5天核酸检测阳性百分比(要预测的值)
代码细节
记录作业1代码实现过程中遇到的一些不熟悉的细节
tqdm
参考:
https://blog.csdn.net/weixin_44878336/article/details/124894210
https://blog.csdn.net/qq_41554005/article/details/117297861
tqdm是一个进度条的包,可以很方便的实现训练过程的进度条
使用set_description()
和set_postfix()
方法可以在进度条中动态的添加一些信息
使用这两个方法时,一般需要定义一个tqdm对象,然后再调用方法
-
set_description()
用于定义进度条的前缀信息
-
set_postfix()
用于定义进度条的后缀信息
loss.detach() & loss.item()
参考:https://blog.csdn.net/weixin_45377629/article/details/124330468
问题
pytorch采用动图机制,通过tensor构建图,里面包括梯度信息用于反向传播,但是如果频繁使用这样的变量,会导致显存变得越来越小,模型训练越来越慢
解决
-
loss.detach()
重新声明一个变量,指向原变量的存放位置,requires_grad变为False
-
loss.item()
直接获得对应的数据
.detach().cpu().numpy()
参考:https://blog.csdn.net/qq_44701643/article/details/127376493
对预测结果先使用.detach()
阻断梯度,返回tensor变量,但此时变量仍在gpu显存上,需要使用.cpu()
传到cpu上,再使用.numpy()
转换为numpy类型cpu变量
训练效果
将生成的pred.csv文件提交到kaggle课程作业项目中,查看得分,这个得分应该是项目中定义的loss,得分越低,证明模型的表现越好。
目前(2023.4.20),在我现在所掌握的技术范围内,我能实现最好的训练效果是采用Adam优化器实现的
且两个最好效果的模型都是16->8->1的,具体模型代码如下
from torch import nn
class Model(nn.Module):
def __init__(self, input_dim):
super(Model, self).__init__()
self.layers = nn.Sequential(
nn.Linear(input_dim, 16),
nn.ReLU(),
nn.Linear(16, 8),
nn.ReLU(),
nn.Linear(8, 1),
)
def forward(self, x):
out = self.layers(x)
return out.squeeze(1)
效果一
使用Adam优化器,设置学习率为0.0001
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)
效果二
相对于效果一,设置更大的batch_size为512
后续可应用学习到的其他的技术,以进一步提高模型表现