当前位置:   article > 正文

Pytorch学习(八)——kaggle泰坦尼克数据集_titanic dataset

titanic dataset

数据集来源:Titanic - Machine Learning from Disaster | Kaggle

参考学习:kaggle泰坦尼克号数据集——数据分析全流程 - 知乎 (zhihu.com)

目录

1.数据处理

1.1数据集导入查看数据量和缺失情况

1.2数据缺失处理

1.3选择需要考虑的属性

1.4数据类型的转换

2.模型训练

2.1代码

2.2结果

3.感悟


1.数据处理

1.1数据集导入查看数据量和缺失情况

train_data:
0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
test_data:
 0   PassengerId  418 non-null    int64  
 1   Pclass       418 non-null    int64  
 2   Name         418 non-null    object 
 3   Sex          418 non-null    object 
 4   Age          332 non-null    float64
 5   SibSp        418 non-null    int64  
 6   Parch        418 non-null    int64  
 7   Ticket       418 non-null    object 
 8   Fare         417 non-null    float64
 9   Cabin        91 non-null     object 
 10  Embarked     418 non-null    object 

1.2数据缺失处理

可以看出Age、Cabin、Fare和Embarked数据存在缺失。

Age:与存活与否有关系,需要考虑到,所以选择以平均值的方法将空缺的数据填补,也可以采用中位数、均值或者一些算法进行填补;

Cabin:船舱属性,缺失较为严重,所以不考虑这条因素;

Embarked:登船港口属性,仅仅缺失部分,所以直接将缺失的删除

Fare:票价属性,缺失部分,删除缺失部分

代码为:

  1. #年龄以平均值填补缺失部分
  2. data_train.loc[(data_train.Age.isnull()),'Age'] = data_train.Age.mean()
  3. data_test.loc[(data_test.Age.isnull()),'Age'] = data_test.Age.mean()
  4. #训练集登录港口缺失的样本因为较少,直接删除样本
  5. data_train = data_train.drop(data_train[data_train.Embarked.isnull()].index)
  6. #测试集Fare缺失样本为一个,同删除样本
  7. data_test = data_test.drop(data_test[data_test.Fare.isnull()].index)

1.3选择需要考虑的属性

因为Cabin缺失较为严重所以不考虑,Ticket也不考虑,kaggle泰坦尼克号数据集——数据分析全流程 - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/342552186所以删除以下属性PassengerId、Name 、Ticket、 Cabin

代码为:

  1. data_train = data_train.drop(labels=['PassengerId','Name','Ticket','Cabin'],axis = 1)
  2. data_test = data_test.drop(labels=['PassengerId','Name','Ticket','Cabin'],axis = 1)

1.4数据类型的转换

数据中Sex和Embarked属性中数据类型为object,将数据转换方便后续模型训练

Sex中male改为1,female改为0

Embarked中S改为0,C改为1,Q改为2

代码:

  1. #将Sex 和Embarked 数据类型转换
  2. data_train['Sex'] = data_train.Sex.map(lambda x: 1 if x =='male' else 0)
  3. data_test['Sex'] = data_test.Sex.map(lambda x: 1 if x =='male' else 0)
  4. data_train['Embarked'] = data_train.Embarked.map(lambda x: 0 if x == 'S' else 1 if x == 'C' else 2 )
  5. data_test['Embarked'] = data_test.Embarked.map(lambda x: 0 if x == 'S' else 1 if x == 'C' else 2 )

最后方便处理,将训练集中存活属性放到最后一列,导出新的表格保存

  1. data_train.insert(7,'Survived',data_train.pop('Survived'))
  2. outputpath_train = './data/train_after.csv'
  3. data_train.to_csv(outputpath_train,sep=',',index=False,header=False)
  4. outputpath_test = './data/test_after.csv'
  5. data_test.to_csv(outputpath_test,sep=',',index=False,header=False)
  6. #不保存索引、列表名

2.模型训练

代码与上一篇文章里基本一致Pytorch学习(八)——数据集加载_土名什么的比较好的博客-CSDN博客

2.1代码

  1. import numpy as np
  2. import torch
  3. from torch.utils.data import Dataset
  4. from torch.utils.data import DataLoader
  5. import matplotlib.pyplot as plt
  6. class TitanicDataset(Dataset):
  7. def __init__(self, filepath):
  8. xy = np.loadtxt(filepath, delimiter = ',',dtype = np.float32)
  9. self.len = xy.shape[0]
  10. self.x_data = torch.from_numpy(xy[:,:-1])
  11. self.y_data = torch.from_numpy(xy[:,[-1]])
  12. def __getitem__(self, index):
  13. return self.x_data[index],self.y_data[index]
  14. def __len__(self):
  15. return self.len
  16. dataset = TitanicDataset('train_after.csv')
  17. train_loader = DataLoader(dataset = dataset, batch_size=32, shuffle=True, num_workers=0)
  18. class Model(torch.nn.Module):
  19. def __init__(self):
  20. super(Model,self).__init__()
  21. self.linear1 = torch.nn.Linear(7,4)
  22. self.linear2 = torch.nn.Linear(4,2)
  23. self.linear3 = torch.nn.Linear(2,1)
  24. self.activate = torch.nn.Sigmoid()
  25. def forward(self, x):
  26. x = self.activate(self.linear1(x))
  27. x = self.activate(self.linear2(x))
  28. x = self.activate(self.linear3(x))
  29. return x
  30. model = Model()
  31. criterion = torch.nn.BCELoss(reduction='mean')#返回loss均值
  32. optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)
  33. for epoch in range(100):
  34. for i,(inputs,labels) in enumerate(train_loader,0):
  35. y_pred = model(inputs)
  36. loss = criterion(y_pred,labels)
  37. print(epoch,i,loss.item())
  38. optimizer.zero_grad()
  39. loss.backward()
  40. optimizer.step()
  41. #预测
  42. xt = np.loadtxt('test_after.csv', delimiter = ',',dtype = np.float32)
  43. x_test = torch.from_numpy(xt[:,:])
  44. y_test = model(x_test)
  45. y = y_test.data.numpy()
  46. plt.plot(y)
  47. plt.grid()
  48. plt.show()

2.2结果

训练结果loss范围在0.56~0.71

预测结果是存活概率均不过0.5(

3.感悟

在处理数据时学习了很多处理方法及函数:df.loc、map函数、lambda函数等等,模型训练部分作为课后作业训练没有进行太多的优化处理,只是更加熟悉这一套流程:准备数据集—设计模型—构造loss、优化器—写训练周期

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/804807
推荐阅读
相关标签
  

闽ICP备14008679号