天池智能制造比赛总结

玄学比赛?

Posted by AJW on January 16, 2018

​ 开题忙完之后参加了这个天池的工业AI智能制造预测大赛, 也算是自己真正从头到尾完整参加的第一个数据类的比赛(哈哈之前感觉都是在抱别人大腿),结果最后这比赛有点玄学,B榜换数据之后排行榜大变,而且成绩都降了很多,最终自己排在了155/2529,没进复赛。至于小号测数据、数据质量差等就不想说了,毕竟还是有一些大佬A、B榜的成绩都不差的,所以肯定还是有些办法能让模型的稳定性和泛化性很好,这些只能等着大佬们分享自己的比赛思路了,这里先总结一些自己的收获。

比赛的基本套路

​ 比赛之前看了Linghao Zhang的经验贴,一些基本套路也都是从这里边学习到的。总的来说,目前的数据比赛无外乎分类、回归、推荐等任务,整个比赛过程的Pipeline其实相对固定:数据的基本理解、数据预处理、特征提取、模型选择、模型训练、模型融合。

数据理解

​ 在拿到比赛数据后,不要急着下手做,还是要对数据集有一个基本的掌握,数据量多少,特征维度多少,数据的分布怎样,是否存在很多异常值。像这次比赛的数据,特征维度有8000多,而训练集样本只有500个,而且不同的工序下不同工具的同一指标值分布相差非常多,这些对后续的数据预处理方法和模型的选择都有很大的影响。

​ 这里有一个问题,其实我是不知道该如何解决的,就是不同工具下数据分布不一致的问题,除了在数据预处理的时候分别处理,需要进行一些其他处理吗,比如标准化?总是感觉这样不同的分布是对最后的结果有很大影响的,但是没找到理论上的解决办法。

数据预处理

​ pandas基本提供了大部分数据预处理的接口(这里我想吐槽pandas真的是太TMD对新人不友好了,光是那几个切片的接口就很烦,但是用熟了还是挺方便的),这一步主要需要做的就是填充缺失值、处理异常值、类别特征的编码以及一些无关数据的去除。这里需要特别注意的是类别特征的编码问题,一开始我是用的LabelEncoder,后来经队友提醒发现这样会有问题,因为强行将原来没有大小关系的类别信息加上了大小关系,所以理论上还是应该用Onehot编码,但是用了Onehot编码后成绩下降了。。。所以最终还是用了LabelEncoder

特征工程

​ 这次比赛的所有特征都是匿名的,这给我们进行特征工程造成了比较大的困难。我是没有想到什么特殊的特征选择或者构造方法,只通过相关系数和树模型进行了筛选,最后的结果是通过相关系数筛选出来的结果比较好。但是我是选择了相关系数前1000的特征出来,比赛后看到一个预赛成绩top30的人分享,他也只是简单地用相关系数筛了大于0.1的特征,所以也许应该限定相关系数的阈值,而不是限定数量。

模型选择

​ 模型上因为之前一直听说xgboost大法好,所以就无脑用了xgboost,现在想想这么少的数据,这么多的特征,xgboost是不是很有可能过拟合?室友后来提供了一个高斯过程回归的方法,但是距离A榜截至只有最后两天了,就草草写了个模型,交了一个结果,没有xgboost好。高斯过程这个方法自己也是第一次用,对它的理解不是很深刻,它到底适不适合我们这个比赛的应用场景还有待考量,在调参过程中发现其中核函数对最后的结果影响非常大,而我对那些核函数又不是很了解,所以也有可能是我的参数没有调好。

​ 期间我也试过GBDT和RandomForest,但是结果都没有xgboost好。

模型训练

​ 模型训练直接用了GridSearchCV来进行参数选择,这里有一个需要注意的问题是,GridSearchCV后的模型是默认用全部的训练数据重新fit过一遍的。

模型融合

​ 这次比赛是我第一次使用模型融合,参考的也是Linghao Zhang的Stacking方法,第一层用了xgboost、rf和gbdt,第二层仍然是xgboost,但是最后的结果还没有单模型好,现在想想,也许融合后的模型是变好了,单模型是过拟合了。。

总结

  1. 数据的基本理解和预处理很重要
  2. 模型融合的方法学到了一些
  3. 还是要多和别人讨论,交换想法(但是去哪讨论呢?钉钉群?呵呵。。)
  4. 以后做比赛还是尽量选蚂蚁金服或者阿里云这样的吧,数据质量好一点

比赛代码都在github上了,虽然比赛有点玄学,但还是有一些收获吧,不过像特征工程这些东西没有得到太多。

更新:

看了决赛的直播,还是有大佬存在的,但是着比赛可能确实有点玄学吧,有几个人的做法和我是差不多的,但是他们的效果就比我好了不少。

区别在于,可能我的特征数量选的还是太多了,毕竟500多数据,用了3000特征,有点多了,可能核心的特征几十个就够了。

另外第一名的解法我有很多也想到了,比如按照工具的不同去进行异常值的处理。她的关键可能在于新特征的选取,特征两两的差值,以及每个特征中的数据与均值的差等等。而且,我没看错的话,她甚至都没有对特征进行降维。所以说,特征还是重要的。