栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

PyTorch深度学习(B站刘二大爷)第八讲作业——Kaggle网站泰坦尼克号Titanic

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PyTorch深度学习(B站刘二大爷)第八讲作业——Kaggle网站泰坦尼克号Titanic

kaggle没有notebook的文件夹系统让我很不满意,决定以后把自己练习的过程都搬上csdn。

目录

1.引入库

2.准备数据集

3.定义模型

4.调用优化器和损失函数

5.run 训练集

6.用训练集的参数run 测试集


1.引入库
import numpy as np
import pandas as pd
import torch 
from torch.utils.data import Dataset #抽象类 被继承
from torch.utils.data import DataLoader #加载数据

2.准备数据集
class TitanicDataset(Dataset):
    
    def __init__(self,filepath):
        xy = pd.read_csv(filepath) 
        self.len = xy.shape[0] # xy.shape()可以得到xy的行列,[0]取行,[1]取列
        #选取需要的特征
        feature = ["Pclass", "Sex", "SibSp", "Parch", "Fare"]
        
        # xy[feature]的类型是DataFrame,先进行独热表示,然后转成array,最后转成tensor用于进行矩阵计算。
        self.x_data = torch.from_numpy(np.array(pd.get_dummies(xy[feature]))) 
        self.y_data = torch.from_numpy(np.array(xy["Survived"]))
    
    def __getitem__(self,index): #魔法函数,支持 dataset[index]
        return self.x_data[index],self.y_data[index]
    
    def __len__(self): #魔法函数 支持len()
        return self.len

# 实例化自定义类,并传入数据地址
dataset = TitanicDataset('../input/titanic/train.csv')

# num_workers是否要进行多线程服务,num_worker=2 就是2个进程并行运行
# 采用Mini-Batch的训练方法
train_loader = DataLoader(dataset = dataset,
                         batch_size = 32,
                         shuffle = True,
                         num_workers=2)#双线程

3.定义模型
class Model(torch.nn.Module): # 设置要从torch神经网络模块中要继承的模型函数
    
    def __init__(self):
        super(Model,self).__init__() # 对继承于torch.nn的父模块类进行初始化
        self.linear1 = torch.nn.Linear(6,3)#输入6 输出3;五个特征转化为了6维,因为get_dummies将性别这一个特征用两个维度来表示,即男性[1,0],女性[0,1]
        self.linear2 = torch.nn.Linear(3,1)
        self.sigmoid = torch.nn.Sigmoid() #调用nn下的模块 作为运算模块
        
    #正向传播    
    def forward(self,x): 
        x= self.sigmoid(self.linear1(x))
        x= self.sigmoid(self.linear2(x))
        return x

    #预测函数 用在测试集
    def predict(self,x):
         with torch.no_grad(): #上下文管理器,被该语句 wrap 起来的部分将不会track 梯度。
            x=self.sigmoid(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()
        

4.调用优化器和损失函数
criterion = torch.nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)

5.run 训练集
# 防止windows系统报错
if __name__ == '__main__':
    # 采用Mini-Batch的方法训练要采用多层嵌套循环
    # 所有数据都跑100遍
    for epoch in range(100):
        # data从train_loader中取出数据(取出的是一个元组数据):(x,y)
        # enumerate可以获得当前是第几次迭代,内部迭代每一次跑一个Mini-Batch
        for i, data in enumerate(train_loader, 0):
            #准备数据 inputs获取到data中的x的值,labels获取到data中的y值
            inputs, labels = data
            inputs = inputs.float()
            labels = labels.float()
            #正向传播
            y_pred = model(inputs)
            y_pred = y_pred.squeeze(-1) ## 前向输出结果是[[12],[34],[35],[23],[11]]这种,需要将这个二维矩阵转换成一行[12,34,35,23,11]
            loss = criterion(y_pred, labels)
            print(epoch, i, loss.item())
            #反向传播
            optimizer.zero_grad()
            loss.backward()
            #更新
            optimizer.step()

6.用训练集的参数run 测试集
#测试集数据准备
test_data = pd.read_csv('../input/titanic/test.csv') #读取数据
feature = ["Pclass", "Sex", "SibSp", "Parch", "Fare"] #和训练集保持特征的一致性 选取相同的项
test = torch.from_numpy(np.array(pd.get_dummies(test_data[feature]))) #与训练集保持一致

# 进行预测,并将结果以CSV格式保存
y = model.predict(test.float()) #浮点数
outputs = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': y})
outputs.to_csv('predict_titantic', index=False)  # index=False 代表不保存索引

#观察一下结果
outputs.head()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938206.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号