• 【深度学习实验】线性模型(五):使用Pytorch实现线性模型:基于鸢尾花数据集,对模型进行评估(使用随机梯度下降优化器)


    目录

    一、实验介绍

     二、实验环境

    1. 配置虚拟环境

    2. 库版本介绍

    三、实验内容

    0. 导入库

    1. 线性模型linear_model

    2. 损失函数loss_function

    3. 鸢尾花数据预处理

    4. 初始化权重和偏置

    5. 优化器

    6. 迭代

    7. 测试集预测

    8. 实验结果评估

    9. 完整代码


     

     

    一、实验介绍

            线性模型是机器学习中最基本的模型之一,通过对输入特征进行线性组合来预测输出。本实验旨在展示使用随机梯度下降优化器训练线性模型的过程,并评估模型在鸢尾花数据集上的性能。

     

     二、实验环境

            本系列实验使用了PyTorch深度学习框架,相关操作如下:

    1. 配置虚拟环境

    conda create -n DL python=3.7 
    conda activate DL
    pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
    
    conda install matplotlib
     conda install scikit-learn

    2. 库版本介绍

    软件包本实验版本目前最新版
    matplotlib3.5.33.8.0
    numpy1.21.61.26.0
    python3.7.16 
    scikit-learn0.22.11.3.0
    torch1.8.1+cu1022.0.1
    torchaudio0.8.12.0.2
    torchvision0.9.1+cu1020.15.2

     

    三、实验内容

    0. 导入库

    1. import torch
    2. import torch.optim as optim
    3. from sklearn.datasets import load_iris
    4. from sklearn.model_selection import train_test_split
    5. from sklearn import metrics
    • PyTorch
      • 优化器模块(optim
    • scikit-learn
      • 数据模块(load_iris)
      • 数据划分(train_test_split)
      • 评估指标模块(metrics

     

    1. 线性模型linear_model

            该函数接受输入数据x,使用随机生成的权重w和偏置b,计算输出值output。这里的线性模型的形式为 output = x * w + b

    1. def linear_model(x):
    2. return torch.matmul(x, w) + b

     

    2. 损失函数loss_function

          这里使用的是均方误差(MSE)作为损失函数,计算预测值与真实值之间的差的平方。

    1. def loss_function(y_true, y_pred):
    2. loss = (y_pred - y_true) ** 2
    3. return loss

     

    3. 鸢尾花数据预处理

    • 加载鸢尾花数据集并进行预处理

      • 将数据集分为训练集和测试集

      • 将数据转换为PyTorch张量

    1. iris = load_iris()
    2. x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)
    3. x_train = torch.tensor(x_train, dtype=torch.float32)
    4. y_train = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
    5. x_test = torch.tensor(x_test, dtype=torch.float32)
    6. y_test = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)

     

    9c46214082c941f3aa51a0aeaa6cdf84.png

     

    4. 初始化权重和偏置

    1. w = torch.rand(1, 1, requires_grad=True)
    2. b = torch.randn(1, requires_grad=True)

     

    5. 优化器

            使用随机梯度下降(SGD)优化器进行模型训练,指定学习率和待优化的参数w, b。

    optimizer = optim.SGD([w, b], lr=0.01) # 使用SGD优化器

            

    6. 迭代

    1. num_epochs = 100
    2. for epoch in range(num_epochs):
    3. optimizer.zero_grad() # 梯度清零
    4. prediction = linear_model(x_train, w, b)
    5. loss = loss_function(y_train, prediction)
    6. loss.mean().backward() # 计算梯度
    7. optimizer.step() # 更新参数
    8. if (epoch + 1) % 10 == 0:
    9. print(f"Epoch {epoch+1}/{num_epochs}, Loss: {loss.mean().item()}")
    • 在每个迭代中:

      • 将优化器的梯度缓存清零,然后使用当前的权重和偏置对输入 x 进行预测,得到预测结果 prediction

      • 使用 loss_function 计算预测结果与真实标签之间的损失,得到损失张量 loss

      • 调用 loss.mean().backward() 计算损失的平均值,并根据计算得到的梯度进行反向传播。

      • 调用 optimizer.step() 更新权重和偏置,使用优化器进行梯度下降更新。

      • 每隔 10 个迭代输出当前迭代的序号、总迭代次数和损失的平均值。

     

    dc7ba833f87d4d4387e1e85a1c9d3b24.png

     

    7. 测试集预测

            在测试集上进行预测,使用训练好的模型对测试集进行预测

    1. with torch.no_grad():
    2. test_prediction = linear_model(x_test, w, b)
    3. test_prediction = torch.round(test_prediction) # 四舍五入为整数
    4. test_prediction = test_prediction.detach().numpy()

     

    8. 实验结果评估

    • 使用 metrics 模块计算分类准确度(accuracy)、精确度(precision)、召回率(recall)和F1得分(F1 score)。
    • 输出经过优化后的参数 w 和 b,以及在测试集上的评估指标。
    1. accuracy = metrics.accuracy_score(y_test, test_prediction)
    2. precision = metrics.precision_score(y_test, test_prediction, average='macro')
    3. recall = metrics.recall_score(y_test, test_prediction, average='macro')
    4. f1 = metrics.f1_score(y_test, test_prediction, average='macro')
    5. print("The optimized parameters are:")
    6. print("w:", w.flatten().tolist())
    7. print("b:", b.item())
    8. print("Accuracy:", accuracy)
    9. print("Precision:", precision)
    10. print("Recall:", recall)
    11. print("F1 Score:", f1)

     

    c42e87ec31d64ab5974f55c094b2ad2f.png

            本实验使用随机梯度下降优化器训练线性模型,并在鸢尾花数据集上取得了较好的分类性能。实验结果表明,经过优化后的模型能够对鸢尾花进行准确的分类,并具有较高的精确度、召回率和F1得分。

     

    9. 完整代码

    1. import torch
    2. import torch.optim as optim
    3. from sklearn.datasets import load_iris
    4. from sklearn.model_selection import train_test_split
    5. from sklearn import metrics
    6. def linear_model(x, w, b):
    7. return torch.matmul(x, w) + b
    8. def loss_function(y_true, y_pred):
    9. loss = (y_pred - y_true) ** 2
    10. return loss
    11. # 加载鸢尾花数据集并进行预处理
    12. iris = load_iris()
    13. x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)
    14. x_train = torch.tensor(x_train, dtype=torch.float32)
    15. y_train = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
    16. x_test = torch.tensor(x_test, dtype=torch.float32)
    17. y_test = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)
    18. w = torch.rand(x_train.shape[1], 1, requires_grad=True)
    19. b = torch.randn(1, requires_grad=True)
    20. optimizer = optim.SGD([w, b], lr=0.01) # 使用SGD优化器
    21. num_epochs = 100
    22. for epoch in range(num_epochs):
    23. optimizer.zero_grad() # 梯度清零
    24. prediction = linear_model(x_train, w, b)
    25. loss = loss_function(y_train, prediction)
    26. loss.mean().backward() # 计算梯度
    27. optimizer.step() # 更新参数
    28. if (epoch + 1) % 10 == 0:
    29. print(f"Epoch {epoch+1}/{num_epochs}, Loss: {loss.mean().item()}")
    30. # 在测试集上进行预测
    31. with torch.no_grad():
    32. test_prediction = linear_model(x_test, w, b)
    33. test_prediction = torch.round(test_prediction) # 四舍五入为整数
    34. test_prediction = test_prediction.detach().numpy()
    35. accuracy = metrics.accuracy_score(y_test, test_prediction)
    36. precision = metrics.precision_score(y_test, test_prediction, average='macro')
    37. recall = metrics.recall_score(y_test, test_prediction, average='macro')
    38. f1 = metrics.f1_score(y_test, test_prediction, average='macro')
    39. print("The optimized parameters are:")
    40. print("w:", w.flatten().tolist())
    41. print("b:", b.item())
    42. print("Accuracy:", accuracy)
    43. print("Precision:", precision)
    44. print("Recall:", recall)
    45. print("F1 Score:", f1)

     

     

     

     

     

     

  • 相关阅读:
    【重温Python基础】最全Python基础知识点,加班熬夜花了三天终于总结出来了,非常详细
    [Java | Web] JavaWeb——JSON与AJAX简介
    CVPR2024|AIGC(图像生成,视频生成等)相关论文汇总(附论文链接/开源代码/解析)【持续更新】
    vim的使用介绍以及命令大全
    [附源码]java毕业设计 宠物医院管理系统
    读书笔记:JavaScript DOM 编程艺术(第二版)
    CSS 中的 display 和 visibility
    以脚本形式运行python库
    线性代数视频笔记
    计网第五章(运输层)(六)(TCP可靠传输的实现)
  • 原文地址:https://blog.csdn.net/m0_63834988/article/details/132952904