本文章是根据Titanic中的train数据集构建对survival情况的预测模型,并对test数据集进行预测,本次使用的模型实现工具为python,其中使用到的python工具为pandas、numpy、matplotlib、sklearn。下面开始具体说明实验内容:
一、查看数据的基本信息
代码:
结果:
这12列数据中,有9列数据是完整的,即有891条记录;
Embarked这一列,数据缺失了两条;
Age这一列,差了一百多条数据;
Cabin这一列,数据很不完整,只有204条记录。
二、处理缺失值
(1)如果数据集很多,但有很少的缺失值,可以删掉带缺失值的行;
(2)如果该属性相对学习来说不是很重要,可以对缺失值赋均值或者众数。比如在哪儿上船Embarked这一属性(共有三个上船地点),缺失俩值,可以用众数赋值
(3)对于标称属性,可以赋一个代表缺失的值,比如‘U0’。因为缺失本身也可能代表着一些隐含信息。比如船舱号Cabin这一属性,缺失可能代表并没有船舱。
(4)使用回归 随机森林等模型来预测缺失属性的值。因为Age在该数据集里是一个相当重要的特征(先对Age进行分析即可得知),所以保证一定的缺失值填充准确率是非常重要的,对结果也会产生较大影响。一般情况下,会使用数据完整的条目作为模型的训练集,以此来预测缺失值。对于当前的这个数据,可以使用随机森林来预测也可以使用线性回归预测。这里使用随机森林预测模型,选取数据集中的数值属性作为特征(因为sklearn的模型只能处理数值属性,所以这里先仅选取数值特征,但在实际的应用中需要将非数值特征转换为数值特征)
代码:
结果:
三、乘客属性分布
代码:
结果图:
从上面的几个图可以看出:
遇难人数占一大半;
三等舱位的乘客最多,按照出行常识,应该是三等舱座位多价格便宜;
多数人从S口上船,是不是可以推测:S口就是普通登船口,C口和Q口是不是专用登船口
三等舱人数 > 二等舱人数 > 一等舱人数,头等舱乘客年龄 > 二等舱乘客年龄 > 三等舱乘客年龄,这是因为年龄越大,财富越多,越倾向于买高档的舱位。
二、三等舱多数人的年龄介于20~40之间,并且二三等舱人数比较多,这可以和平均年龄29.7岁相呼应。
四、舱位等级与生存的关联
代码:
结果图:
头等舱的获救机会 > 二等舱的获救机会 > 三等舱的获救机会。说明越有钱,买的舱位越好,获救概率越高
五、舱位等级结合性别的获救情况
代码:
结果图:
明显可以看出,坐头等舱的女性获救的概率接近100%,坐二三等舱的女生获救概率接近50%。男性无论是坐头等舱还是二三等舱,获救概率都比较低,尤其是坐二三等舱获救的概率更低。
六、数据预处理
(一)Cabin和Age预处理
Cabin可以按上面的分析,先处理成Yes和No两种类型
Age根据已有的值,拟合一下数据,补充上。用scikit-learn中的随机森林方法(RandomForest)来拟合一下缺失的年龄数据
代码:
结果:
(二)特征因子化
因为逻辑回归建模时,需要输入的特征都是数值型特征,我们通常会先对类目型的特征因子化。
Cabin处理成Cabin_Yes和Cabin_No,Embarked处理成Embarked_C、Embarked_Q和Embarked_S,Sex处理成Sex_Male和Sex_Female,Pclass处理成Pclass_1、Pclass_2和Pclass_3;
接着用concat函数将这些新的属性连接到dataframe中,再通过drop函数将原先的Pclass、Name、Sex、Ticket、Cabin和Embarked这六个属性从dataframe中去掉。
代码:
结果:
(三)数据标准化
Age和Fare这两个属性的数据取值范围太大,这将对逻辑回归的收敛造成不利的影响。处理方法是将其标准化。
标准化就是将特征数据的分布调整成标准正太分布,也叫高斯分布,也就是使得数据的均值为0,方差为1。
代码:
结果:
七、建立模型
把需要的特征字段取出来,转成numpy格式,使用scikit-learn中的LogisticRegression来生成模型
代码:
结果:
八、对测试数据集进行预处理
测试集预处理的过程和训练集的预处理过程一样
代码:
结果:
九、预测
代码:
结果:
十、模型系数分析
把模型系数和特征关联起来
代码:
结果:
十一、交叉验证
交叉验证通常是把train.csv分成两部分,一部分用于训练模型,另外一部分数据用来预测结果,然后将预测结果与实际结果比较,这样就能知道模型的预测效果。
用scikit-learn的cross_validation来完成这个工作,看一下我们的预测准确度:
把测试集分成五份,来相互验证,结果: