前言
第一次尝试在kaggle上找机器学习(ML)项目练手,Titanic问题是官方的入门项目,在此做一个记录。
kaggle官网:https://www.kaggle.com/
加入竞赛
进入官网之后左边那一栏的compete表示ML竞赛项目,点击某项竞赛后会有项目说明(Overview),数据集(Data)以及其他人对此项目的一些讨论(Notebooks、Discussion),点击join compete即可加入此竞赛。接下来要做的事就是使用数据集完成Overview中说明的任务,并将模型在测试集上运行的结果提交上去看自己模型的排名。
在本篇文章中,以kaggle官方的入门竞赛titanic为例走一遍整个流程,实际上kaggle自己的入门指引就很详细了。
我使用的ML框架是pytorch,pytorch的教程可以参考:
一. 处理数据集
数据集说明
此项Titanic竞赛的目标就是给定乘客的一些信息,需要预测出乘客是否在最终的船难事故中生存下来,即预测Survived为0还是1。从kagggle上下载下来的数据集有三个:test.csv是测试使用的数据集;train.csv是训练使用的数据集,里面带有标签;而gender_submission.csv是上传范例,也就是需要按照这里面的格式将你训练好的模型得到的结果上传到kaggle上以评分。
打开train.csv,查看里面的数据格式,依照官方给的说明确定每列代表的含义:
- PassengerId:乘客ID,是乘客的唯一标示符
- Survived:乘客是否存活,相当于标签
- Pclass:乘客坐的是几等座,分为1,2,3三个等级
- Name:乘客的名字
- Sex:乘客的性别,分为female/male
- Age:乘客的年龄,需要注意的是这列数据中有缺失值
- SibSp:乘客的兄弟/配偶在船上的数量
- Parch:乘客的父母/子女在船上的数量
- Ticket:乘客船票的编号
- Fare:乘客船票的价格
- Cabin:乘客的房间号
- Embarked:乘客的出发港,分为C、Q、S三个
特征工程
针对这一类数据,不像图像那样直接将图片做一些预处理再读取为矩阵放入神经网络就完事。这类数据需要进行特征建模,得到适合放入神经网络的数据——一般来说就是一个数组。
首先需要对特征进行一定的筛选,有一些特征我认为是对分类没有帮助或者不好处理的,比如乘客名字、船票编号、房间号,于是直接舍弃这几项特征,直接对剩下的特征进行建模。我的建模思路如下:
- Pclass用2位二进制数表示,1等=01,2等=10,3等=11。
- Sex用2位二进制数表示,male=10,female=01。
- Age用3位二进制数表示,其范围为0-80岁,并且还有一些缺失数据,因此划分依据为:缺失数据=000,[0,10)=001,[10,20)=010,[20,30)=011,[30,40)=100,[40,50)=101,[50,70)=110,[70,…)=111。
- Sibsp用2位二进制表示,划分依据为:0=00,1=01,(1,5)=10,[5,…)=11。
- Parch用2位二进制表示,划分依据为:0=00;1=01;(1,4)=10;[4,…)=11。
- Fare用2位二进制表示,划分依据为:[0,10)=00,[10,30)=01,[30,100)=10,[100,…)=11。
- Embarked用2位二进制表示,划分依据为:缺失数据=00,C=01,S=10,Q=11。
这样,将信息编码为15个二进制位,联合成数组方便输入网络。
创建自己的pytorch数据集类
实际上像这样的几百条数据是没有必要创建数据集类的,直接读就好了。但是为了规范代码并增强可扩展性,还是使用pytorch的数据集类来读取数据,也顺便练练手。
数据集类也就是Pytorch中的Dataset,创建自己的数据集类时需要继承自此类,并且必须重写其中的__getitem__(self,index)与__len__(self)。基本的模板如下:
from torch.utils.data.dataset import Dataset
class