Kaggle泰坦尼克号 预测生还者
某站刘老师的课,想必各位deeplearner都听过,我也是刚接触不久小白一枚,想着试试课后作业加深一下理解,有很多不足之处,多多指正!
这一讲链接给大家挂上PyTorch深度学习实践——刘二大人
首先模块导入,这不用说了,懂得都懂......
import numpy as np
import pandas as pd
from torch.utils.data import Dataset
import torch
from torch.utils.data import DataLoader
准备数据集我认为是挺关键的一步,数据处理的好,在kaggle上分数会高很多,数据集这一块我也是整的挺懵的,本文的数据集'Sex'经过了提前处理,将male和female用了0和1替换。需要调整后的数据集可以私信
#第一步 准备数据集
class TitanicDataset(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]
self.x_data=torch.from_numpy(np.array(data[features]))
self.y_data=torch.from_numpy(np.array(data["Survived"]))
def __getitem__(self, index):
return self.x_data[index],self.y_data[index]
def __len__(self):
return self.len
dataset=TitanicDataset('./train.csv')#这里数据文件我都是放在和程序同一个文件夹下面
train_loader=DataLoader(dataset=dataset,batch_size=16,shuffle=True)#batch_size可改变
模型定义这一块和老师讲的没什么不同,注意输入维度的变化就行,Model中的predict模块主要用来测试预测。
#第二步 定义模型
class Model(torch.nn.Module):
def __init__(self):
super(Model,self).__init__()
self.linear1=torch.nn.Linear(6,3)
self.linear2=torch.nn.Linear(3,1)
self.sigmoid=torch.nn.Sigmoid()
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():
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
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')
optimizer = torch.optim.SGD(model.parameters(), lr=0.005)
接下来就是训练我们的模型,这里注意输入和标签改为float类型,具体为什么我也没搞清,但是去掉后发现系统提示要float类型,其他没什么大改变
#第三步 训练模型
if __name__=='__main__':
for epoch in range(100):
for i,data in enumerate(train_loader,0):
inputs,labels=data
inputs=inputs.float()
labels=labels.float()
y_pred=model(inputs)
y_pred=y_pred.squeeze(-1)#压缩维度至一维
loss=criterion(y_pred,labels)
print(epoch,i,loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
测试这部分,也是参考了一下其他博主的做法,也是需要处理一下数据的,最后将预测的结果csv文件提交到kaggle即可
#第四步 测试
test_data=pd.read_csv('./test.csv')
test_data=test_data.fillna(test_data['Age'].mean())
features = ["Pclass", 'Sex',"Age", "SibSp", "Parch", "Fare"]
test=torch.from_numpy(np.array(test_data[features]))
y=model.predict(test.float())
out=pd.DataFrame({'PassengerId':test_data.PassengerId,'Survived':y})
print(out['Survived'].sum())#存活人数
out.to_csv('my_first_predict.csv',index=False)#csv文件会保存在相应的文件夹里
通过提交发现分数0.622,kaggle里下载数据里的gender_submission,我试着提交了0.7655还是有所进步,主要还是数据集的处理问题,还是不够好,当然模型也可以进一步优化,对于初学者我认为还是可以接受的