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()
看完點個關注唄!!(總結不易)