机器学习入门之逻辑回归:泰坦尼克号生存预测

前言 小白的机器学习的入门必备项目 科赛网上有着这个项目详细的讲解 对小白十分友好

1.了解项目概况

RMS泰坦尼克号沉没是历史上最臭名昭着的沉船之一。1912年4月15日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在2224名乘客和机组人员中造成1502人死亡。这场耸人听闻的悲剧震惊了国际社会,并为船舶制定了更好的安全规定。

造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。尽管幸存下沉有一些运气因素,但有些人比其他人更容易生存,例如妇女,儿童和上流社会。

在这个挑战中,我们要求您完成对哪些人可能存活的分析。特别是,我们要求您运用机器学习工具来预测哪些乘客幸免于悲剧。

kaggle官网可以下载数据和提交结果

Titanic: Machine Learning from Disaster​www.kaggle.com

数据的各项特征的意义

2.初探数据

先看看我们的数据,长什么样吧。在Data下我们train.csv和test.csv两个文件,分别存着官方给的训练和测试数据。

pandas是常用的python数据处理包,把csv文件读入成dataframe各式,我们在ipython notebook中,看到data_train如下所示:

先查看一下测试数据的基本信息 数据类型 有无缺失值

其中Age和Cabin缺失值较多 后面需要处理

PassengerId => 乘客ID

Pclass => 乘客等级(1/2/3等舱位)

Name => 乘客姓名

Sex => 性别

Age => 年龄

SibSp => 堂兄弟/妹个数

Parch => 父母与小孩个数

Ticket => 船票信息

Fare => 票价

Cabin => 客舱

Embarked => 登船港口

查看有无异常值

3.数据的初步认识 查看特征对生存率之间的关系

我们在图上可以看出来,被救的人300多点,不到半数;3等舱乘客灰常多;遇难和获救的人年龄似乎跨度都很广;3个不同的舱年龄总体趋势似乎也一致,2/3等舱乘客20岁多点的人最多。

我们可能会有一些想法了:

不同舱位/乘客等级可能和财富/地位有关系,最后获救概率可能会不一样

年龄对获救概率也一定是有影响的,毕竟前面说了,副船长还说『小孩和女士先走』呢 图中无法看清离散程度

和登船港口是不是有关系呢?也许登船港口不同,人的出身地位不同?

4.数据的预处理

这里Age的缺失值 我用平均值代替 虽然不科学 但是方便 先把模型做出来再说 后续学会更好的方法可以回来改

对于Cabin的缺失值处理 由于缺失值较多 把它分为有无缺失值两个分类

Embarked就只有两个缺失值 用值最多的S代替

因为逻辑回归建模时,需要输入的特征都是数值型特征,我们通常会先对类目型的特征因子化。 什么叫做因子化呢?举个例子:

以Cabin为例,原本一个属性维度,因为其取值可以是[‘yes’,’no’],而将其平展开为’Cabin_yes’,’Cabin_no’两个属性 可以想象 6 = 3*2 ,数学中的因子的概念

原本Cabin取值为yes的,在此处的”Cabin_yes”下取值为1,在”Cabin_no”下取值为0 原本Cabin取值为no的,在此处的”Cabin_yes”下取值为0,在”Cabin_no”下取值为1 我们使用pandas的”get_dummies”来完成这个工作,并拼接在原来的”data_train”之上,如下所示。

接着还需要将Age和Fare的数值标准化 各属性值之间scale差距太大,将对收敛速度影响很大

这样一来数据就处理完了

最后提取我们需要的特征

5.建立回归模型

这里我选择的是逻辑回归 比较适合入门

y是标签 x是数据的特征

将test的数据也按上面处理一下 之所以没有合在一起处理 是担心对于Age的平均值是否有影响

得到如下结果

做到这里也算有个样子了 接下来就是要对自己的模型 和选取的特征做一下评估了 也不知道好不好 准不准确 可以选用交叉验证的方法 先看看选取特征的相关性 可以考虑 删除一下影响较低的 同时在没有选取的特征上面再做下挖掘 有没有忽视的

我们先看看那些权重绝对值非常大的feature,在我们的模型上:

Sex属性,如果是female会极大提高最后获救的概率,而male会很大程度拉低这个概率。

Pclass属性,1等舱乘客最后获救的概率会上升,而乘客等级为3会极大地拉低这个概率。

有Cabin值会很大程度拉升最后获救概率(这里似乎能看到了一点端倪,事实上从最上面的有无Cabin记录的Survived分布图上看出,即使有Cabin记录的乘客也有一部分遇难了,估计这个属性上我们挖掘还不够)

Age是一个负相关,意味着在我们的模型里,年龄越小,越有获救的优先权(还得回原数据看看这个是否合理)

有一个登船港口S会很大程度拉低获救的概率,另外俩港口压根就没啥作用(这个实际上非常奇怪,因为我们从之前的统计图上并没有看到S港口的获救率非常低,所以也许可以考虑把登船港口这个feature去掉试试)。

船票Fare有小幅度的正相关(并不意味着这个feature作用不大,有可能是我们细化的程度还不够,举个例子,说不定我们得对它离散化,再分至各个乘客等级上?)

6.交叉验证

我们通常情况下,这么做cross validation:把train.csv分成两部分,一部分用于训练我们需要的模型,另外一部分数据上看我们预测算法的效果。

我们用scikit-learn的cross_validation来帮我们完成小数据集上的这个工作。

先简单看看cross validation情况下的打分

似乎浮动还是比较大的 那让我们改变一下特征看看有没有影响 这里我将Name中的身份title取出来 作为一个特征 毕竟有身份的人应该会有有待 同时单独增加一列12岁一下的 作为Child

后面考虑到家庭人数对于生存率的影响 我将sibsp 和 Parch合起来 由于自己也在Family所以需要加1

将title按下列称呼替换一下

查看一下数据

加入重新选择特征后 交叉验证数据结果较稳定 以上就是我的初入机器学习 希望对大家有点帮助

学习资料点击这里

你可能感兴趣的:(机器学习入门之逻辑回归:泰坦尼克号生存预测)