具体详细可参考该篇博文:七、加载数据集

①准备数据集

以泰坦尼克号数据集(titanic.csv)为例

下载完解压,将解压后得到的压缩包放到指定的路径下,我这边放到了我的jupyter里面了

matlab泰坦尼克号数据挖掘 泰坦尼克号数据集_数据集


matlab泰坦尼克号数据挖掘 泰坦尼克号数据集_python_02

里面有一些文本信息,仅使用数字信息,由于age有点缺失,故也不能用
输入:PassengerId、Pclass、SibSp、Parch、Fare
输出:Survived;1存活,0嘎了

使用Pandas对数据进行处理一下,具体可参考博文:Pandas(数据分析处理库)—讲解

最终的数据集形式只能存在数字,不能存在其他信息

也可以手动删除,把Survived移到最后一列

最终形式如下:PassengerId、Pclass、SibSp、Parch、Fare、Survived

matlab泰坦尼克号数据挖掘 泰坦尼克号数据集_pandas_03


matlab泰坦尼克号数据挖掘 泰坦尼克号数据集_matlab泰坦尼克号数据挖掘_04

②加载数据集

前5列是x,最后一列是y

class ttnDataset(Dataset):
    def __init__(self,filepath):
        data = np.loadtxt(filepath,delimiter=",",dtype=np.float32)
        self.len = data.shape[0]
        self.x = torch.from_numpy(data[:,:-1])
        self.y = torch.from_numpy(data[:,[-1]])
        
    def __getitem__(self,index):
        return self.x[index] ,self.y[index]
    
    def __len__(self):
        return self.len

dataset = ttnDataset("new_data.csv")
train_loader = DataLoader(dataset = dataset,batch_size = 32,shuffle=True)

loss_all = []  #绘图使用
epoch_all = [] #绘图使用

测试

dataset.x.shape
"""
torch.Size([891, 5])
"""
dataset.y.shape
"""
torch.Size([891, 1])
"""
dataset.len
"""
891
"""

③模型构建

就还是用线性层构建吧,显示5维数据转为3维,再转为1维,最后通过sigmoid函数输出,[0,1]通过概率来确定是0还是1

class yModel(torch.nn.Module):
    def __init__(self):
        super(yModel,self).__init__()
        
        self.linear_1 = torch.nn.Linear(5,3)
        self.linear_2 = torch.nn.Linear(3,1)
        self.sigmoid = torch.nn.Sigmoid()
        
    def forward(self,x):
        x = self.sigmoid(self.linear_1(x))
        x = self.sigmoid(self.linear_2(x))
        return x

model = yModel()

④损失函数和优化器

损失函数选择MSELoss
优化器选择Adam
官网很多,不局限于这两个啊
size_average要不要bais,也就那个b,负责微调的

lossf = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.Adam(model.parameters(),lr=0.0001)

⑤训练

for i data in enumerate(train_loader,0):train_loader这个DataLoader中进行枚举,0表示从DataLoader下标为0处开始,train_loader返回两个值,索引和数据,其中数据包括两类,x和y,x五个,y一个
i接收索引、data接收数据
x,y = data,x和y分别接收data中的五个x和一个y
这里对所有的数据样本训练100次,epoch设为100
一共891个数据样本,train_loader中设置batch_size=32,故iterations=891/32=27.84375,28组
28个batch,每个batch包含32个样本,训练100次

for epoch in range(100):
    for i, data in enumerate(train_loader,0):
        x,y = data
        y_hat = model(x)
        loss = lossf(y_hat,y)
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    
    print(epoch,loss.item())
    epoch_all.append(epoch)
    loss_all.append(loss)

⑥绘图

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

matlab泰坦尼克号数据挖掘 泰坦尼克号数据集_matlab泰坦尼克号数据挖掘_05


感觉效果不咋地,主要是模型架构不咋样,训练次数也比较少,损失函数没降下来

⑦完整代码

import pandas as pd
import numpy as np
import torch
from torch.utils.data import Dataset 
from torch.utils.data import DataLoader 
import matplotlib.pylab as plt

class ttnDataset(Dataset):
    def __init__(self,filepath):
        data = np.loadtxt(filepath,delimiter=",",dtype=np.float32)
        self.len = data.shape[0]
        self.x = torch.from_numpy(data[:,:-1])
        self.y = torch.from_numpy(data[:,[-1]])
        
    def __getitem__(self,index):
        return self.x[index] ,self.y[index]
    
    def __len__(self):
        return self.len

dataset = ttnDataset("new_data.csv")
train_loader = DataLoader(dataset = dataset,batch_size = 32,shuffle=True)

loss_all = []  #绘图使用
epoch_all = [] #绘图使用 

class yModel(torch.nn.Module):
    def __init__(self):
        super(yModel,self).__init__()
        
        self.linear_1 = torch.nn.Linear(5,3)
        self.linear_2 = torch.nn.Linear(3,1)
        self.sigmoid = torch.nn.Sigmoid()
        
    def forward(self,x):
        x = self.sigmoid(self.linear_1(x))
        x = self.sigmoid(self.linear_2(x))
        return x

model = yModel()

lossf = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.Adam(model.parameters(),lr=0.0001)

for epoch in range(100):
    for i, data in enumerate(train_loader,0):
        x,y = data
        y_hat = model(x)
        loss = lossf(y_hat,y)
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    
    print(epoch,loss.item())
    epoch_all.append(epoch)
    loss_all.append(loss)
    
    
plt.plot(epoch_all,loss_all)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.show()

matlab泰坦尼克号数据挖掘 泰坦尼克号数据集_开发语言_06

⑧测试

本来数据集得划分测试集和训练集还有验证集,但是为例学习没必要那样,主要是学习思路和方法,验证模型还是从训练集里面抽一个得了,但正儿八经的测试得使用一组模型未见过的数据进行测试才行

就你啦,天命之子

matlab泰坦尼克号数据挖掘 泰坦尼克号数据集_matlab泰坦尼克号数据挖掘_07

test = torch.Tensor([[810,1,1,0,53.1]])
print("predect:",model(test).item()) 
"""
predect: 0.38363194465637207
"""

对应的y是1,但是预测的结果不太理想,没事啊问题不大,模型太拉跨,epoch也太少,很正常。主要是学习思路和方法。