今天尝试了一下kaggle,从最简单的训练题开始做机器学习的项目。

训练题有三个,我选择了第一个“泰坦尼克之灾”进行尝试。

“泰坦尼克之灾”背景是大家所熟悉的那个Jack and Rose的故事。豪华游艇要沉了,大家都惊慌逃生,可是救生艇数量有限。副船长发话了“Lady and Kid First!”,所以获救与否非随机,而是与一些因素相关的。

训练和测试的数据是乘客的一些信息以及获救情况,需要根据这些数据来预测其他乘客的存活情况。

这应该是一个二分类问题,也即Logistic Regresstion所能处理的范围。

大致浏览了一下数据,乘客的信息主要由这些:

  • PassengerId => 乘客ID
  • Pclass => 乘客等级(1/2/3等舱位)
  • Name => 乘客姓名
  • Sex => 性别
  • Age => 年龄
  • SibSp => 堂兄弟/妹个数
  • Parch => 父母与小孩个数
  • Ticket => 船票信息
  • Fare => 票价
  • Cabin => 客舱
  • Embarked => 登船港口

提供的信息较多,刚开始觉得无所适从,记得Andrew NG老师说过,做机器学习的时候不要一上来就试图完美,先做一个基本的模型跑起来,有了结果之后再去优化这个模型或者做一个新的模型。

依据看电影得来的经验和数据

  • 乘客的ID只是一个递增的数字,与结果没有太大的关联,所以直接舍
  • 乘客的舱位等级肯定会影响存活与否
  • “Lady and Kid First!”也会涉及到性别对存活的影响,年龄也是如此;
  • 堂兄弟/妹的个数似乎无法判别对最终结果的影响,暂时留存;
  • 父母与孩子个数也是如此;船票信息主要是票号,对最终结果无太大影响,舍去;
  • 票价和客舱信息应该是相关的,每个舱的价格不同,所以只取其一即可,票价作为一个连续的变量更好处理,但是查看数据后发现票价信息缺失了很大一部分,故此最初的模型暂不考虑影响;
  • 登船港口无法判别,因此也暂时保留。

需要注意的是,在代码中,所有的数据都是以数字来保存的,但是给定的数据中很多都是字符串,比如性别,因此我们需要对数据进行一定的预处理,此模型中所使用的是pandas.get_dummies()函数。同时也要丢弃上面所说的无关数据。

之后使用sklearn的线性回归模型,设定好loss喂入数据即可。

预测时需要注意的是,测试数据也和训练数据一样需要进行相应的预处理。

以下是这个初步模型的最终代码。

代码点此下载

纸上得来终觉浅,之前跟着Andrew老师学习了那么多理论知识,但是到实战的时候感觉不知道怎么用,还是需要多做项目来提升自己的能力。


2018-03-02更新:

经过以下的优化:

  • 去除登船港口特征
  • 加入客舱特征,因客舱数据缺失并且类目太多,所以将客舱数据重新分成两类,“有客舱数据”和“无客舱数据”

正确率提高了1个百分点,排名从之前的8000+前进到了6001

排名
排名

代码点此下载

参考文献

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