Kaggle系列——Titanic 80%+精确度纪录

因为最近模型上线收益没有符合预期,一直都没有时间搞,而且感觉Titanic的数据量太少了,做起来没意思,暂且优化到0.8的precision,排名700+
这里写图片描述

  • 背景描述
    • 数据描述
    • 评估方式
  • 模型以及特征选择
    • 模型选择
    • 特征选择
    • 特征缺失
  • 模型调试
    • age特征的调优
    • 增加数据

背景描述

Kaggle上的一个入门题目,属于二分类问题。

泰坦尼克号中一个经典的场面就是豪华游艇倒了,大家都惊恐逃生,可是救生艇的数量有限,不可能让大家都同时获救,这时候副船长发话了:lady and kid first!这并不是一个随意安排的逃生顺序,而是某些人有优先逃生的特权,比如贵族,女人,小孩的。
那么现在问题来了:给出一些船员的个人信息以及存活状况,让参赛者根据这些信息训练出合适的模型并预测其他人的存活状况。

数据描述

数据是csv格式,提醒一下:之前一直是这样解析数据的:

tmp = line.rstrip('\n').split(',')

有些字段中包含”,”,上面这个解析就出问题了。
数据包含的字段如下:

  • PassengerID
  • Survived(存活与否)
  • Pclass(客舱等级)
  • Name(姓名)
  • Sex(性别)
  • Age(年龄)
  • SibSp(亲戚和配偶在船数量)
  • Parch(父母孩子的在船数量)
  • Ticket(票编号)
  • Fare(价格)
  • Cabin(客舱位置)
  • Embarked(上船的港口编号)

评估方式

比赛通过准确率指标评估模型优劣
precision=Ni=1I(ŷ i==yi)N
ŷ i 表示预测值, yi 表示实际值


模型以及特征选择

机器学习的关键部分无外乎是模型以及特征选择

模型选择

常见的分类模型有:SVM,LR,Navie Bayesian,CART以及由CART演化而来的树类模型,Random Forest,GBDT,最近详细研究了GBDT,发现它的拟合能力近乎完美,而且在调整了参数之后可以降低过拟合的影响,据说高斯过程的拟合能力也比不过它,这次就决定直接采用GBDT来做主模型。

特征选择

第一反应就是名字,Ticket,Cabin这些字段太零散,基本上每个人的都不一样,感觉并没有什么用。Cabin这一维度的特征更是缺失很严重,所以暂且不考虑Ticket,Cabin的这些特征 。
反观Name这个特征,看似并没有什么用,大家的名字都不一样,实际上从GBDT的调试过程来看,这个特征的使用频率很高的。通俗地说,Name可以给模型提供一定的泛化能力,比如一家人面临危机的时候,大家肯定都先找到自己的家人一起逃生,所以一家人的存活状况相关性肯定很高的。所以我引入名字特征的方式并不是直接引入名字,而是考虑和当前预测人的名字同姓的存活率。另外还有个背景问题,就是逃生的时候,女士优先逃生,这个时候家人就分开了,所以名字这个特征还要考虑性别,综合来说就是性别+姓的存活率作为一个特征。
另外,还增了相应类别的存活率这些特征,比如各种性别的存活率以及各种等级的存活率,之前请教过别人,这种把分类ID扔进模型之后有必要把所属ID的百分比扔进去吗?还是有必要的,前者是“是什么类别“的因素,后者是“有多少存活比例“的因素,是和有不能混为一谈。

特征缺失

数据中的某列特征丢失了在模型训练的时候是很正常的。目前了解到的解决方案是:

  • 直接扔掉这行数据(数据多任性)
  • 对于缺失的数据统一给一个新的label,让模型来学出给这种label多大的权值(感觉数据量大的情况才能训出来)
  • 这个特征的缺失率很高
    • 直接扔掉这列特征
    • 搞一个模型来拟合这维度的特征
  • 给一个默认值,这个值可以是均值,或者众数。(感觉这个方法其实和上一个方法的拟合很相似,通过均值or众数来拟合其实可理解为人工的最大似然。。。)

模型调试

初步训了一版,提交上去之后精确度为0.75

age特征的调优

看到ID为611的预测值仅是0.44,可是对应的label是存活,看了下他的特征
Kaggle系列——Titanic 80%+精确度纪录_第1张图片
船仓等级为class1,而且fare的费用相当高,应该具有相当高的优先权逃跑,只有可能是年龄影响了(数据量太少,年龄这一维度的特征特性GBDT并没有学习出来)于是乎,把年龄更换成是否是小孩这个标签
年龄特征
这个特征的值域更少了,顿时领悟:数据量实在不够,没有训练出来年龄的特性,因此降低候选特征的空间大小,在数据不够的时候,模型更能学习出来
本地自测0.812的precision,提交上去,涨了两个百分点
Kaggle系列——Titanic 80%+精确度纪录_第2张图片

增加数据

后面继续挑了几个case,感觉都是一些很明显的特征,模型应该能拟合出来,可是预估出来的值在0.5上下波动,于是乎:把训练集随机复制了几份扔回去一起训练,一下子提升到80+%的精确度,后面加了一些if-else规则,感觉用处不是很大,看来加规则的能力十分不足啊,这里抛出一个问题:感觉数据量不充足的时候,* GBDT中数据随机复制加倍的效果比增加迭代次数的效果更好*,我的见解是这样的:增加迭代次数的话,容易造成过拟合,而随机增加其中的数据,更容易让GBDT学习出数据的特性。

暂时没有下一步优化的想法,感觉可能就是比if-else,继续优化的意义不大,晚上断断续续搞了三个星期左右,占用自学的时间太多,以后打算还是多看论文,打算断断续续把NLP相关的知识体系连接起来。

你可能感兴趣的:(机器学习,项目实战)