01 AutoML概述
记得若干年前的某次周会上,我说“AutoML不光是调参,应该包含自动特征工程。”当时得到了大佬们的嘲讽,说我不懂技术瞎说。今天回过头来看AutoML是一个系统化的体系,包含3个要素:
- 自动特征工程AutoFeatureEng
- 自动调参AutoTuning
- 自动神经网络探索NAS
02 NNI概述
NNI(NerualNetworkIntelligence)是微软发起的一个AutoML开源工具,覆盖了上文提到的3要素,地址:
https://github.com/SpongebBob/tabular_automl_NNI
我目前只学习了自动特征工程这一个模块,总体看微软的工具都有一个比较大的特点,技术可能不一定多新颖,但是设计都非常赞。NNI的AutoFeatureENG基本包含了用户对于AutoFeatureENG的一切幻想。在微软做PD应该挺幸福吧,底层的这些个框架的设计都极为合理。
03 细说NNI-AutoFeatureENG
使用是非常简单的,安装下文件中的require,然后
pip install NNI
NNI把AutoFeatureENG拆分成exploration和selection两个模块。exploration主要是特征衍生和交叉,selection讲的是如何做特征筛选。
04 特征Exploration
在特征衍生方面,微软教科书般的把特征衍生分成以下一些方式:
count:传统的统计,统计一些数据的出现频率
target:特征和目标列的一些映射特征
embedding:把特征看成句子,用word2vector的方式制作向量
crosscount:特征间除法,有点类似CTR
aggregete:特征的min/max/var/mean
nunique、histstat::这两个没太看懂
具体特征怎么交叉,哪一列和哪一列交叉,每一列特征用什么方式衍生呢?可以通过search_space.json这个文件控制。
Exploration的目的就是长生出新的特征。在代码里可以用get parameter的方式获取tuning的参数:
RECEIVED_PARAMS = nni.get_next_parameter()
05 特征Selection
为了避免特征泛滥的情况,避免过拟合,一定要有Selection的机制挑选特征。这里微软同学用了个小心机,在特征筛选的时候主推了同样是他们自己开源的算法lightGBM,
了解xgboost或者GBDT算法同学应该知道,这种树形结构的算法是很容易计算出每个特征对于结果的影响的。所以使用lightGBM可以天然的进行特征筛选。弊病就是,如果下游是个LR这种线性算法,筛选出来的特征是否具备普适性。跑通后产出的结果包含了每个特征的value以及属性。
06 总结
NNI的AutoFeature模块是给整个行业制定了一个教科书般的标准,告诉大家这个东西要怎么做,有哪些模块,使用起来非常方便。但是如果只是基于这样简单的模式,不一定能达到很好的效果。我觉得在Exploration方面可以引用一些DNN的特征组合方式,提取更高维度的特征。在Selection方面可以有更多的智能化方案,比如可以基于下游的算法自动选择Selection机制。
总之NNI在设计曾给了我一些启发,还是一个挺好的开源项目,推荐给大家~大家用的时候如果是Mac电脑可能会遇到gcc的问题,因为开源项目自带的脚本是基于gcc7编译的,可以用下面的方法绕过去。
brew install libomp