Pytorch 实现简单线性回归
Pytorch 实现简单线性回归
问题描述:
使用 pytorch 实现一个简单的线性回归。
受教育年薪与收入数据集
单变量线性回归
单变量线性回归算法(比如,$x$ 代表学历,$f(x)$ 代表收入):
$f(x) = w*x + b $
我们使用 $f(x)$ 这个函数来映射输入特征和输出值。
目标:
预测函数 $f(x)$ 与真实值之间的整体误差最小。
损失函数:
使用均方差作为作为成本函数。
也就是预测值和真实值之间差的平方取均值。
成本函数与损失函数:
优化的目标( $y$ 代表实际的收入):
找到合适的 $w$ 和 $b$ ,使得 $(f(x) - y)^{2}$越小越好
注意:现在求解的是参数 $w$ 和 $b$。
过程
1 导入实验所需要的包
import torch
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from torch import nn
#解决内核挂掉
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
2 读取数据
data = pd.read_csv('dataset/Income1.csv')
print(type(data))
3 查看数据信息
data.info()
查看数据
data
查看数据类型
type(data.Education)
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 雅黑字体
plt.scatter(data.Education,data.Income)
plt.xlabel("受教育年限")
plt.ylabel("工资")
plt.show()
5 转换数据为 Tensor 类型
查看特征数据
data.Education
查看特征数据 index
data.Education.index
查看特征数据 value
data.Education.values
特征数据变换形状
data.Education.values.reshape(-1,1)
查看特征数据变换后的形状
data.Education.values.reshape(-1,1).shape
查看特征数据变换后的数据类型
type(data.Education.values.reshape(-1,1))
修改特征数据变换后的数据类型
X = data.Education.values.reshape(-1,1).astype(np.float32)
print(type(X))
X.shape
特征数据和标签转换为Tensor
X = torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32) ) #转换数据类型
Y = torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float32) ) #转换数据类型
6 定义模型
定义线性回归模型:
model = nn.Linear(1,1) #w@input+b 等价于model(input)
定义均方损失函数
loss_fn = nn.MSELoss() #定义均方损失函数
定义优化器
opt = torch.optim.SGD(model.parameters(),lr=0.00001)
7 模型训练
for epoch in range(200):
for x, y in zip(X,Y):
y_pred = model(x) #使用模型预测
loss = loss_fn(y,y_pred) #根据预测计算损失
opt.zero_grad() #进行梯度清零
loss.backward() #求解梯度
opt.step() #优化模型参数
8 输出权重和偏置
model.weight
model.bias
Tensor 类型数据带梯度转换为numpy需要先去梯度
type(model.weight.detach().numpy())
9 获取预测值 y_pred
model(X).data.numpy()
预测值类型
type(model(X).data.numpy())
预测值size
model(X).data.numpy().shape
10 绘制回归曲线
plt.scatter(data.Education,data.Income)
plt.plot(X.numpy(),model(X).data.numpy())
plt.xlabel("受教育年限")
plt.ylabel("工资")
plt.show()
完整代码:
import torch
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from torch import nn
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
data = pd.read_csv('dataset/Income1.csv')
print(type(data))
data.info()
data
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 雅黑字体
plt.scatter(data.Education,data.Income)
plt.xlabel("受教育年限")
plt.ylabel("工资")
plt.show()
X = torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32) ) #转换数据类型
Y = torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float32) ) #转换数据类型
model = nn.Linear(1,1) #w@input+b 等价于model(input)
loss_fn = nn.MSELoss() #定义均方损失函数
opt = torch.optim.SGD(model.parameters(),lr=0.00001)
for epoch in range(200):
for x, y in zip(X,Y):
y_pred = model(x) #使用模型预测
loss = loss_fn(y,y_pred) #根据预测计算损失
opt.zero_grad() #进行梯度清零
loss.backward() #求解梯度
opt.step() #优化模型参数
print(f'epoch {epoch + 1}, loss {loss.sum():f}')
model.weight
model.bias
type(model.weight.detach().numpy())
plt.scatter(data.Education,data.Income)
plt.plot(X.numpy(),model(X).data.numpy())
plt.xlabel("受教育年限")
plt.ylabel("工资")
plt.show()
看完点个关注呗!!(总结不易)
因上求缘,果上努力~~~~ 作者:图神经网络,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/15419088.html