一、项目思路
这是我在kaggle做的第二个项目,之前做一个是Digit Recognition,感兴趣的同学可以看这里。本文涉及到的python环境和需要的库在上一篇文章中已经详细说过了,这里不再赘述。在Digit Recognition由于feature只有一种特征类型,就是int类型的灰度值,所以不需要什么feature engineering。而Titanic项目最关键的部分可能就在于feature engineering方面,它对于最后的精度有着直接的影响。由于不是计算机视觉方面的问题,可以预期神经网络的分类效果估计不是很理想,我们的思路是采用多种机器学习分类器来分别预测,最后将几个分类器的结果ensemble(我采用的是bagging的方法)。
首先有必要描述一下这个项目的数据结构,项目的地址在这里。train.csv中是带有label的数据,这里的label是"Survived"变量(0代表身亡,1代表幸存)。features包括变量:
1、pclassint类型,旅客的社会等级(分3个等级,1代表高级,2代表中级,3代表低级)
2、namestring类型,旅客的姓名
3、sexstring类型,分为“male”和“female”两类
4、ageint类型,旅客的年龄
5、sibspint类型,旅客海外的旁系亲友
6、parchint类型,旅客海外的直系亲友
7、ticketstring,int混合类型,旅客的船票序列号
8、farefloat类型,旅客的船票价格
9、cabinstring,int混合类型,旅客的房号
10、embarkedstring类型,旅客上船的港口(共三个值“C”,“Q”,“S”)
容易看出,由于feature的类型各不相同,经过feature engineering之后的features必定一些适合于成为标称的类型(pclass,sex等),而有些更适合于成为标量类型(age,fare等),所以features会变成标称类型和标量类型的混合类型。由于随机森林是处理标称类型和标量类型混合features表现最好的方法之一,我们考虑用随机森林作为我们的一个基准classifier。
另外我还构建了其余四个分类器,它们分别只看见一部分的features,这样有两个好处:第一、有一些分类器只在某种类型的features上表现良好,所以我们只feed它们那些features。例如GBDT(Gradient Boosting Decision Tree)适合用标量类型的features,因为它对于稀疏的特征分类效果不好,所以只给GBDT标量类型的features或者把标称类型的features转化为标量类型(进一步转化为二值类型)。第二、这样相当于每个分类器只“记住”了一部分的features这样带来的bias可以trade off掉分类器自身的high variance,我们在构建分类器时都尽量多选参数提高variance,最后通过投票的方式ensemble,这种类似bagging的方法把候选的分类器组合起来。
总的来说我构建了五个分类器,它们以及对应接收的训练features为:
1、Random Forest Classifier(随机森林分类器):接收二值和标量类型
2、Gradient Boosting Decision Tree Classifier(梯度提升树分类器):接收标量类型
3、Support Vector Machine Classifier(支持向量机分类器):接收二值类型
</