在kaggle 上下载泰坦尼克号数据,完成数据挖掘部分的作业。泰坦尼克号是许多数据科学和机器学习的新手比较喜欢选择的案例。
数据说明:
泰坦尼克号的沉没是历史上最臭名昭着的沉船之一。 1912年4月15日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在2224名乘客和机组人员中造成1502人死亡。这场耸人听闻的悲剧震惊了国际社会,并导致了更好的船舶安全规定。
造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。尽管幸存下沉有一些运气因素,但有些人比其他人更容易生存,比如女人,孩子和上流社会。
在这个任务中,我们对原始数据进行分析,看看到底哪些人更容易存活。然后用机器学习的工具来预测哪些乘客幸免于难。
数据导入:
显示前两行数据:
一共有12个特征,其中5个特征是字符串。
用describe函数显示数据基本信息:
可以看出与ID相比,年龄字段只有714个值,是有缺失的。
缺失只可以删除,插值,这里选择用平均值填充年龄:
查看性别类型,发现只有两类male、female,用0和1替代:
查看Embarked的情况,结果有S、C、Q、nan四类,说明有缺失值,查看数据,发现大多数都是S值,于是用S值填充缺失值。最后将字符串数值化。
先选取'Pclass','Sex','Age','SibSp','Parch','Fare','Embarked'七个特征进行建模,用python库sklearn进行预测,选取交叉检验:
线性模型:
模型预测结果,准确率为26%,效果不好,比随便猜还差,随便猜也有50%的准确率。
逻辑回归:
准确率为78%,勉强过的去。
随机森林:
随机森林模型准确率也为78%
改变随机森林的参数:
改变随机森林模型的参数后,模型的预测的准确率上升为82%,有明显的提升,说明在数据挖掘建模过程中,模型参数设置很重要。
在之前的建模过程中,利用现有的参数进行分析。在接下来,试着去尝试用新的特征向量来建立模型。
将原来的特征:SibSp、Parch合并为FamilySize,增加一个特征名字长度nameLength,好像在欧美,名字长度和社会地位有一定关系。
增加一个名字称呼的变量Title,查看数据中的Title:
后面8个比较少,考虑了一下,将'Lady', 'Countess','Capt', 'Col','Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'用rare取代。在将其数字化"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5。
完成结果:
将票价分为四类:
然后将票价用0、1、2、3取代,便于建模:
同样的操作,将年龄分类,在用数字代替:
处理结果:
重新选取数据建模:
去掉特征:passengerid,name,ticket,cabin,sibsp,categoricalage,categoricalfare七个特征。得到结果:
数据可视化:
特征相关性:
从Pearson Correlation图可以知道,选择的特征没有强烈相关。 从将这些特征提供到学习模型中的观点来看,这是很好的,因为这意味着我们的训练集中没有太多冗余或多余的数据。
分析选取特征对存活率的重要程度:
结果如下:
从图中可以看出,Pclass ,Sex ,Fare ,NameLength ,Title五个特征比较重要,所以建模选取这五个特征。
开始建模,定义训练集与测试集:
SVC模型:
结果准确率为78%。
线性SVC模型:
结果准确率为75%。
随机森林:
结果准确率为82%。
逻辑回归:
结果准确率为75%。
K邻近:
结果准确率为76%.
XGBoost 模型:
结果准确率为77%。
从分析结果来看,在理论上优秀的算法不一定在一个实际的案例中由于其他算法,在同样的数据预处理情况下,简单的算法可能表现更高的准确率,在本例中,进行新的特征创建和新特征融合的情况下,预测结果并没有得到明显的改善,这一点没有想明白。
当然,更好一点的可能是组合不同的分类器,并赋予不同分类器一定权重,让我们的分类器更“聪明”,比如构建人工神经网络,可能使得学习的结果更优异,当然这也需要更大的样本。
对于本例来说,研究泰坦尼克号中哪些人更有利存活,一者这是一个过时问题,二者是这个研究本身没有多大的实际意义,更多的是用来练习学到的知识。