机器学习入门之逻辑回归:泰坦尼克号生存预测
前言 小白的机器学习的入门必备项目 科赛网上有着这个项目详细的讲解 对小白十分友好
1.了解项目概况
RMS泰坦尼克号沉没是历史上最臭名昭着的沉船之一。1912年4月15日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在2224名乘客和机组人员中造成1502人死亡。这场耸人听闻的悲剧震惊了国际社会,并为船舶制定了更好的安全规定。
造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。尽管幸存下沉有一些运气因素,但有些人比其他人更容易生存,例如妇女,儿童和上流社会。
在这个挑战中,我们要求您完成对哪些人可能存活的分析。特别是,我们要求您运用机器学习工具来预测哪些乘客幸免于悲剧。
kaggle官网可以下载数据和提交结果
Titanic: Machine Learning from Disasterwww.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按下列称呼替换一下
查看一下数据
加入重新选择特征后 交叉验证数据结果较稳定 以上就是我的初入机器学习 希望对大家有点帮助
学习资料点击这里