Pytorch解决 多元回归 问题的算法

Pytorch解决 多元回归 问题的算法

回归是一种基本的统计建模技术,用于建立因变量与一个或多个自变量之间的关系。

我们将使用 PyTorch(一种流行的深度学习框架)来开发和训练线性回归模型。

二元回归的简单示例

训练数据集(可获取)

对于此分析,我们将使用scikit-learn 库中的 make regression() 函数生成的合成数据集。数据集由输入特征和目标变量组成。输入特征代表自变量,而目标变量代表我们想要预测的因变量

python 复制代码
import seaborn as sns
import numpy as sns
import torch
import torch.nn as nn
import torch.optim as optim
import sklearn
from sklearn import datasets
import pandas as pd

data=datasets.make_regression()    # from sklearn we are going to select one dataset
df = pd.DataFrame(data[0], columns=[f"feature_{i+1}" for i in range(data[0].shape[1])])
df["target"] = data[1]

数据的结构,100 rows × 101 columns,最后 1 column为目标值

准备训练集与测试集

PyTorch 是一个功能强大的开源深度学习框架,提供了一种灵活的方式来构建和训练神经网络。它提供了一系列张量运算、自动微分和优化算法的功能。

使用 sklearn Train-Test-split 准备数据以开发模型

python 复制代码
x=df.iloc[: , :-1]   # 除目标数据身下所以的
y=df.iloc[: , -1]    # target

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=42)
print(type(X_train))
# X_train=torch.tensor(X_train,dtype=torch.float32)

X_train = torch.tensor(X_train.values, dtype=torch.float32)  # 转化为 tensor
X_test = torch.tensor(X_test.values, dtype=torch.float32)
y_train = torch.tensor(y_train.values, dtype=torch.float32)
y_test = torch.tensor(y_test.values, dtype=torch.float32)

模型架构

数据准备好了,可以准备模型了

我们的线性回归模型是作为PyTorch 中nn.Module类的子类实现的。该模型由多个按顺序连接的完全连接(线性)层组成。

python 复制代码
class linearRegression(nn.Module): 
# 所有来自torch的依赖项将被传递给这个类[父类] 
# nn.Module 包含了神经网络的所有构建模块:
  def __init__(self,input_dim):
    super(linearRegression,self).__init__()   # building connection with parent and child classes
    self.fc1=nn.Linear(input_dim,10)          # hidden layer 1
    self.fc2=nn.Linear(10,5)                  # hidden layer 2
    self.fc3=nn.Linear(5,3)                   # hidden layer 3
    self.fc4=nn.Linear(3,1)                   # last layer

  def forward(self,d):
    out=torch.relu(self.fc1(d))              # input * weights + bias for layer 1
    out=torch.relu(self.fc2(out))            # input * weights + bias for layer 2
    out=torch.relu(self.fc3(out))            # input * weights + bias for layer 3
    out=self.fc4(out)                        # input * weights + bias for last layer
    return out                               # final outcome

input_dim=X_train.shape[1]     # 获取 input_dim 变量的数量
torch.manual_seed(42)          # to make initilized weights stable:
model=linearRegression(input_dim)
python 复制代码
# select loss and optimizers

loss=nn.MSELoss() # loss function
optimizers=optim.Adam(params=model.parameters(),lr=0.01)

loss_values_all = []  # 创建一个列表来存储每个迭代的loss值

# training the model:

num_of_epochs=1000
for i in range(num_of_epochs):
  # give the input data to the architecure
  y_train_prediction=model(X_train)  # model initilizing
  loss_value=loss(y_train_prediction.squeeze(),y_train)   # find the loss function:
  optimizers.zero_grad() # make gradients zero for every iteration so next iteration it will be clear
  loss_value.backward()  # back propagation
  optimizers.step()      # update weights in NN
  
  loss_values_all.append(loss_value.item())  # 将当前的loss值添加到列表中

  # print the loss in training part:
  if i % 10 == 0:
    print(f'[epoch:{i}]: The loss value for training part={loss_value}')

绘制 loss 曲线图

在测试数据集上的效果(test data)

python 复制代码
with torch.no_grad():
  model.eval()   # make model in evaluation stage
  y_test_prediction=model(X_test)
  test_loss=loss(y_test_prediction.squeeze(),y_test)
  print(f'Test loss value : {test_loss.item():.4f}')

测试自己随机生成的数据

python 复制代码
# Inference with own data:
pr = torch.tensor(torch.arange(1, 101).unsqueeze(dim=0), dtype=torch.float32).clone().detach()
print(pr)

保存训练好的模型

python 复制代码
# save the torch model:

from pathlib import Path

filename=Path('models')
filename.mkdir(parents=True,exist_ok=True)

model_name='linear_regression.pth' # model name

# saving path

saving_path=filename/model_name
print(saving_path)
torch.save(obj=model.state_dict(),f=saving_path)

# we can load the saved model and do the inference again:

load_model=linearRegression(input_dim) # creating an instance again for loaded model
load_model.load_state_dict(torch.load('./models/linear_regression.pth'))

load_model.eval()   # make model in evaluation stage
with torch.no_grad():
  pred = load_model(torch.tensor([[  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,  11.,  12.,
          13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,  22.,  23.,  24.,
          25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,  33.,  34.,  35.,  36.,
          37.,  38.,  39.,  40.,  41.,  42.,  43.,  44.,  45.,  46.,  47.,  48.,
          49.,  50.,  51.,  52.,  53.,  54.,  55.,  56.,  57.,  58.,  59.,  60.,
          61.,  62.,  63.,  64.,  65.,  66.,  67.,  68.,  69.,  70.,  71.,  72.,
          73.,  74.,  75.,  76.,  77.,  78.,  79.,  80.,  81.,  82.,  83.,  84.,
          85.,  86.,  87.,  88.,  89.,  90.,  91.,  92.,  93.,  94.,  95.,  96.,
          97.,  98.,  99., 100.]]))

  print(f'prediction value : {pred.item()}')
相关推荐
w_t_y_y几秒前
Agent设计模式(二)语义压缩(Semantic Compaction)
人工智能
云烟成雨TD1 分钟前
Spring AI 1.x 系列【43】基于标准输入输出 (STDIO) 与服务端推送事件 (SSE) 的 MCP 服务端
java·人工智能·spring
Bruce_Liuxiaowei1 分钟前
智能音箱数据分析与优化方案
人工智能·数据挖掘·数据分析·智能音箱·智能体
财经资讯数据_灵砚智能2 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月7日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
qq3621967052 分钟前
AI Crawler深度解析:GPTBot/PerplexityBot/ClaudeBot爬取行为分析与优化
人工智能·爬虫
LedgerNinja5 分钟前
WEEX Labs 周度观察:从“通用对话”到“自主执行”,AI 产业进入价格战与规范发展并行的下半场
大数据·人工智能·物联网
piao9618275 分钟前
2025-2026销售商机管理AI工具推荐:优选灵听工牌AIOT软硬一体方案
人工智能·语音识别
Web极客码6 分钟前
如何用 Docker 容器与“看门狗”脚本安全驯服 OpenClaw
服务器·人工智能·ai编程
FII工业富联科技服务7 分钟前
智慧园区统一运营平台技术架构解析:全景3D世界模型+视频AI+物联网闭环实践
大数据·人工智能·物联网·3d·ai·制造
treesforest8 分钟前
构建AI安全网关:基于三层画像模型的IP风险识别架构设计与实战
人工智能