您的位置:首页 > 大数据 > 人工智能

天池工业AI大赛-智能制造质量预测 比赛历程和技术方案总结复赛48名

2018-01-31 10:23 1276 查看

一、参赛

研二导师的项目摸鱼结束后,思考了一下出路,项目和机器学习相关,重在特征提取的传统算法研究和目标识别的多样算法融合,简单说就是理论,MATLAB,推导三要素组成。来年就要面对就业,没有点成果或者简历上写的料,感觉就凉了,正好自己用一个星期的时间把python实战的方法过来一边,代码就大概看了看,感觉武器已经备好,可以开始作战,所以和同团队的小伙伴一拍即合,做比赛。这也正好是第一次参赛,最终成绩初赛52名,复赛48名,说实话是零基础的开始。学习从总结中进步,所以结束比赛总结一下惊心动魄的比赛经历。

二、题目

半导体产业是一个信息化程度高的产业。高度的信息化给数据分析创造了可能性。基于数据的分析可以帮助半导体产业更好的利用生产信息,提高产品质量。

现有的解决方案是,生产机器生产完成后,对产品质量做非全面的抽测,进行产品质量检核。这往往会出现以下状况,一是不能即时的知道质量的好坏,当发现质量不佳的产品时,要修正通常都为时以晚,二是在没有办法全面抽测的状况下,存在很大漏检的风险。

在机器学习,人工智能快速发展的今天,我们希望着由机器生产参数去预测产品的质量,来达到生产结果即时性以及全面性。更进一步的,可基于预先知道的结果,去做对应的决策及应变,对客户负责,也对制造生产更加敏感。详情可以点击以下链接:天池工业AI大赛-智能制造质量预测

总体任务分析:

1.   设计预测模型,解决异常值和盲特征情况下的痛点,提高模型的鲁棒性;

2.   典型的回归问题,建立算法模型准确预测出特性值,便可以实现生产过程的实时监控和预警。

 

三、参赛准备

1.   准备一台
4000
电脑,CPU和内存不错就可以;

2.   设计自己的资料存储方式,我是将数据代码分开,第一个文件夹是比赛名称,二级子文件夹是code,data,original,open分别存放代码,中间数据,原始数据,开源资料。具体的三级,四级子文件夹就是模型名称,训练测试之类的,这样的一个好处是需要代码审查的时候,直接打包就可以发过去。有个好的建议是一定要保存数据,一定要在改变数据之前存一份原始数据。最好准备一个Excel专门存放每次的提交记录和当天做法的总体思路,这对后面的模型融合,对比结果很有必要,简单的写上提交日期,线下成绩,线上成绩,整体思路,第二篇放提交的结果数据。

3.   了解赛制,开始各种懵逼,什么都不知道,后来才知道:

a.   组队基本在初赛结束的日子;

b.   天池的认证很重要!有很多成绩不错的队伍都是认证没有做好被刷了(我的第二个比赛前一百就刷了30多个队伍)

c.    注意时间节点,提交答案的时间,初赛结束的时间,认证结束的时间,组队结束的时间。这时候一般都会鸡飞狗跳

d.   加群,群里的虽说大部分都是水群的,或者大佬从来不出没的,但是群里的只言片语有时候能带来质的飞跃。

四、数据预处理

1.数据概览

每条数据包含8029列字段。第一个字段为ID号码,最后一列为要预测的值Y。其余的数据为用于预测Y的变量X。这些变量一共由多道工序组成,字段的名字可以区分不同的工序,例如 210X1, 210X2。300X1,300X2。字段中的TOOL_ID或者Tool为每道工序使用的机台,如果是string类型,需要选手自行进行数字化转换,数据中存在缺失值。

