首页 > 其他分享 >第三节 回归实战

第三节 回归实战

时间:2025-01-15 19:54:46浏览次数:1  
标签:实战 loss 第三节 val 回归 train model data self

数据处理

超参:人为指定不能改变

测试数据只有x没有标签y
训练数据拆分,82开,作训练集和验证集(验证模型好坏),模型训练不是一路上升的过程,训练几次验证一次,最好的模型save下来

one-hot独热编码 猪(1 0 0) 狗(0 1 0) 猫(0 0 1)

def get_feature_importance(feature_data, label_data, k = 4, column = None):
    """
    feature_data, label_data 要求字符串形式
    k为选择的特征数量
    如果需要打印column,需要传入行名
    此处省略 feature_data, label_data 的生成代码。
    如果是 CSV 文件,可通过 read_csv() 函数获得特征和标签。
    这个函数的目的是, 找到所有的特征种, 比较有用的k个特征, 并打印这些列的名字。
    """
    model = SelectKBest(chi2, k=k)      #定义一个选择k个最佳特征的函数
    feature_data = np.array(feature_data, dtype=np.float64)
    X_new = model.fit_transform(feature_data, label_data)   #用这个函数选择k个最佳特征
    #feature_data是特征数据,label_data是标签数据,该函数可以选择出k个特征
    print('x_new', X_new)
    scores = model.scores_                # scores即每一列与结果的相关性
    # 按重要性排序,选出最重要的 k 个
    indices = np.argsort(scores)[::-1]        #[::-1]表示反转一个列表或者矩阵。
    # argsort这个函数, 可以矩阵排序后的下标。 比如 indices[0]表示的是,scores中最小值的下标。

    if column:                            # 如果需要打印选中的列名字
        k_best_features = [column[i] for i in indices[0:k].tolist()]         # 选中这些列 打印
        print('k best features are: ',k_best_features)
    return X_new, indices[0:k]                  # 返回选中列的特征和他们的下标。
class Covid_dataset(Dataset):
    def __init__(self, file_path, mode, dim=4, all_feature=False):
        with open(file_path, "r") as f:
            csv_data = list(csv.reader(f))#list会变为数据
            data = np.array(csv_data[1:])#去掉第一行
            if mode == "train": #逢五取一
                indices = [i for i in range(len(data)) if i % 5 !=0]
            elif mode == "val":
                indices = [i for i in range(len(data)) if i % 5 ==0]

            if all_feature:
                col_idx = [i for i in range(0,93)]
            else:
                _, col_idx = get_feature_importance(data[:,1:-1], data[:,-1], k=dim,column =csv_data[0][1:-1])

            if mode == "test":
                x = data[:, 1:].astype(float)#将数据由字符型转为浮点型
                x = torch.tensor(x[:, col_idx])
            else:
                x = data[indices, 1:-1].astype(float) #x 选indices的行 x要去掉最后一列
                x = torch.tensor(x[:, col_idx])
                y = data[indices, -1].astype(float)
                self.y = torch.tensor(y)
            self.x = (x-x.mean(dim=0, keepdim=True))/x.std(dim=0, keepdim=True)#数据的量纲不同,要归一化.每列的数值差距大 mean()平均值要在一列中取第0维同时保持维度不变
            self.mode = mode #把mode传到self中
    def __getitem__(self, item):
        if self.mode == "test":
            return self.x[item].float()#测试集没有y float是把变量变为32位,消耗不会太大,
        else:
            return self.x[item].float(), self.y[item].float() 
    def __len__(self):
        return len(self.x)

Dataset类 xy

  1. init 初始化 filepath x[] Y[]
  2. getitem 取数据 idx->X[idx] Y[idx]
  3. len 数据长度


    模型部分
class myModel(nn.Module):#模型首先关注维度变化 回归中用全连接linear 上一层输出一定是下一层输入 输入维度(16,93)16为样本数量,93为样本维度
    def __init__(self, dim):#初始化 模型长什么样 dim为输入维度
        super(myModel, self).__init__()#修改这里的初始化
        self.fc1 = nn.Linear(dim, 100)#全连接(输入维度,输出维度)
        self.relu = nn.ReLU() #激活函数 不需要参数
        self.fc2 = nn.Linear(100, 1) #输入100维 输出1维

    def forward(self, x):#模型前向过程
        x = self.fc1(x) 
        x = self.relu(x)
        x = self.fc2(x)

        if len(x.size())>1: #x有两维要减去一维 去掉第二维,去掉第二个
            x = x.squeeze(dim=1)
        return x

超参部分

config = {
    "lr" : 0.001,
    "momentum": 0.9,#动量,惯性,继续冲一下
    "epochs":20,
    "save_path": "model_save/model.pth", #保存路径
    "rel_path" : "pred.csv" #
}
loss = nn.MSELoss()

optimizer = optim.SGD(model.parameters(), lr=config["lr"], momentum=config["momentum"])

train_val(model, train_loader, val_loader, device, config["epochs"], optimizer, loss, config["save_path"])

evaluate(config["save_path"], device, test_loader, config["rel_path"])

训练流程

