六、多维特征的输入

课后作业

①数据集准备

以糖尿病数据集(diabetes.csv)为例,数据集免费下载,仅供学习使用。
下载完解压,将解压后得到的压缩包放到指定的路径下,我这边放到了我的jupyter里面了
在这里插入图片描述
在这里插入图片描述
数据集是一个以逗号分割的数据集,有九个特征,八个输入,一个输出
八个维度的输入分别是不同的患者参数,输出表示一年后是否患糖尿病

②加载数据集

np.loadtxt("diabetes.csv.gz",delimiter=',',dtype=np.float32)加载指定位置的数据集diabetes.csv.gz,以进行分割,数据的类型为np.float32
一般的Nvidia显卡仅支持float32的数据类型,较为贵的GPU像Tesla显卡才支持double类型,不过float32够用了
torch.from_numpy(data[:,:-1])将数据集data中的[:,:-1]所有行,[0,-1)除了最后一列所有数据取出来,以矩阵的形式返回
torch.from_numpy(data[:,[-1]])数据集data中的所有行,[-1]表示仅最后一列,且以向量形式返回

import numpy as np
import torch 
import matplotlib.pylab as plt #绘图

# 加载数据集
data = np.loadtxt("diabetes.csv.gz",delimiter=',',dtype=np.float32)
x = torch.from_numpy(data[:,:-1])
y = torch.from_numpy(data[:,[-1]])

epoch_all = [] #存epoch方便绘图
loss_all = []  #存每次的loss方便绘图

x为输入数据,八维度;y为输出结果,0或1

③模型架构搭建

通过线性层,先将输入数据从8维度降到6维度,再通过一个非线性激活函数sigmoid;
以此类推,6降4;4降2;2降1;最终得到一个1维的结果;

class y_model (torch.nn.Module):
    def __init__(self):
        super(y_model,self).__init__()
        
        self.linear_1 = torch.nn.Linear(8,6)
        self.linear_2 = torch.nn.Linear(6,4)
        self.linear_3 = torch.nn.Linear(4,2)
        self.linear_4 = torch.nn.Linear(2,1)
        self.sigmoid = torch.nn.Sigmoid()
        
    def forward(self,x):
        x = self.sigmoid(self.linear_1(x))
        x = self.sigmoid(self.linear_2(x))
        x = self.sigmoid(self.linear_3(x))
        x = self.sigmoid(self.linear_4(x))
        return x
    
ymodel = y_model()

④损失函数和优化器

损失函数选择MSELoss
优化器选择SGD
官网很多,不局限于这两个啊

size_average要不要bais,也就那个b,负责微调的

lossf = torch.nn.MSELoss(size_average=False)             #损失函数
optimzer = torch.optim.SGD(ymodel.parameters(),lr=0.001)  #优化器
#不同优化器的选择,只需要把SGD改成其他的优化器即可

⑤训练

for epoch in range(1000):
    y_hat = ymodel(x)
    loss = lossf(y_hat ,y)
    print(epoch,loss.item())
    epoch_all.append(epoch)
    loss_all.append(loss)
    
    optimzer.zero_grad()
    loss.backward()
    optimzer.step()

⑥绘图

plt.plot(epoch_all,loss_all)
plt.ylabel("loss")
plt.xlabel("epoch")
plt.show()

在这里插入图片描述

⑦完整代码

import numpy as np
import torch 
import matplotlib.pylab as plt

# 加载数据集
data = np.loadtxt("diabetes.csv.gz",delimiter=',',dtype=np.float32)
x = torch.from_numpy(data[:,:-1])
y = torch.from_numpy(data[:,[-1]])

epoch_all = []
loss_all = []

class y_model (torch.nn.Module):
    def __init__(self):
        super(y_model,self).__init__()
        
        self.linear_1 = torch.nn.Linear(8,6)
        self.linear_2 = torch.nn.Linear(6,4)
        self.linear_3 = torch.nn.Linear(4,2)
        self.linear_4 = torch.nn.Linear(2,1)
        self.sigmoid = torch.nn.Sigmoid()
        
    def forward(self,x):
        x = self.sigmoid(self.linear_1(x))
        x = self.sigmoid(self.linear_2(x))
        x = self.sigmoid(self.linear_3(x))
        x = self.sigmoid(self.linear_4(x))
        return x
    
ymodel = y_model()

lossf = torch.nn.MSELoss(size_average=False)             #损失函数
optimzer = torch.optim.SGD(ymodel.parameters(),lr=0.001)  #优化器
#不同优化器的选择,只需要把SGD改成其他的优化器即可

for epoch in range(1000):
    y_hat = ymodel(x)
    loss = lossf(y_hat ,y)
    print(epoch,loss.item())
    epoch_all.append(epoch)
    loss_all.append(loss)
    
    optimzer.zero_grad()
    loss.backward()
    optimzer.step()
    

plt.plot(epoch_all,loss_all)
plt.ylabel("loss")
plt.xlabel("epoch")
plt.show()    

在这里插入图片描述

⑧测试

这我哪知道如何测试啊,随便从数据集中巴拉一个吧
在这里插入图片描述
-0.411765,0.165829,0.213115,0,0,-0.23696,-0.894962,-0.7,1

test = torch.Tensor([[-0.411765,0.165829,0.213115,0,0,-0.23696,-0.894962,-0.7]])
print("predect:",ymodel(test).item()) 
"""
predect: 0.6534900069236755
"""

效果还行,最起码大于0.5,也就是偏向于1呗。

猜你喜欢

转载自blog.csdn.net/qq_41264055/article/details/129851921