写点什么

TIANCHI 工业 AI- 第 10 名思路分享

作者:阿里云天池
  • 2024-08-19
    浙江
  • 本文字数:3082 字

    阅读完需:约 10 分钟

关联比赛:  天池工业AI大赛-智能制造质量预测


赛题分析

本次比赛提供了 1000 余个包含 8000 维特征的 TFT-LCD(薄膜晶体管液晶显示器)生产样本数据,属于典型的小样本、多特征回归问题。


该问题有如下痛点与挑战: 

1)TFT-LCD(薄膜晶体管液晶显示器)的生产过程较为复杂,包含几百道以上的工序。每道工序都有可能会对产品的品质产生影响,故算法模型需要考虑的过程变量较多。   

2)另外,这些变量的取值可能会存在异常(如测点仪表的波动导致、设备工况漂移等现象),模型需要足够稳定性和鲁棒性。   

3)产线每天加工的玻璃基板数以万计,模型需要在满足较高的精准度前提下尽可能实时得到预测结果,这样才能给在实际生产中进行使用。    

通过分析可以初步得到几个在比赛中需要注意的问题:如何有效的进行降维以提取重要特征;如何有效处理数据中存在的异常值、缺失值;如何构建稳定性高、泛化性能强的模型。


初赛   

通过对数据的初步探查可以发现,原始 8000 维特征中包含了两种类型的数据,一种是所用工台 ID,另一种是工台对应每道工序的各种性能因子。并且各类性能因子特征分布以及取值多种多样,包含了大量的缺失值和异常值,最关键的问题也是难点在于特征意义不明。   

所以针对这些问题数据预处理我分了下列步骤进行:       

1.缺失值采用均值填充。       

2.删除特征取值唯一的数据。       

3.删除类似日期之类的大值数据。       

4.采用 4 分法处理异常值,检测出的异常值用均值填充。       

5.异常值处理后再删除一次特征取值唯一的数据。       

6.删除重复的特征列。       

7.TOOL 特征标签化处理。       

8.特征标准化(针对 PCA 方案)


模型方案

方案一:

由于只知道 TOOL_ID 是工序所用的工台,基于这个信息比赛初期我尝试了直接使用 PCA 暴力降维的方案。首先根据特征中的每个 TOOL_ID 将原始数据划分成若干子数据集,针对每个子数据集分别进行上述数据预处理,之后采用 PCA 降维,最后合并各个部分的 PCA 结果形成训练集。XGBoost 模型训练下,该方案初期保持在 60~70 名左右,另外除了 PCA 我还尝试过 LDA、Tsne 降维方法,但最终效果差距不大,随着比赛越来越多的选手加入,该方案只退不进最终只能放弃。


方案二:

Pca 等暴力降维的方法最大的问题就是舍弃了原始特征中包含的很多信息,并且变换后的特征缺少可解释性,所以之后特征筛选的方案,我主要考虑在不改变原始特征的前提下进行降维处理。该方案保留了方案一中分 TOOL_ID 处理的步骤,针对特征与目标变量的相关性分析,我使用了皮尔森系数、互信息、相对距离、方差等一系列考察相关性的指标进行特征筛选,同样在 XGBoost 模型下,该方案有了小幅度的上升,但是在数量如此多的特征条件下,仍然无法较好的挖掘出重要程度高的特征。


方案三:

同样在方案一分 TOOL_ID 的基础上,我使用了 GBDT + Sklearn.SelectFromModel 模型进行特征筛选,利用了 GBDT 自带的特征重要性方法筛选出了 200 个左右的特征,最后通过 XGBoost 训练,该方案让我得到了前排 3 天体验卡...

方案三的大获成功给我指明了特征筛选的方向,相反也把我的思路限定在了 GBDT + Sklearn.SelectFromMode 框架下。利用该框架筛选出来的特征,我训练了随机森林、GBDT、lightgbm 等模型,通过 Stacking 融合,初赛中后期能够一直保持在 30 名左右。在分数稳定下来后,依然是针对特征筛选问题我考虑能否在利用 GBDT + Sklearn.SelectFromMode 框架构造特征候选集的基础上,用启发式的方法再进行灵活的特征筛选,所以在比赛后期我使用了遗传算法进行优化。然而整体框架编写完后发现各个算子需要考虑的细节太多,结果随机性太强,比赛后期我也没有大量的时间来优化算法,最后的效果也只是保持住了当前的分数,所有后续我只用到适应性函数来辅助线下验证。


