[toc]
背景
经典的泰坦尼克是电影史的一个丰碑,展示了人性的刻画,剧情围绕主线展开,层层递进,让人目不暇接,
这件几个世纪前的事件激发了大家对于推断兴趣。
项目给出了乘客多个纬度的信息,尽可能的包括乘客的全部特征,需要对特征进行抽取,并选取合适的算法模型来实现对部分数据的预测。这个项目考察了对于机器学习中的多个二元分类预测模型的掌握。对个人能力是极大的提高。
通常逻辑问题都可以归纳出大致的解决思路:
1.对问题进行分解,通过观察初步得到问题的主线可能在哪几个区域。
2.数据预处理,将已经整合到一张表内的多维度数据进行补全,去重等操作,目的是将数据表补充完整,在面对少量数据缺失时可以采用均值填充,过于多的数据空缺采用舍弃或以特定字符填充的方式补全。
下一步对数据分类进行细分,将采用字符分类的数据使用one-hot编码或手动编码的方式,拆分类型。
3.数据处理后需要对数据进行特征抽取,这是重点,决定了模型的正确率。
4.从python中调用sklearn中的机器学习模型,使用已经处理好的(除去标签)数据和标签数据进行训练。
5.对输出结果进行评估
开始数据处理
屏幕快照 2019-11-19 上午9.34.52.png 屏幕快照 2019-11-19 上午9.41.52.png通过查看数据集的信息可知,原始数据共12个特征,除去id号和标签(survived)则有10项,其中cabin和age存在空缺项,age以平均值填充,cabin缺失较多,可以合理假设是否可能拥有船舱的乘客社会地位较高,存活率较高。
屏幕快照 2019-11-19 下午3.19.53.png
首先展示一下上船的年龄分布,可以得知邮轮上主要是20到40岁的人口,
再深入了解一下泰坦尼克号的训练集描述:
- count行可以得到survived项存在缺失,但因为是训练标签项所以是正常的。
- mean行可以得到各数值的平均项,例如平均乘客29岁,平均票价33美元,平均仓位为2.2,
- 因为幸存者项数据只有891项,存在405项缺失,所以该项平均值暂时没有意义。
- std行为方差数据,没有同类对比数据不太好得出分析,
- 其中std方差和50%的中位数对比可以发现票价fare项出现右偏分布
使用describe()描述性统计全体给定数据集,
定类/定序特征分析
cat_list = ['Pclass','Name','Sex','SibSp','Embarked','Parch','Ticket','Cabin']
for n,i in enumerate(cat_list):
Cabin_cat_num = df[i].value_counts().index.shape[0]
print('{0}. {1}特征的类型数量是: {2}'.format(n+1,i,Cabin_cat_num))
上述代码可以快速提取特征信息,我之前是直接手动value_count进行查看,数据量大的情况下麻烦。
分析之后可以得出在特征点特异性少的数据项为港口,性别,亲缘关系等几项,后续可以先对这几项进行可视化,方便确定模型的输入特征。
剩下的只有名字有价值,船舱位缺失项较多,如果不能得出有位和没有位的生存差距,该数据应该舍弃。
分析年龄与存活的关系
年龄与存活.png
可以明显观察到有年龄大于80的老年人存活
20到25岁大量青年死亡
船上人群众数为25岁左右
没有自保能力的幼儿活下来较多
说明在沉船时刻,船上采取了老幼优先的策略,整体仍有秩序
可以证明年龄对存活率有关联性
年龄与船舱密度图分析可以看到其中存活者的年龄在16岁前出现异常分布,可以合理推测有特定的约束条件使该分布反常,另外一等舱的频率与其他舱席逐渐接近,说明一等舱存活率较高,推测社会等级影响生存率。
票价与生存.png
观察幸存者和遇难者的比例关系可以发现,存活者在各自票价区间的比例接近,需要进一步分析数据,判断票价是否对生存率有影响。
仓位存活率对比.png
age项存在部分缺失,直接平均填充效果不好,因为存活率与阶级、性别、年龄相关,所以对age项要采取根据各票的阶级分布来填充。
分类图.png
分类填充,采用各票仓的中位数填充
不同的港口可能存在不同的年龄层次和社会地位,因此对港口与生存的关联度也应该作图分析。
港口生存率从票的等级来看,高等票存活率较高。
从登船港口来看,女性在s港和q港的存活率普遍高于男性,c港男性生存率高于女性。
性别与船舱类型对比
可以看在男性的统计中票等级决定获救率,不同港口获救率会不同。
在女性统计中,仍可以观察得到生存率服从票等级,不同港口的女性生存率有差别。
对名称也做了分析,因为,欧洲人姓名中会包含头衔,头衔和社会地位,家族势力有关,所以该项会影响生存几率。
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(max_depth = 10)
model.fit(train_X,train_Y)
model.score(test_X,test_Y)
对支持向量机,k近邻,朴素贝叶斯,sgd分类器,随机森林,决策树几个机器学习模型实践了一下,发现在不深入调参的情况下,决策树能达到0.81的评分,提交到kaggle平台
屏幕快照 2019-11-21 上午9.43.44.png
目前排在前55%,我还会继续优化,目标前10%,fight!
网友评论