本期由阿里云MVP&优秀ACE(阿里云开发者社群) 郭翔云 为大家分享机器学习之从数据预处理到特征构建谈天池工业AI竞赛模型训练。通过天池工业AI竞赛示例,演示从数据观察到特征构建,再到模型训练验证评估的一个机器学习的完整流程。
视频:https://yq.aliyun.com/live/597
分享分为三部分:
1.2数据预处理
1.3特征构建
1.4模型与参数选择
一、赛题分析
1.1赛题与数据理解
赛题示例分析选取的是阿里云天池大数据竞赛平台上的天池工业AI大赛-智能制造质量预测赛题。
首先我们来看赛题分析。
本次比赛提供了生产线上不同工序的参数数据。通过这些参数特征设计模型,预测与之对应的特性数值。
赛题的难点在于生产过程复杂,参数众多,存在空值和异常值。
赛题的价值在于通过建立算法模型,希望能够提前发现当前工序中所存在的问题,避免问题流入到后道工序,减少生产资源浪费,优化产品良率。
评测指标选取的是MSE,MSE的值越小代表预测结果越好。
在我们拿到数据的时候,首先要对数据进行观察,通过观察,可以发现数据包含以下特点:
特点1,数据包含ID列、工具列、参数列,训练集包含目标列。
特点2,参数列和目标列经过脱敏处理,无法得知其物理意义。
比如我们来看下面的数据示例,我们会发现参数列的名称为210X1、210X2等,是经过脱敏处理的,也就是说我们无法从业务角度进行考虑。
特点3,通过观察时间,发现参数列并不是从左到右依次产生的。
比如我们来看下面的数据示例,我们会发现下面的5列参数列的发生顺序依次是5、4、1、3、2.
特点4,部分参数列存在缺失值、单一值和重复列情况。我们可以看下面的数据示例。
特点5,一道工序内,机台的种类直接影响了多个参数列的数据分布。
我们来看下面的数据示例。我们可以发现后面的参数列明显受到前面TOOL列的影响,比如参数210X1,在工具M下数值为101左右,在工具N下数值为89左右,而在工具O下数值为98左右。
特点6,部分参数列中的缺失值被机器自动以0或其他异常值进行填充,上述现象存在于同工序下的多个工具中。我们可以看下面的数据示例。
1.2 数据与处理
基于上面总结的6个数据特点,我进行了以下数据预处理操作。
1、将数据集依照工序列分割为不同的工序单元。
大部分工序列都是以Tool开头的,但是也有几列比较特殊的,比如Chamer ID、OPERATION ID和Chamber列。我们来看一下该如何处理。
通过观察,可以发现Chamber ID后面的数据,同时受到TOOL1和Chamber ID的影响,因此把TOOL1和Chamber ID合并作为工具列。
而对于OPERATION ID和Chamber列,后面的数据仅受此列数据的影响,因此把它们看做独立的工序列。
2、对数据列的初步清理,先后删除空值占全列40%以上的列、方差为0的列和重复列。
3、对日期列的处理。对于8位、14位、16位的日期数据,因为数据是2016年以后的数据,因此把日期列转为2016年1月1日以来所经历的秒数。
5、对各列的0值和NA值,填充工具内内非零非NA元素的平均值。
1.3 特征构建
在工业生产中,每一项参数都有标准值,我们该如何评价实际参数的好坏呢?
以冰箱这种典型工业产品为例,我们当然是希望冰箱的温度控制越精确越好,能耗越低越好。
基于以上思考,我们可以总结出两种评价参数好坏的方式。1、与标准值的差值,也就是所谓的能耗越低越好。2、相对标准值差值的绝对量,也就是温度控制越精确越好。
在这种思路下,除了原值以外,我又建立了两类额外特征备选。
将组内平均值看做标准值。特征1,与标准值的差,看作偏差值err。特征2,与标准值的差的绝对值,看作偏离量errabs。
进一步地,两列交互能否作为特征呢?比如时间列,单一的时间戳是无意义的,那么两列时间戳之差就有可能表示某道工序所耗费的时间,可以作为一列新特征。
同样的,既然差我们可以做,那么和差积商我们是不是都可以尝试。
因此,对于双因子,我构建了加减乘除反除5个备选特征,将这些因子当做新的独立的因子,像单因子一样考虑原值、偏差值和偏离量。
我们来看特征构建的流程。
1、计算单因子和双因子交互列并纳入备选特征。
对于单因子X,建立原始值X,X与组内平均值的偏差值X_err,X与组内平均值的偏差绝对量X_errabs。
对于双因子X和Y。计算X和Y的和差积商反除,同时建立上述五列值的样本值与组内平均值的偏差值err,平均值的偏差绝对量errabs。
那么单双因子备选特征具体是怎么计算的呢?
我们首先看单因子备选特征。以210X1为例,假设数据仅包含如下12行,对于工具M,我们计算210X1的平均值为101.6375,原始值与平均值的差为210X1_err,差的绝对值为210X1_errabs。工具N、O也是一样的计算方式。我们将210X1、210X1_err和210X1_errabs作为备选特征。
对于双因子备选特征。我们以210X1乘210X2为例,假设数据仅包含以下12行。对于工具M,先分别计算210X1乘210X2,对乘法结果计算均值mean。用乘法结果与均值的差作为err,差的绝对值作为errabs。同理,工具N、O也是一样的计算方式。将210X1210X2、210X1210X2_err、210X1*210X2_errabs作为备选特征。对于加减乘除反除都是同样的计算方式。
我们来约定一下单双因子的描述方式。单因子记作X、Xerr、Xerrabs,双因子记作f(X,Y)、f (X,Y)_ err 、f (X,Y)_ erabs。
接下来我们对构建产出的特征进行筛选。这里选用的方法是计算备选特征与特征值Value的pearson相关性。
记某特征X与特征值Value的pearson相关性(绝对值)为Pearson(X,Value)。
对于单因子,我们要求Pearson相关性大于0.2。
对于双因子,我们要求双因子的pearson大于0.24并且双因子的pearson分别比各自的单因子pearson大于0.05。这里主要是为了强调因子交互带来的额外相关性。
对于单双因子的阈值,是基于当前数据的实验结果给出的,可以进行适当调整。
随后填充inf和标准化,共计产出单因子425列,双因子4756列。
单双因子相关系数最高的十维如下所示。
这里需要注意的一点是,下表列出的仅为相关系数较高的列,并不是模型中的重要特征列。
1.4 模型与参数选择
在初赛及复赛阶段,在testA公布前,采用的是Train五折交叉验证。在testA公布后,采用的是Train训练的模型结果预测testA。评价指标选用的是mse和R方。
选用这样的模型评价方式主要是为了客观考察模型在新数据集的泛化能力。
在初赛阶段,标准化尝试过全体标准化、组内标准化、将训练集测试集分开和和合并标准化等。最后选用的方案是基于当前的特征构建结果,最后标准化。
降维尝试过PCA、SelectKBest等,一直效果不佳,复赛后因提交机会有限,就不再尝试降维。
模型尝试过SVR、Lasso、XGBoost等,最后根据模型效果,主要选用Lasso、XGBoost和GBDT。
复赛阶段基于多版本数据和多模型的比较,选择最优的数据和模型。
数据包括单双因子带err、纯单因子、跨工序单双因子无err等,模型包括Lasso和XGBoost。最后根据数据和模型结果,选用的是单双因子带err,XGBoost。
最终数据及XGBoost模型参数如下。
利用train数据训练testA的结果,mse为0.02013,R方为0.63564.
将train和testA拼接,利用全部单、双因子数据,最终预测testB。
那么整套数据处理的全流程如下。我们拿到数据的时候首先要对数据进行观察,基于数据理解进行数据预处理,包括分工序、删无效字段和NA、0的补值。然后构建单双因子特征,计算特征相关性,利用相关性阈值进行特征筛选,补inf后进行Z-Score标准化。模型尝试Lasso、SVR等,最后选取Lasso、XGBoost和GBDT。根据模型评估结果选用XGBoost。最后进行参数优化并产出最终预测结果。
二、总结与讨论
在进行数据分析建模的过程中,我的个人经验包含以下几点:
观察数据,理解业务。在解决问题的全过程中,要保持对数据的重视,甚至可以尝试“人工”智能。
注重特征。在机器学习领域有一句名言,数据和特征决定了机器学习的上限,模型只是去逼近它。我们可以尝试基于业务逻辑和自身的问题理解,积极构造新特征。
模型选择。当特征很复杂时,可以考虑使用简单模型。当特征较为简单时,可以尝试考虑复杂模型。
最后一定要注重模型的泛化能力和可解释性。
三、 个人推荐
在机器学习领域,经常有一些小伙伴自称自己是“炼丹师”,模型调参和改bug就像炼丹一样,靠的是经验和运气。那么对于经验,可以从书籍、课程中获得理论指导,论文中获取原理推导,在公开数据集、项目和竞赛中进行实践,同时通过一些博客或者技术沙龙学习他人的经验。
书籍推荐:李航老师的《统计学习方法》、周志华老师的《机器学习》,还有《集体智慧编程》、《机器学习实战》以及《深度学习》
论文推荐:arXiv.org
竞赛推荐:kaggle、阿里云天池大数据竞赛平台。
以上就是本次的技术分享内容,如有不足,请多多指教,谢谢Thanks(・ω・)ノ