今天尝试了一下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