def train_val(model, train_loader, val_loader, device, epochs, optimizer, loss, save_path):
    model = model.to(device)

    plt_train_loss = [] #每轮训练记录loss值,记录所有轮次loss值
    plt_val_loss = []
    min_val_loss = 9999999999 #记录最好的模型,最小的loss值


    for epoch in range(epochs): #冲锋的号角
        train_loss = 0.0
        val_loss = 0.0
        start_time = time.time()

        model.train() #模型调整为训练模式
        for batch_x, batch_y in train_loader:
            x, target = batch_x.to(device), batch_y.to(device)
            pred = model(x) #得到预测值
            # train_bat_loss = loss(pred, target,model)
            train_bat_loss = loss(pred, target) #得到loss
            train_bat_loss.backward() #回传
            optimizer.step() #更新模型
            optimizer.zero_grad() #模型梯度清0
            train_loss += train_bat_loss.cpu().item()#在gpu上是张量没法和浮点数相加 item为把数值取出来

        plt_train_loss.append(train_loss/train_loader.dataset.__len__())#加在所有的loss值里,记录的是平均值


        model.eval() #调整为验证模式
        with torch.no_grad(): #所有在张量网上的计算都会计算梯度,验证集不会更新模型
            for batch_x, batch_y in val_loader:
                x, target = batch_x.to(device), batch_y.to(device)
                pred = model(x)
                # val_bat_loss = loss(pred, target,model)
                val_bat_loss = loss(pred, target)
                val_loss += val_bat_loss.cpu().item()
        plt_val_loss.append(val_loss / val_loader.dataset.__len__())
        if val_loss < min_val_loss: #模型效果最好,保存模型
            torch.save(model, save_path)
            min_val_loss = val_loss

        print("[%03d/%03d]  %2.2f secs Trainloss: %.6f Valloss: %.6f"%(epoch, epochs, time.time()-start_time,plt_train_loss[-1],plt_val_loss[-1]))

    plt.plot(plt_train_loss)#画图函数
    plt.plot(plt_val_loss)
    plt.title("loss")
    plt.legend(["train","val"])#图例
    plt.show()

标签:实战,loss,第三节,val,回归,train,model,data,self
From: https://www.cnblogs.com/jyp02/p/18673544

相关文章

  • 电源中TL431及光耦的实战运用
    首先了解一下TL431的基本原理;由一个运放及三极管组成;运放的应用前文略有几笔,此处未加反馈,运放只需要同相端与反相端做差在输出对应电压即可,而三极管是电压驱动;当VREF>2.5V即同相端大于反相端,输出正电压,三极管导通,当VREF<2.5V即同相端小于反相端,输出负电压,三极管截止。需要注意......
  • C#实战|人员管理系统[29]:显示要修改的人员信息
    哈喽,你好啊,我是雷工!前面已经练习了按组织查询和按编号查询的功能,这里接着练习修改人员信息的功能;首先实现打开修改界面,以下为练习笔记。01 效果演示①当查询结果为空时,点击【修改】按钮,提示:无任何要修改的人员信息!②当有查询结果,并选中某......
  • Docker实战案例:构建并部署一个Node.js Web应用
    在当今快速迭代的软件开发环境中,容器化技术以其轻量级、可移植性和高效资源利用等特性,成为了开发和运维团队不可或缺的工具。Docker作为容器技术的佼佼者,极大地简化了应用的打包、分发和部署流程。本文将通过一个完整的Node.jsWeb应用案例,展示如何使用Docker从代码编写到部......
  • 【项目实战】如何在不同操作系统中更改DNS解析器的简要指南
    如何在不同操作系统中更改DNS解析器的简要指南:一、Windows操作系统中更改DNS解析器打开控制面板>网络和互联网>网络和共享中心。点击您正在使用的网络连接旁边的属性。选择Internet协议版本4(TCP/IPv4)或Internet协议版本6(TCP/IPv6),然后点击属性。......
  • 应用回归分析-何晓群
    第1章回归分析概述11.1变量间的统计关系11.2回归方程与回归名称的由来31.3回归分析的主要内容及其一般模型51.4建立实际问题回归模型的过程71.5回归分析应用与发展述评1思考与练习14第2章一元线性回归152.1一元线性回归模型152.2参数(B_0),......
  • 【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优
    【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升章节内容【01】章节内容【01】vs-code配置flutter环境开发背景优雅草央千澈对本项目的描......
  • 渗透测试怎么做?看看大神一次完整的渗透测试实战
    渗透测试就是利用我们所掌握的渗透知识,对网站进行一步一步的渗透,发现其中存在的漏洞和隐藏的风险,然后撰写一篇测试报告,提供给我们的客户。客户根据我们撰写的测试报告,对网站进行漏洞修补,以防止黑客的入侵!渗透测试的前提是我们得经过用户的授权,才可以对网站进行渗透。如果我......
  • 大模型书籍李开复周鸿祎力荐《实战AI大模型》!NUS尤洋教授首发新书深入浅出热门AI大模
    《实战AI大模型》这本大模型书籍已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】在GPT-4的惊艳亮相之际,AI大模型成为了学界和工业界的热门话题。这些模型的复杂性和不断发展的技术为我们带来了新的挑战和机遇。人工智能正在从......
  • 【FLUX教程】重磅回归:麦橘团队发布FLUX最新亚洲人像模型!
    大家好,就在昨天,麦橘团队推出了基于FLUX的最新亚洲人像模型。麦橘模型在SD15时代是大家画小姐姐的首选模型,几乎所有用过麦橘模型的同学都说好。然而,它却在SDXL,FLUX时代,慢慢淡出了大家的视野。不过,它并没有消失,经过一段时间的沉寂,麦橘团队再次推出基于FLUX微调的最新的majic......
  • 跟我一起学 Python 数据处理(三十八):数据案例实战与存储要点解析
    跟我一起学Python数据处理(三十八):数据案例实战与存储要点解析在数据处理的学习之旅中,我们致力于与各位共同成长,探索数据的奥秘。上两篇博客分别介绍了多种数据来源和获取方法,今天我们将通过实际案例进一步深化理解,并着重探讨数据存储方面的关键知识。一、案例深度剖析(一......