加载数据集_B站:刘二大人kaggle Titanic作业

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.准确率 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值