数据可以说是完全盲特征,想要自己通过看几万个数字得到特征,几乎不可能(虽说开始的时候尝试过半天时间看8000个特征,“人工”智能),在数据处理上确实走了很多弯路,拿到数据的时候pandas,xgboost,numpy这些是啥都不知道,所做的工作就是Google,Baidu看看最简单的模型框架是怎么解决回归问题的,会做的处理就是群里大佬开源的方法,代码看不懂,但是能找到输入输出在哪里,就试着带进去,结果不错baseline 140多名。开始照着大佬的做法,一句句翻译,一句句理解,总算心里有个框架该怎么用的底了,其实初期最大的挑战就是自己吭哧瘪肚的写了几十行循环,其实有现成的包一句话就能代替。

      

2.数据分析

最常用的数据分析手段就是绘制matplotlib,seaborn的各种图形,直方图,折线图,散点图,heatmap等等,或者用pandas中的VIEWING/STAISTICS中的info,describe可以大致知道数据集的分布,这里推荐一下pandas的Cheat Sheet拉到最下面下载PDF打印发现新大陆pandas-cheat-sheet。当然还有其他的sklearn,numpy的cheat
sheet。

数据分析的重点包括以下几个方面:数据类型,奇异点,相关性,数据分布。对于这道题目,数据有float,int,object空缺中大于50%的也有上百列,总体特征间的差值有很大的时间列,有很小的负次方数值。数据中包括TOOL工序一系列的特征,按照题目要求,需要针对不同的工序,得到合理的特征分析结果。

3.数据处理方案

对于缺失值过多的列没有必要保留,如果直接填充反而引入了较多的噪声时间序列在原始数据集中属于远远大于其他值的数值,顾先剔除,在特征工程中在将其做特征处理,TOOL序列类属于object类型,在模型中有很多时候会引起报错,顾按照one-hot编码,或者用sklean中的get_dummies作为编码工具。剩余的值再用pandas中的fillna填充median值。具体流程如下:  

                                                                   


图1 数据预处理流程

五、特征工程

特征工程的重要性可以说决定着你的比赛名次,两句“名言”:“特征工程决定模型的上限”,“特征做不好,参数调到老”。具体使用的特征工程包括如下:

1.类别特征:变化较少,类似于类别的特征直接编码后加入训练集

2.时间序列:时间的序列中有明显的时间错误,一道工序不可能持续很多年,首先修正时间,取出之前的时间序列,找到每个工序对应的最大最小时间,差值作为特征表示工序完成的时间,对于异常数据直接替换为中值

3.整体数据:处理方式有两种针对不同的模型使用不同的方式,一是原始数据,可以直接使用模型,例如XGB,LGB,GBR等等,二是归一化数据将数据的特征表现的更加明显,去除由于值的巨大差异而淹没值的特征

4.特征筛选:特征筛选主要有三种方法:嵌入式embedded、过滤式filter、封装式wrapper。由于特征通过编码数量更大,而之前使用方差和相关性分析可知特征中冗余特征很多,特征筛选是一个关键的步骤,比赛中尝试了方差筛选,pearsonr系数阈值筛选,基于xgboost和随机森林的树模型筛选,xgboost中的feature_importance同样设阈值筛选(亚军大佬就是只用来这个模型单模型做的很好的成绩)。为了去除冗余特征,采用多种方法,使用较大的阈值得到数目差不多的特征之后求交集,是一个很不错的选择。对MSE会有提升。最终保留三位数的特征,好的特征选择可以有效的防止过拟合。

5.工序特征:针对题目中再三强调的工序,行之有效的方法是将每个工序对应的特征首先做筛选,之后剩下的特征合并,现实意义是最大的,但是比赛成绩不一定好,很有可能是姿势的问题。

6.多项式特征:神器PolynomialFeatures在degree为2时,可以简单粗暴的把[a,b]变为[1,a,b,ab,a^2,b^3],三次同理,加入特征后筛选可得出其中重要性较高的特征加入训练集,这种方法的弱势就是特征解释性不强。

7.样本问题:在复赛阶段,意外得知样本的不平衡对数据的影响是很大的,复制样本很有效的解决了,预测结果一边倒的情况,在本题中根据第一个TOOL做排序,得到J,K,L,M,N,O六类数据,分布从几到几百不等,简单粗暴的复制便可以有效解决问题,这个操作使得排名进步了20名左右,MSE从0.034提升到0.032。

