大数据比赛中的特征工程及AutoML
什么是特征工程
- 特征工程(feature engineering)在数据挖掘应用中直接影响模型最终的性能;在很多计算机视觉任务中,特征提取的重要性甚至超过了分类器本身,比如CNN提取的feature是比很多hand-crafted features更具备表示能力的。
- 特征工程主要分为三个方面:
- 数据预处理:原始数据充满噪声、结构化不足,需要进行一些预处理操作以便特征提取;
- 特征提取:特征提取广义上指的是一种变换,将处于高维空间的样本通过映射或变换的方式转换到低维空间;
- 特征选择:良好的特征(feature)应该与标签(label)高度相关,并且与其他特征不相关。
- 特征工程几乎贯穿整个比赛过程。我们需要不断进行迭代,设计特征、选择特征、构建模型、评估模型,才能得到最终的结果。
数据预处理
-
时间戳处理:
- 原始数据中时间戳信息通常需要分成多个维度,如年、月、日、时、分、秒等;(3874D5H -> 3874, 5)
-
文本形式的类别数据处理:
- 原始数据中的类别信息可能用文本tag来表示,为了减少内存占用和加速计算,通常对类别进行编码然后使用编码来替换。可用sklearn提供的LabelEncoder类来处理;(SW2 -> 2)
-
数据精度处理:
- 通常用pandas来读取数据,在数据量大时为减少内存占用,可以选择降低精度。(int64 -> int8)
构造特征
-
比赛中给的数据一般分为带label的train数据和不带label的test数据。为了使各数据包含信息一致,并构造构造训练集、验证集,数据最终可分为以下五个部分:feat-train, label-train, feat-val, label-val, feat-test。用feat-train和label-train训练模型,输入feat-val用label-val验证模型,输入feat-test得到可提交结果。
-
在处理label相关的特征时要防止特征穿越,即feat-val中包含了label-val的信息而出现过拟合。
以下的特征构造方法只是一些常用的思路,面对具体问题还是要大量头脑风暴来构造针对数据的特征。
-
数值特征分箱/分区:
- 太精确的数值特征可能引起过拟合,可以采用分箱的方法来增强算法的泛化能力;(年龄分为年龄段)
-
类别数据计数:
- 为所有类别型的特征添加属于当前类别的数据的个数及所占比例作为新特征;(哪个时段回答的人数多)
-
矩阵分解获取相似度:
- 构造[feature1+feature2]-feature0矩阵进行矩阵分解,计算feature1和feature2的cos相似度,以便后续加权求和、取最相似的id对应feature等操作;
- 构造id-label矩阵进行矩阵分解,计算id之间的cos相似度,以便后续加权求和、取最相似的id对应feature等操作;(取其他user加权求和后的label、添加最相似的user的特征)
-
时序类数据:
- 为数据添加过去一段时间的计数作为特征;(过去一周回答的问题、过去3天回答的问题)
- 构造频率特征;(平均每天回答多少问题)
- 构造差异特征;(距离上一次回答过了多久)
-
统计特征:
- 计数、均值、最大值、最小值、方差等;(统计一对多的信息,如回答过的问题标题字数等)
-
文本特征:
- Tf-idf得到关键字,word2vec计算embedding、相似度等;(回答过的问题标题与邀请回答问题标题的相似度)
-
图特征:
- 构造两个id之间关联的二部图,用图嵌入、pagerank等方法得到embedding表示计算相似度等;(userid-questionid二部图)
常用模型
- 基础模型
- 朴素贝叶斯
- 决策树
- Boost模型
- XGBoost
- LightGBM
- CatBoost
- 神经网络模型
- Wide & Deep
- DeepFM
- 针对特定类型数据的其他模型
- RNN
LightGBM
A Highly Efficient Gradient Boosting Decision Tree
LightGBM是基于GBDT和XGBoost的改进。 LightGBM相对于其他GBM来说具有相近的准确率而且是其训练速度20倍。
https://lightgbm.readthedocs.io/en/latest/
DeepFM
DeepFM: A Factorization-Machine based Neural Network for CTR Prediction
DeepFM模型可认为是Wide & Deep推荐模型的升级版。
Wide & Deep
- DeepFM由两部分组成,FM和DNN,共享embedding。论文给出的物理含义:FM负责一阶特征和二阶交叉特征,DNN负责二阶以上的高阶交叉特征。
- Wide & Deep和DeepFM的比较:
- 两者的DNN部分模型结构相同;
- Wide & Deep需要做二阶交叉特征的特征工程,DeepFM完全不需要做特征工程,直接输入原始特征即可,二阶特征交叉靠FM来实现;
- 从实验结果来看DeepFM效果优于Wide & Deep 。
AutoML
什么是AutoML
-
AutoML(Automated machine learning)是将机器学习应用于现实问题的end-to-end流程自动化的过程。
-
AutoML在数据挖掘和深度学习领域目标不同:
- 数据挖掘:关注自动化特征工程,模型选择,自动生成代码;
- 深度学习:关注自动化网络结构设计和调参。
数据挖掘中的AutoML
在数据挖掘的场景下,其实boost算法已经取得了很好的效果,主要关注深度学习的场景。(AutoML is Overhyped: https://towardsdatascience.com/automl-is-overhyped-1b5511ded65f )
深度学习中的AutoML
-
在开发神经网络的过程中,架构工程是最重要的部分。
-
最早Google提出神经架构搜索NAS(Neural Architecture Search with Reinforcement Learning, ICLR’17),搜索每一层网络的filter数量、大小。(800块gpu跑了一个月)
-
提出自动从一组基础模块中组合出某种端到端的架构。(Learning Transferable Architectures for Scalable Image Recognition, CVPR’18)
- 针对图像识别任务
- 常用模块
- 流程
-
结果
-
强化学习调参困难,提出用regularized evolution优化(Regularized Evolution for Image Classifier Architecture Search, AAAI’19)
- 进化算法:在每一步,我们随机选择一对神经网络,其中精度较高的网络为亲代网络,并基于亲代网络复制和变异生成一个子网络。然后这个子网络将其添加到种群中,而另一个质量较低的网络则消失。所有其他网络在这一步骤中保持不变。
- Regularized evolution:不是删掉效果最差的神经网络,而是删除最老的一个——无论这个网络有多好。这提高了正在优化的任务变化的稳健性,并最终趋于产生更准确的网络。
-
为了加速训练:
- 渐进式神经架构搜索(PNAS)
- Progressive Neural Architecture Search (ECCV’18)
- 使用名叫“基于序列模型的优化(SMBO)”的策略,按照复杂性递增的顺序来测试每一个模块并搜索结构,来取代NASNet里所用的强化学习。
- 高效神经架构搜索(ENAS)
- Efficient Neural Architecture Search via Parameter Sharing (ICML’18)
- 在一个DAG中采样子图,用每次尝试训练得到的梯度交替优化全图和子图,把权重保存起来。
- 可微分架构搜索(DARTS)
- DARTS: Differentiable Architecture Search (ICLR’19)
- 采用可微分的搜索算法,把权重学习到DAG中,在全图中forward-backward。
- 渐进式神经架构搜索(PNAS)
-
其他研究
- EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks (ICML’19)
- ProxylessNAS: Direct Neural Architecture Search on Target Task and Hardware (ICLR’19)
- MnasNet: Platform-Aware Neural Architecture Search for Mobile (CVPR’19)
- NetAdapt: Platform-Aware Neural Network Adaptation for Mobile Applications (ECCV’18)
- Searching for MobileNetV3 (ICCV’19)
- Once for All: Train One Network and Specialize it for Efficient Deployment (arxiv)
- Rethinking the Value of Network Pruning (ICLR’19)
-
目前可用的AutoML平台
- Google Cloud AutoML
- 百度EasyDL
- 阿里云PAI
- Azure Machine Learning
- 一些开源项目
- https://github.com/tensorflow/adanet
- https://github.com/keras-team/autokeras
- https://github.com/Tencent/PocketFlow
- https://github.com/automl/auto-sklearn
- https://github.com/h2oai/h2o-3/