1.初始化数据集
class DiabetesDataset(Dataset): # 继承Dataset
def __init__(self, filepath): # 构造函数,初始化
features = ["Pclass","Sex", "Age", "SibSp", "Parch", "Fare"] #
data = pd.read_csv(filepath)
data = data.fillna(data['Age'].mean()) # 年龄这一特征有缺失值,通过求均值,并填充到NAN
self.len = data.shape[0]#len等于行数
gender_mapping = {'male': 0, 'female': 1} # 定义性别映射
data['Sex'] = data['Sex'].map(gender_mapping)
self.x_data = torch.from_numpy(np.array(pd.get_dummies(data[features]),dtype=np.float32))
self.y_data = torch.from_numpy(np.array(data['Survived']))
print(self.x_data.shape)
def __getitem__(self, index): # 可以通过下标操作,索引拿数据
return self.x_data[index], self.y_data[index]
def __len__(self): # 获取数据集里的数据条数
return self.len
dataset1 = DiabetesDataset('train.csv')
train_loader1 = DataLoader(dataset=dataset1, batch_size=32, shuffle=True,
num_workers=0) # 这个参数表示用于数据加载的子进程数。通过使用多个子进程加载数据,可以加速数据加载过程
2.创建模型
class Model(torch.nn.Module): # 继承自Module,torch.nn.Module是PyTorch中所有神经网络模型的基类
def __init__(self): # 构造函数
super(Model, self).__init__() # super函数来调用父类Module的构造函数,第一个参数是目前类的名称,第二个参数是self
self.linear1 = torch.nn.Linear(6, 3)
self.linear2 = torch.nn.Linear(3, 1)
self.relu = torch.nn.ReLU() # Sigmoid函数将线性层的输出转化为0到1之间的概率值。在这个模型中,我们使用Sigmoid作为模型的激活函数。
# 定义了一个线性层,该线性层是torch.nn.Linear类的实例,它接受一个输入和一个输出,这里输入和输出都设为1。
# Linear层是神经网络中的一个基本组件,它将输入数据与权重相乘,然后添加一个偏差 bias = True就是需要偏置差,为False就是不需要偏置差
self.sigmoid = torch.nn.Sigmoid()
def forward(self, x):
x = self.relu(self.linear1(x))
x = self.sigmoid(self.linear2(x))
return x
def predict(self, x):
with torch.no_grad(): # 在模型评估阶段,我们通常不需要计算梯度。
x = self.relu(self.linear1(x))
x = self.sigmoid(self.linear2(x))
y = []
# 根据二分法原理,划分y的值
for i in x:
if i > 0.5:
y.append(1)
else:
y.append(0)
return y
model = Model()
criterion = torch.nn.BCELoss(reduction='mean') # 二分类交叉熵损失
# 参数size_average设置为False意味着在计算损失时不是对每一个样本的损失进行平均,而是对每一个样本的损失进行求和
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 创建了一个随机梯度下降(SGD)优化器。这个优化器是用于更新模型的参数。这里,我们传入了模型的参数以及学习率(learning rate)为0.01。
3.进行训练
if __name__ == '__main__':#不加这句话会出错
for epoch in range(100):
loss_list = []
i_list = []
for i, data in enumerate(train_loader1,0): # 函数调用后会返回一个可迭代的对象,每个元素是一个二元组 (index, element),其中 index 是元素在迭代对象中的索引,element 是迭代对象中的元素值。
inputs, labels = data
inputs = inputs.float()
labels = labels.float()
y_pred = model(inputs)
y_pred = y_pred.squeeze(-1)## 将维度压缩至1维。
loss = criterion(y_pred, labels)
print(epoch, i, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
4.进行测试
test_data = pd.read_csv('test.csv')
gender_mapping = {'male': 0, 'female': 1} # 定义性别映射
test_data['Sex'] = test_data['Sex'].map(gender_mapping)
feature = ["Pclass","Sex", "Age", "SibSp", "Parch", "Fare"]
test = torch.from_numpy(np.array(pd.get_dummies(test_data[feature])))
y = model.predict(test.float())
# 输出预测结果
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': y})
output.to_csv('my_predict.csv', index=False)
5.完整代码
import numpy as np
import torch # 导入PyTorch库,提供了在深度学习中高效处理张量和构建模型的功能。
from matplotlib import pyplot as plt
from torch.utils.data import Dataset # 从torch.utils.data模块中导入Dataset类,用于定义自定义数据集,抽象类,不能实例
from torch.utils.data import DataLoader # 从torch.utils.data模块中导入DataLoader类,用于加载数据集。
import pandas as pd
class DiabetesDataset(Dataset): # 继承Dataset
def __init__(self, filepath): # 构造函数,初始化
features = ["Pclass","Sex", "Age", "SibSp", "Parch", "Fare"] #
data = pd.read_csv(filepath)
data = data.fillna(data['Age'].mean()) # 年龄这一特征有缺失值,通过求均值,并填充到NAN
self.len = data.shape[0]#len等于行数
gender_mapping = {'male': 0, 'female': 1} # 定义性别映射
data['Sex'] = data['Sex'].map(gender_mapping)
self.x_data = torch.from_numpy(np.array(pd.get_dummies(data[features]),dtype=np.float32))
self.y_data = torch.from_numpy(np.array(data['Survived']))
print(self.x_data.shape)
def __getitem__(self, index): # 可以通过下标操作,索引拿数据
return self.x_data[index], self.y_data[index]
def __len__(self): # 获取数据集里的数据条数
return self.len
dataset1 = DiabetesDataset('train.csv')
train_loader1 = DataLoader(dataset=dataset1, batch_size=32, shuffle=True,
num_workers=0) # 这个参数表示用于数据加载的子进程数。通过使用多个子进程加载数据,可以加速数据加载过程
class Model(torch.nn.Module): # 继承自Module,torch.nn.Module是PyTorch中所有神经网络模型的基类
def __init__(self): # 构造函数
super(Model, self).__init__() # super函数来调用父类Module的构造函数,第一个参数是目前类的名称,第二个参数是self
self.linear1 = torch.nn.Linear(6, 3)
self.linear2 = torch.nn.Linear(3, 1)
self.relu = torch.nn.ReLU() # Sigmoid函数将线性层的输出转化为0到1之间的概率值。在这个模型中,我们使用Sigmoid作为模型的激活函数。
# 定义了一个线性层,该线性层是torch.nn.Linear类的实例,它接受一个输入和一个输出,这里输入和输出都设为1。
# Linear层是神经网络中的一个基本组件,它将输入数据与权重相乘,然后添加一个偏差 bias = True就是需要偏置差,为False就是不需要偏置差
self.sigmoid = torch.nn.Sigmoid()
def forward(self, x):
x = self.relu(self.linear1(x))
x = self.sigmoid(self.linear2(x))
return x
def predict(self, x):
with torch.no_grad(): # 在模型评估阶段,我们通常不需要计算梯度。
x = self.relu(self.linear1(x))
x = self.sigmoid(self.linear2(x))
y = []
# 根据二分法原理,划分y的值
for i in x:
if i > 0.5:
y.append(1)
else:
y.append(0)
return y
model = Model()
criterion = torch.nn.BCELoss(reduction='mean') # 二分类交叉熵损失
# 参数size_average设置为False意味着在计算损失时不是对每一个样本的损失进行平均,而是对每一个样本的损失进行求和
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 创建了一个随机梯度下降(SGD)优化器。这个优化器是用于更新模型的参数。这里,我们传入了模型的参数以及学习率(learning rate)为0.01。
if __name__ == '__main__':#不加这句话会出错
for epoch in range(100):
loss_list = []
i_list = []
for i, data in enumerate(train_loader1,0): # 函数调用后会返回一个可迭代的对象,每个元素是一个二元组 (index, element),其中 index 是元素在迭代对象中的索引,element 是迭代对象中的元素值。
inputs, labels = data
inputs = inputs.float()
labels = labels.float()
y_pred = model(inputs)
y_pred = y_pred.squeeze(-1)## 将维度压缩至1维。
loss = criterion(y_pred, labels)
loss_list.append(loss.item())
i_list.append(i)
print(epoch, i, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
test_data = pd.read_csv('test.csv')
gender_mapping = {'male': 0, 'female': 1} # 定义性别映射
test_data['Sex'] = test_data['Sex'].map(gender_mapping)
feature = ["Pclass","Sex", "Age", "SibSp", "Parch", "Fare"]
test = torch.from_numpy(np.array(pd.get_dummies(test_data[feature])))
y = model.predict(test.float())
# 输出预测结果
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': y})
output.to_csv('my_predict.csv', index=False)
6.准确率