8.log1p:对特征取log,可以有效的将特征转化为斜度更大的数据,由于很多模型都是假设数据为正态分布下产生的,也就是让数据分布更加符合模型,同理加入训练集中。

六、模型设计与融合

1.回归模型设计

说在前面的个人拙见:“融合就是不讲理的提升成绩”,只要稍微着边的姿势就能大幅度提升成绩,一般的融合要求就是特征不同,模型不同,成绩相近。这也是后期大佬们组队后突飞猛进的原因,分享特征,交换思想,融合成绩。在kaggle很好的比赛生态下,不是依然有选手通过融合开源代码夺冠的吗?

本次设计的模型尝试了很多:

a.   XGBRegressor

b.   Lightgbm

c.    Lasso

d.   LinearRegression

e.   BayesianRidge

f.     DecisionTreeRegressor

g.   RandomForestRegressor

h.   GradientBoostingRegressor

i.     AdaBoostRegressor

j.     BaggingRegressor

k.    ExtraTreeRegressor

l.     SVR

m.  MLPRegressor

        最终分析得到的较好的结果为xgb,lgb,gbr,abr,svr通过不断的调参融合,个人拙见,GridSearchCV挑出来的参数不是最好的,还很慢,所以一边都是手动调,调参基本的步骤就是先用基础模型,不用任何参数,直接训练,然后CV看MSE,如果偏差很大,可能就是参数设置有大问题,直接添加,回归到正常值附近后再做微调,例如调整xgb的参数,就可以先用默认的learning_rate和n_estimators调整其他参数,max_depth,min_child_weigh调整结果比较好后,在调整subsample,最后按照比例调整学习率和弱学习器的数目,基本得到的就是最优参数。

2.大值预测模型设计

       由于数据集分布的不均,大值往往预测不到,但是却对结果起着异常重要的影响,分类采用wepon大神的后处理方法,作为对回归模型的参考,xgbclassifier分类得到大值的位置,再采用回归模型预测大值的值域,采用的方法是大值的训练样本和随机取小值的等比例样本数之后训练,随机十次,再使用比大值大一倍两倍三倍四倍五倍,一共十五个预测结果,不看小值的结果,只看大值的位置和值域的不同模型交集,准确率有很大的提升。成绩也会有所提升,需要注意的是,这一步一定要谨慎。

3.融合

融合的三种方法:单模型自融合;加权融合;stacking融合。

1.   单模型一般都是框架直接得到结果,通过循环改变随机种子数值,最后平均结果得到预测结果。这个模型是一般名次的大杀器,感觉进榜是没有问题的;

2.   加权融合,简单粗暴,通过不同的预测结果,根据取值分析,统计准确值出现的次数,再根据百分比得到权值,加权。如果线下比较稳定的时候,可以尝试改变权值;

3.   模型融合,通过多个模型预测结果作为第一层,预测的结果合并成训练集,再放进模型训练得到最终的预测值,姿势正确,效果也很好。

七、弯路

1.   一般A榜数据公布以后,加到训练集一定是首选结果,但是模型的参数一定要重新调整,不然会栽跟头

2.   不能相信第六感,调整结果是不好的体验,做比赛到后期,基本每天都0.02的进步最后一次之前成绩到了0.028,其实如果最后一次按照之前的方法做,完全可以进入0.026的成绩,但是为了尝试更好的成绩,采用铤而走险的方式,结果往往都是失败。

3.   一定要看好各种截止时间,不然你都不知道你是怎么被淘汰的

4.   做比赛的收货确实很大,但是最好不要沉迷其中,多总结,才能更进步。

5.   队友往往决定了你的比赛前景,选一个合适的队友,两个人可以交流实在太重要了,不然很多贸然的组队,会给你后续的比赛蒙上阴影。

6.   大神用的好的方法,给你都不一定用的好,在我看来决定一个比赛的质量的前提是能做到线上线下和稳定。不然多变量的问题也就是应征了开头的惊心动魄,丈二摸不着头脑。

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: