Task 3 进阶任务
特征工程简介
有这么一句话在业界广泛流传:
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
数据是特征的来源,特征是给定算法下模型精确度的最大决定因素,可见提升特征质量意义重大。
特征工程(Feature Engineering)是机器学习的一个重要分支,指的是通过多种数据处理方法,从原始数据提取出若干个能优秀反映问题的特征,以提升最终算法与模型准确率的过程。
自动特征工程
自动特征工程是一种新技术,是机器学习发展的一大步。自动特征工程能够在降低时间成本的同时,生成更优秀的特征,从而构建出准确率更高的模型。
利用NNI的自动特征工程实现,我们通过简单调用函数便可实现特征工程的自动调优。
环境准备
- nni
- numpy
- lightgbm: 微软开源算法
- pandas: 基于python的数据分析强力工具
- sklearn: 集成了特征工程相关的常用函数
建议在conda环境下部署自动特征工程python环境。
此外,由于pandas版本更新,直接运行自带项目会报错,实际上只需修改fe_util.py
中的agg
参数类型即可,大致修改如下:
1 | def aggregate(df, num_col, col, stat_list = AGGREGATE_TYPE): |
该修改已提交pull request至原项目。
配置文件
配置搜索空间
NNI的自动特征工程支持count、crosscount、aggregate等一阶与二阶特征运算,配置搜索空间时只需按json格式填写搜索范围。具体填写方法以项目示例搜索空间为例:
1 | { |
导入tuner
导入自动特征工程的tuner时,需要在config.yml
中的tuner
项添加相关信息,其他地方正常填写即可。
1 | tuner: |
代码
Tuner在生成的搜索空间中随机选取一定数量的feature组合,通过nni.get_next_parameter()
的接口,以dict的形式返回给单次trial。经一系列处理后运行lightGBM算法,得到最终以AUC形式呈现的结果。
调用代码主体部分如下:
1 | # get parameter from tuner |
项目示例运行结果
Overview
Top 10 Trials
Default Metric
Hyper-parameter
Feature Importance of Top 1 Trial
1 | feature_name split ... split_percent feature_score |
若想要查询某一次trial的feature importance,只需在WebUI中按下Copy as json,再代入原程序运行就可以获得了。
heart数据集运行结果
heart数据集收集了中老年人是否患心脏病的270条数据,每条数据有13条属性,本质上是一个二分类问题的数据。
我们希望通过特征工程,从数据中挖掘出心脏病患病与其他事件的相关性,从庞杂的数据中得出结论。
初始AUC为0.932367,使用了NNI自动特征工程之后,AUC上升到了0.97343,比原始精确度高出许多。
Overview
Top 10 Trials
Default
Sorted Default MetricMetric
Hyper-parameter
Feature Importance of Top 1 Trial
1 | feature_name split ... split_percent feature_score |