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