HW1:regression

HW1:Regression

任务描述

新冠检测预测:根据前4天的特征和核酸检测结果,预测第5天的核酸检测结果为阳性的可能性

image-20230419082114381

数据

两个文件covid.train.csvcovid.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()

    用于定义进度条的后缀信息

image-20230420073030160 image-20230420073357279

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)

image-20230420155728343

效果二

相对于效果一,设置更大的batch_size为512

image-20230420155811264

后续可应用学习到的其他的技术,以进一步提高模型表现

posted @ 2023-04-20 16:03  dctwan  阅读(24)  评论(0编辑  收藏  举报