该比赛基础遗传算法框架:

1.整体种群设置了 10 左右的个体大小,每个个体的基因长度为候选特征集长度,基因编码采用 0 1 二进制法,随机生成基因序列初始化种群。

2.适应函数采用 10 折线性回归结果。

3.选择算子采用轮盘赌算法,选择该轮进化中适应性最高的个体。

4.交叉算子采用两端交叉法,随机选择父本和母本的一段基因序列进行交换。

5.变异算子采用随机变异法,初始设定变异概率阈值,每个个体生成一个随机数,若随机数小于阈值,则对应个体的随机基因点进行取反变异。


tips:

实际使用时发现,轮盘赌算法在数轮进化后,所有个体最终的适应性值趋于一致,但是该值并不是最优结果,可能由于在每轮进化中最优个体没有保存下来,而产生的最优个体在轮盘赌中被洗牌。这里的选择算子可考虑换成锦标赛算法等。

适应性函数中使用线性回归主要是考虑缩短时间,这里应该使用树形模型作为适应性评价模型,以保持和特征选择所使用的模型一致。

交叉算子所使用的两端交叉,与两个端点的随机选择直接相关,端点距离太远可能导致重要特征被替换,距离太近导致无法实现交叉的效果,这个可以考虑更加灵活的交叉方法,比如固定长度单段交叉、固定长度多段交叉等等。

变异算子主要是变异阈值的选取,可以通过增加种群个体数量,增加遗传轮次进行调整。

关于遗传算法的几个关键算子,还有很多方法和技巧...在后续的比赛中争取再优化调整。


其他方案:

初赛最后几天受到交流群的启发,我考虑既然数据中包含了大量的异常值,那么直接把这些异常率高的特征取出来,说不定有奇效。所以这个方案中我结合四分位和孤立森林检测异常值的方法,筛选了一部分大约 100 个左右的异常率较高的特征进行训练,结果。。。。和我想象的大相径庭。这个方案中还有局部异常因子检测异常值的方法,碍于尚未理解并没有实现。


复赛

初赛换 B 榜数据时由于 Stacking 模型过于复杂,加上各种操作,直接导致 A 榜过拟合严重,最终大起大落 120 名进到复赛。。本着模型越简单越好的原则,复赛仅采用以下流程:

1.缺失值采用均值填充。       

2.删除特征取值唯一的数据。       

3.删除类似日期之类的大值数据。       

4.采用 4 分法处理异常值,检测出的异常值用均值填充。       

5.异常值处理后再删除一次特征取值唯一的数据。       

6.TOOL 特征标签化处理。       

7.删除方差小于 0.5 的特征数据。        

8.GBDT + Sklearn.SelectFromMode 筛选特征。

9.XGBoost 单模型预测。

这一套框架出乎意料在复赛整个周期都保持在了前 20。直到复赛换 B 榜评测时,我才加上了初赛的 Stacking 模型,最终排名第十。


总结

这个比赛算是我第一个完整参加的比赛吧,也是我第一次写这样的帖子,希望能和大家多多交流,写的不好的地方,也希望大家见谅。从初赛惊心动魄的摸奖,到复赛的大起大落,一个月来看着各路大神的骚操作真是收货颇多,决赛的答辩真是目瞪口呆,更是让我深刻的感受到什么叫奥卡姆剃刀原则和特征决定上限两句话。而这次比赛中最大的失败在于全程被 GBDT+SelectFromMode 限定了思路,居然完全没有想到使用 xgb 或者 lgb 进行特征重要性筛选;另外由于初赛中 Stacking 严重的过拟合,也让我在复赛中完全不敢使用,直到复赛最后两天,穷途末路回想起初赛的 Stacking 的确让我上了一波分,怀着赌一把的心态直接照搬的初赛的模型,最后的结果也算是为 Stacking 正名了吧。最后,通过这次比赛也让我感受到,更多的交流沟通才能够汇集更好的方法思路最终更好的解决问题,希望在今后的比赛中能继续和大家不断学习,共同进步。


最后附上代码地址:https://github.com/aiaiyueq11/Tianchi-Industry-AI


查看更多内容,欢迎访问天池技术圈官方地址:天池工业AI-第10名思路分享 附源码_天池技术圈-阿里云天池

用户头像

还未添加个人签名 2024-03-12 加入

还未添加个人简介

评论

发布
暂无评论
TIANCHI工业 AI- 第 10 名思路分享_阿里云天池_InfoQ写作社区