首页 > 其他分享 >pytorch深度学习实践(刘二大人)课后作业——Titanic数据集分析预测

pytorch深度学习实践(刘二大人)课后作业——Titanic数据集分析预测

时间:2024-08-11 14:24:45浏览次数:16  
标签:True self torch Titanic pytorch train 课后 test data

一、课后作业

构造分类器对Titanic数据集进行预测

1.数据集预处理

(1)数据集下载与分析

下载地址:https://www.kaggle.com/c/titanic/data

导入必要的包,并查看训练集、测试集前五行数据

import torch
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns   #依赖库numpy、pandas、matlibplot、scipy都要安装

from torch.utils.data import Dataset   
from torch.utils.data import DataLoader 

train_data = pd.read_csv('D:\\test\\pytorch\\datasets\\titanic\\train.csv')
test_data = pd.read_csv('D:\\test\\pytorch\\datasets\\titanic\\test.csv')

print(train_data.head(5))
print(test_data.head(5))

在jupyter中运行结果如下:(此图展示的数据为训练集数据,测试集大家可以自行查看)

可以看到数据共有12列,具体包括:

:乘客编号(不重要)

Survived:生还情况,1为生还0则相反,也是需要预测的值;测试集数据不包含此列

Pclass:票务等级,分1、2、3级

Name:乘客姓名(不重要)

Sex:乘客性别,male、female,可考虑转换成0,1让模型进行学习

Age:年龄

SibSp:兄弟姐妹及配偶的数量

Parch:父母及子女的数量

Ticket:船票号码(不重要)

Fare:票价

Cabin:船舱

Embarked:登船港 C = Cherbourg, Q = Queenstown, S = Southampton

初步筛选出上述加粗字体特征数据进行后续的模型训练,舍弃passengerID、Name、Ticket

(2)数据清洗和整理

查看数据信息:

train_data.info()
test_data.info()

可以看到训练集数据量为891,其中Age、Cabin、Embarked特征有缺失。Age缺失较少,可以考虑采取中位数填充;Cabin缺失较多,舍弃此数据;Embarked缺失只有2个,可以考虑众数填充;

测试集数据量为418,其中Age、Cabin、Fare特征有缺失。处理方式与训练集相同,Age、Fare考虑采用中位数填充,Cabin舍弃。

#特征选择
y = train_data['Survived']  #真值
train_data.drop('Survived', axis=1, inplace=True) #.drop()用于删除指定行/列;
train_data.drop('PassengerId', axis=1, inplace=True) #axis=1表示列操作,不指定则默认为行操作
train_data.drop('Name', axis=1, inplace=True) #inplace=True表示就地修改,不设置则返回一个新的DataFrame
train_data.drop('Ticket', axis=1, inplace=True)
train_data.drop('Cabin', axis=1, inplace=True)

ID = test_data['PassengerId'] #记录测试集ID用于后续生成结果csv文件
test_data.drop('PassengerId', axis=1, inplace=True)
test_data.drop('Name', axis=1, inplace=True)
test_data.drop('Ticket', axis=1, inplace=True)
test_data.drop('Cabin', axis=1, inplace=True)

#缺失值填充
train_data['Age'].fillna(train_data.Age.median(), inplace=True)
mode_Embarked = train_data['Embarked'].mode()[0]#计算Embark列的众数,因为可能包含多个众数,因此用[0]索引获取第一个
train_data['Embarked'].fillna(mode_Embarked, inplace=True) 
test_data['Age'].fillna(test_data.Age.median(), inplace=True)
test_data['Fare'].fillna(test_data.Fare.median(), inplace=True)

#分类型数据转化
d1={'male':0,'female':1}
d2={'S':1,'C':2,'Q':3} 
train_data['Sex']=train_data['Sex'].map(d1)
train_data['Embarked']=train_data['Embarked'].map(d2)
test_data['Sex']=test_data['Sex'].map(d1)
test_data['Embarked']=test_data['Embarked'].map(d2)

(3)Dataset&Dataloader

#Dataset and DataLoader
class train_TitanicDataset(Dataset):  
    def __init__(self):
        self.x_data = torch.from_numpy(x_train)
        self.y_data = torch.from_numpy(y_train).unsqueeze(1)  #得到的是一维张量,记得转成矩阵(列向量)
        self.len = x_train.shape[0]

    def __getitem__(self, index):   
        return self.x_data[index], self.y_data[index]

    def __len__(self):  
        return self.len

train_dataset = train_TitanicDataset()
train_loader = DataLoader(dataset=train_dataset,
                          batch_size=32,
                          shuffle=True,
                          num_workers=0)  

2.模型搭建及训练

搭了个五层的神经网络,代码和课上的差不多

更新:画损失的时候取了个平均值,现在的损失曲线不会那么曲折了嘿嘿,整体趋势也更明显一点

#Model
class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(7, 16)
        self.linear2 = torch.nn.Linear(16, 8)
        self.linear3 = torch.nn.Linear(8, 6)
        self.linear4 = torch.nn.Linear(6, 4)
        self.linear5 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid()

    def forward(self, x):
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        x = self.sigmoid(self.linear4(x))
        x = self.sigmoid(self.linear5(x))
        return x 

model = Model()
criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma=0.7)  #学习率衰减,每过20epoch变为原来的0.7倍

epoch_list = []
loss_list = []


#Training
for epoch in range(100):
    running_loss = 0.0
    count = 0
    for i, data in enumerate(train_loader, 0):  #0表示index从0开始读入,train_loader拿出的(x,y)元组放在data里,自动转tensor
        #1.prepare data
        inputs, labels = data  
        inputs = inputs.to(torch.float32)
        #2.forward
        y_pred = model(inputs)
        loss = criterion(y_pred.float(), labels.float())
        #3.backward
        optimizer.zero_grad()
        loss.backward()
        #4.update
        optimizer.step()
        running_loss += loss.item()
        count += 1
    running_loss = running_loss/count
    scheduler.step()
    epoch_list.append(epoch)
    loss_list.append(running_loss)
    # print(epoch, loss.item())

plt.plot(epoch_list, loss_list)
plt.grid(True)
plt.xlabel('Epoch')
plt.ylabel('loss')
plt.savefig('train_loss')
plt.show()

3.预测及储存结果

#Predict
x_test = torch.from_numpy(x_test)
y_test_pred = model(x_test.to(torch.float32))
pred = y_test_pred.detach().numpy()
pred = pred.astype(int)  #官方csv文件是int格式,转化一下,否则提交得分是0
for i in range(len(pred)):
    if pred[i] > 0.5:
        pred[i] = 1
    else:
        pred[i] = 0
#print(pred)

#存储预测结果
df = pd.DataFrame(columns=['PassengerId','Survived'])
df['PassengerId']=ID
df['Survived']=pred
df.to_csv('pred_result.csv', index=False)

 loss曲线:

官网得分:

 我这个作业效果还不是很好,分数也不高,但是我只想完整地把作业完成一遍,不想继续做了hhhhhh大家可以自行搭建模型调整超参数,刷刷分~

数据预处理部分参考:Python数据分析案例08——预测泰坦尼克号乘员的生存(机器学习全流程)_泰坦尼克号生存预测python-CSDN博客

标签:True,self,torch,Titanic,pytorch,train,课后,test,data
From: https://blog.csdn.net/weixin_51944652/article/details/141023865

相关文章

  • 25版王道数据结构课后习题详细分析 第三章栈、队列和数组 3.2 队列 选择题部分
    一、单项选择题————————————————————————————————————————解析:栈和队列的逻辑结构都是线性结构,都可以采用顺序存储或链式存储,C显然也错误。只有D才是栈和队列的本质区别,限定表中插入和删除操作位置的不同。正确答案:D—————......
  • pytorch深度学习基础 4 (马变斑马)
    今天我们来介绍一个神奇的网络,生成对抗网络GAN,这个模型纯属当做娱乐,供大家消遣娱乐,在这里我只展示一下GAN模型有趣的一个小功能,先来给大家介绍一下GAN模型吧。GAN的基本原理GAN(GenerativeAdversarialNetworks,生成对抗网络)是一种深度学习模型,由两个主要的部分组成:生成器和......
  • 06.磁盘管理课后习题
    06.磁盘管理课后习题1.如何查看/etc/目录大小2.如何查看磁盘使用分区情况3.如何查看innode使用情况4.如何查看磁盘block使用情况1.使用“lsblk”命令查看块设备信息,包括磁盘分区情况和磁盘使用情况。2.使用“df”命令查看文件系统的磁盘空间使用情况。3.使用“du”......
  • 推理延迟:解决PyTorch模型Inference阶段的RuntimeError ⏳⚡
    推理延迟:解决PyTorch模型Inference阶段的RuntimeError⏳⚡推理延迟:解决PyTorch模型Inference阶段的RuntimeError⏳⚡摘要引言正文内容什么是RuntimeError?⏳RuntimeError的常见成因⚠️数据格式不一致内存不足模型参数不匹配解决RuntimeError的方法......
  • 零基础学习人工智能—Python—Pytorch学习(三)
    前言这篇文章主要两个内容。一,把上一篇关于requires_grad的内容补充一下。二,介绍一下线性回归。关闭张量计算关闭张量计算。这个相对简单,阅读下面代码即可。print("============关闭require_grad==============")x=torch.randn(3,requires_grad=True)print(x)x.requir......
  • Pytorch深度学习入门基础(三):python 加载数据初认识
    目录 一、 导入二、数据集中数据和label的组成形式三、Dataset读入数据四、Dataset类代码实战4.1创建函数4.2  设置初始化函数4.3读取每一个图片4.4设置获取数据长度函数4.5创建实例4.5.1单个图片数据集4.5.2 多个图片数据集    现在来开......
  • 25版王道数据结构课后习题详细分析 第三章栈、队列和数组 3.1 栈 选择题部分
    一、单项选择题————————————————————————————————————————解析:栈和队列的逻辑结构都是相同的,都属于线性结构,只是它们对数据的运算不同。正确答案:B————————————————————————————————————......
  • 浙大数据结构慕课课后题(03-树2 List Leaves)
    题目要求:给定一棵树,您应该按照从上到下、从左到右的顺序列出所有叶子。输入规格: 每个输入文件都包含一个测试用例。对于每种情况,第一行都给出一个正整数N(<=10),这是树中节点的总数--因此节点的编号从0到N-1.然后N行紧随其后,每行对应一个节点,并给出节点的左右子节点......
  • Pytorch函数基础:鸢尾花数据集分类
    博客框架引言简要介绍机器学习和分类问题介绍鸢尾花数据集简述PyTorch的作用及其在深度学习中的重要性环境准备安装所需的库(PyTorch、NumPy、Matplotlib、Pandas等)创建并激活Python虚拟环境(可选)数据加载与预处理从CSV文件读取数据数据转换和标准化将数据转换为Py......
  • 04 课后题
    04课后题解释以下命令mkdir/root/dir1在root下创建一个目录dir1touch/root/dir1/file{1..10}在/root/dir1/file创建file1—10一共十个文件find/root/dir1-typef-name"file5"使用find命令在/root/dir1目录下名字叫file5的文件find/root/dir1!-name......