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

目录

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()