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)
4 圖表顯示數據
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()
View Code

 

看完點個關注唄!!(總結不易)
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM