多日学习,决定试试以前不敢搞的kaggle
下载了TiTanic数据集,入门尝试

首先

数据集是csv格式,所以引入了pandas的学习,之前偶尔有看到相关的代码,却一直没有上手写
今天就试了试,主要的操作就是读取,以及对行列数据的切割和合并
相关知识的参考链接https://blog.csdn.net/chenKFKevin/article/details/62049060
还有一个就是关于可以使用shape获取数据的行列数信息,其中有一个大坑就是

  1. df = df.iloc[0:2, [0, 2]]

这里的0:2相当于[0,2)前闭后开,2是不在范围之内的。这就导致了我的数据一直少了一行,提交一直不成功。

然后

对数据进行处理,对于性别源数据是male,female。修改为0,1等等

接着

建立神经网络,目前我比较熟悉的也就是线性层,于是就使用线性层加上ReLu

最后

写一个预测的接口,预测结果,写回test.csv

总结

下附代码和运行评定结果

  1. 在数据的导入处理上不熟悉
  2. 可以考虑把网络和激活函数等组件封装为Module,然后返回预测结果,既可以训练又可以预测,本次是散的,才单独写一个预测的接口
  3. 对于如何提高预测结果,考虑增加隐藏层的神经元数目,增厚线性层和Relu交杂的结构,取得了一定的进展,同时加大了epoch训练量
  4. 代码以及模型相关的接口不熟。代码基本是这边抄一点,那边抄一点

运行结果

image.png

三个运行error就是由于数据少了一行,幸幸苦苦训练半天成果还没有默认的女性全部存活的分数高。。
一开始是单纯的两层线性层,一层ReLU,256的隐藏层神经元,300epoch
然后把数据和代码迁移到了Colab上,配置如下附代码:3线性层,2ReLu层,2048隐藏神经元,同时调低了batch_size到8,原来是32。在本地验证在训练集上的表现是从81%左右的正确率到了83%。
image.png

image.png

  1. import pandas as pd
  2. import numpy as np
  3. from sklearn.preprocessing import MinMaxScaler
  4. import time
  5. import copy
  6. import torch.nn as nn
  7. import torch.nn.functional as F
  8. import torch.optim as optim
  9. import torch.nn.functional
  10. from torch.utils.data import Dataset, DataLoader
  11. from torchvision import transforms
  12. import warnings
  13. import torch
  14. USE_CUDA = torch.cuda.is_available()
  15. base_path="/content/"
  16. read_train=pd.read_csv(base_path+'train.csv')
  17. #print(read_train.shape[0])
  18. #print(read_train.shape[1])
  19. read_train
  20. train_data=read_train.iloc[0:read_train.shape[0],[2,4,5]]
  21. print(len(train_data))
  22. train_data['Age'] = train_data['Age'].fillna(train_data['Age'].mean())
  23. train_data['Sex'] = [1 if x == 'male' else 0 for x in train_data.Sex]
  24. train_label=read_train.iloc[:read_train.shape[0],[1]]
  25. train_data=torch.tensor(train_data[:read_train.shape[0]].values,dtype=torch.float)
  26. train_label=torch.tensor(train_label[:read_train.shape[0]].values,dtype=torch.float)
  27. if USE_CUDA:
  28. train_data =train_data.cuda()
  29. train_label = train_label.cuda()
  30. loss = torch.nn.MSELoss()
  31. feature_num=train_data.shape[1]
  32. print(feature_num)
  33. print(feature_num)
  34. def get_net(feature_num):
  35. net = nn.Sequential(
  36. nn.Linear(feature_num, 2048),
  37. nn.ReLU(),
  38. nn.Linear(2048, 2048),
  39. nn.ReLU(),
  40. nn.Linear(2048, 1),
  41. )
  42. if USE_CUDA:
  43. net=net.cuda()
  44. #net = nn.Linear(feature_num, 1)
  45. for param in net.parameters():
  46. nn.init.normal_(param, mean=0, std=0.01)
  47. return net
  48. def train(net, train_data, train_label,num_epochs, learning_rate, batch_size):
  49. train_ls=[]
  50. dataset = torch.utils.data.TensorDataset(train_data, train_label)
  51. train_iter = torch.utils.data.DataLoader(dataset, batch_size, shuffle=True)
  52. # 这里使用了Adam优化算法
  53. optimizer = torch.optim.Adam(params=net.parameters(), lr=learning_rate)
  54. net = net.float()
  55. for epoch in range(num_epochs):
  56. for X, y in train_iter:
  57. l = loss(net(X.float()), y.float())
  58. optimizer.zero_grad()
  59. l.backward()
  60. optimizer.step()
  61. train_ls.append(l.item())
  62. if epoch % 10 == 0:
  63. print("epoch ",str(epoch)," : ",l.item())
  64. return train_ls
  65. net=get_net(feature_num)
  66. num_epochs, lr, batch_size = 1000 , 0.0002, 8
  67. loss_list=train(net, train_data, train_label, num_epochs,lr, batch_size )
  68. m_loss=0
  69. for i in loss_list:
  70. m_loss+=i
  71. print(m_loss/num_epochs)
  72. pred=0
  73. with torch.no_grad():
  74. dataset = torch.utils.data.TensorDataset(train_data, train_label)
  75. train_iter = torch.utils.data.DataLoader(dataset, batch_size, shuffle=False)
  76. print(len(train_iter))
  77. for X, y in train_iter:
  78. result=net(X.float())
  79. for i in range(len(result)):
  80. if result[i] > 0.5:
  81. result[i]= 1
  82. else:
  83. result[i]=0
  84. for i in range(len(result)):
  85. if result[i]==y[i]:
  86. pred+=1
  87. print(pred/891)
  88. read_test=pd.read_csv(base_path+'test.csv')
  89. test_data=read_test.iloc[:read_test.shape[0],[1,3,4]]
  90. test_data['Age'] = test_data['Age'].fillna(test_data['Age'].mean())
  91. test_data['Sex'] = [1 if x == 'male' else 0 for x in test_data.Sex]
  92. length=test_data.shape[0]
  93. #print(length)
  94. test_data=torch.tensor(test_data[:length].values,dtype=torch.float)
  95. all_result=[]
  96. idx=0
  97. with torch.no_grad():
  98. #print(len(test_data))
  99. result_dataset = torch.utils.data.TensorDataset(test_data)
  100. result_dataloader=torch.utils.data.DataLoader(result_dataset,batch_size=32,shuffle=False)
  101. for X in result_dataloader:
  102. temp=X[0].cuda()
  103. result=net(temp.float())
  104. for i in range(len(result)):
  105. idx+=1
  106. if result[i] > 0.5:
  107. result[i]= 1
  108. all_result.append(1)
  109. else:
  110. result[i]=0
  111. all_result.append(0)
  112. #print(idx)
  113. #print(len(all_result))
  114. df_output = pd.DataFrame()
  115. aux = pd.read_csv(base_path+'test.csv')
  116. df_output['PassengerId'] = aux['PassengerId']
  117. #print(len(df_output['PassengerId']))
  118. df_output['Survived'] =all_result
  119. df_output[['PassengerId','Survived']].to_csv(base_path+'s1mple.csv', index=False)