【372】Kaggle 相关经验

参考:机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

参考:Kaggle泰坦尼克特征工程和模型融合


『解决一个问题的方法和思路不止一种』
『没有所谓的机器学习算法优劣,也没有绝对高性能的机器学习算法,只有在特定的场景、数据和特征下更合适的机器学习算法。』

Kaggle上的大神们,也分享过一些experience,说几条我记得的哈:

  1.  『对数据的认识太重要了!』
  2.  『数据中的特殊点/离群点的分析和处理太重要了!』
  3.  『特征工程(feature engineering)太重要了!在很多Kaggle的场景下,甚至比model本身还要重要』
  4.  『要做模型融合(model ensemble)啊啊啊!』

1. 『对数据的认识太重要了!』

  • 每个/多个 属性和最后的分类结果之间的关系,通过画图实现
  • 属性与获救结果的关联统计
  • 了解数据属性对于结果的关系

2. 『特征工程(feature engineering)太重要了』

  • 处理有缺失数据的属性
  • 通常遇到缺值的情况,我们会有几种常见的处理方式
        如果缺值的样本占总数比例极高,我们可能就直接舍弃了,作为特征加入的话,可能反倒带入noise,影响最后的结果了
        如果缺值的样本适中,而该属性非连续值特征属性(比如说类目属性),那就把NaN作为一个新类别,加到类别特征中
        如果缺值的样本适中,而该属性为连续值特征属性,有时候我们会考虑给定一个step(比如这里的age,我们可以考虑每隔2/3岁为一个步长),然后把它离散化,之后把NaN作为一个type加到属性类目中。
        有些情况下,缺失的值个数并不是特别多,那我们也可以试着根据已有的值,拟合一下数据,补充上。
  • 通过scikit-learn中的RandomForest可以拟合缺失的数据
  • 类目型的特征因子化
  • 使用pandas的”get_dummies”来完成这个工作
  • 用scikit-learn里面的preprocessing模块做一个scaling,所谓scaling,其实就是将一些变化幅度较大的特征化到[-1,1]之内。
  • test_data要做和train_data做一样的预处理
  • 模型系数关联分析
  • 交叉验证
  • 用scikit-learn的cross_validation来实现
  • 优化操作:通过已有的属性产生新的属性
        Age属性不使用现在的拟合方式,而是根据名称中的『Mr』『Mrs』『Miss』等的平均值进行填充。
        Age不做成一个连续值属性,而是使用一个步长进行离散化,变成离散的类目feature。
        Cabin再细化一些,对于有记录的Cabin属性,我们将其分为前面的字母部分(我猜是位置和船层之类的信息) 和 后面的数字部分(应该是房间号,有意思的事情是,如果你仔细看看原始数据,你会发现,这个值大的情况下,似乎获救的可能性高一些)。
        Pclass和Sex俩太重要了,我们试着用它们去组出一个组合属性来试试,这也是另外一种程度的细化。
        单加一个Child字段,Age<=12的,设为1,其余为0(你去看看数据,确实小盆友优先程度很高啊)
        如果名字里面有『Mrs』,而Parch>1的,我们猜测她可能是一个母亲,应该获救的概率也会提高,因此可以多加一个Mother字段,此种情况下设为1,其余情况下设为0
        登船港口可以考虑先去掉试试(Q和C本来就没权重,S有点诡异)
        把堂兄弟/兄妹 和 Parch 还有自己 个数加在一起组一个Family_size字段(考虑到大家族可能对最后的结果有影响)
        Name是一个我们一直没有触碰的属性,我们可以做一些简单的处理,比如说男性中带某些字眼的(‘Capt’, ‘Don’, ‘Major’, ‘Sir’)可以统一到一个Title,女性也一样。
  • learning curves
  • 对过拟合而言,通常以下策略对结果优化是有用的:
     做一下feature selection,挑出较好的feature的subset来做training
     提供更多的数据,从而弥补原始数据的bias问题,学习到的model也会更准确
  • 而对于欠拟合而言,我们通常需要更多的feature,更复杂的模型来提高准确度。
  • 用scikit-learn里面的learning_curve来帮我们分辨我们模型的状态

3. 『模型融合(model ensemble)很重要!』

  • 通俗解释:
    你和你班某数学大神关系好,每次作业都『模仿』他的,于是绝大多数情况下,他做对了,你也对了。突然某一天大神脑子犯糊涂,手一抖,写错了一个数,于是…恩,你也只能跟着错了。
    我们再来看看另外一个场景,你和你班5个数学大神关系都很好,每次都把他们作业拿过来,对比一下,再『自己做』,那你想想,如果哪天某大神犯糊涂了,写错了,but另外四个写对了啊,那你肯定相信另外4人的是正确答案吧?
  • 有一堆在同一份数据集上训练得到的分类器(比如logistic regression,SVM,KNN,random forest,神经网络),那我们让他们都分别去做判定,然后对结果做投票统计,取票数最多的结果为最后结果。
  • 那我们干脆就不要用全部的训练集,每次取训练集的一个subset,做训练,这样,我们虽然用的是同一个机器学习算法,但是得到的模型却是不一样的;同时,因为我们没有任何一份子数据集是全的,因此即使出现过拟合,也是在子训练集上出现过拟合,而不是全体数据上,这样做一个融合,可能对最后的结果有一定的帮助。对,这就是常用的Bagging。
  • 我们用scikit-learn里面的Bagging来完成上面的思路

原文地址:https://www.cnblogs.com/alex-bn-lee/p/10383767.html