AutoML自动化机器学习技术深入

开发十年,就只剩下这套Java开发体系了 >>>   hot3.png

之前发表了一篇介绍AutoML技术的文章,但感觉还不够深入。今天抽出时间来仔细分析了AutoML相关框架的源码,见微知著,希望能更全面准确的把握目前的AutoML技术现状。

这次,我首先拿Auto_ML这块框架作为切入点,分析了框架源码的工作流,以及用到的技术,再与其他框架进行了横向比较,分析记录如下:

AutoML

1.首先创建 Predictor 预测器;

一个Predictor预测器支持两种类型的任务:分类和回归

主要设置两个参数 type_of_estimator 和 column_descriptions

type_of_estimator 指定了任务类型(classifier 或者 regressor)

column_descriptions 指定了字段描述信息,如果为分类任务时,需指定Y所在的列(output)

 

2.调用Predictor 预测器的train方法训练模型;

一个简单的train方法,却做了很多事情:

a. _clean_data_and_prepare_for_training :数据清洗和准备

_prepare_for_training:准备X和Y;删除X中的重复字段;删除Y值缺失的记录;将X中所有字段转换为float类型;

将Y值标准化;

b.fit_transformation_pipeline :数据转换并输入管道

如果要使用深度学习组件,这里就会多一步特征学习的过程,调用方法名为:fit_feature_learning_and_transformation_pipeline

适应X值,并将X值放置到合适的“管道”中去;什么是“管道”:对数据处理流程的抽象;为什么使用“管道”:为了更方便的处理数据;

c.train_ml_estimator :训练模型评价器

找到最佳模型:这里值得注意的是,模型评价器在未指定模型名称的情况下,回归任务默认使用 GradientBoostingRegressor,分类任务默认使用 GradientBoostingClassifier

(在train方法中加入参数 compare_all_models=True 才会比较所有模型)

fit_grid_search : 如果没有使用CatBoost模型或者需要搜索的参数的个数大于50个,使用 EvolutionaryAlgorithmSearchCV 搜索候选模型的最优超参数,否则使用 GridSearchCV 搜索候选模型的最优参数

GridSearchCV的介绍:http://blog.csdn.net/sinat_32547403/article/details/73008127

这里我们会比较关心GridSearchCV针对每种不同的模型,初始化的Grid参数集合是什么样的,下面是部分截图,GridSearchCV的完整搜索空间见auto_ml源码 utils_models.py 第306行:get_search_params

AutoML自动化机器学习技术深入_第1张图片

这里以GradientBoostingClassifier为例:

损失函数尝试了两种:deviance,exponential

max_depth尝试了:1~15

max_features尝试了:sqrt,log2

learning_rate尝试了:0.001 ~ 0.2

……

这些对于一个粗粒度的模型来说足够了,还需要用户自己做精细化的调整

EvolutionaryAlgorithmSearchCV没有找到中文介绍,本质上属于一种启发式搜索,利用遗传算法的思想,寻找最优超参数

d._train_ensemble :训练集成模型

如果设置了集成学习参数ensemble_config,则进行集成学习模型训练:目前集成学习部分的逻辑还比较简单,用户配置需要做集成学习的模型集合,用一个for循环遍历这个集合,找到每个子集下的最优模型

e._create_uncertainty_model :创建不确定模型

当设置了不确定模型参数need_to_train_uncertainty_model,则进行不确定模型训练,这块就是使用GradientBoostingClassifier对不确定模型进行建模,目前还没想到这块用来做什么,该怎么用?

f._calibrate_final_model :调整最终模型

使用CalibratedClassifierCV进行模型概率校准

CalibratedClassifierCV的介绍:http://blog.csdn.net/u013426066/article/details/78650793

为什么要进行概率校准:为了让模型预测的概率具备更好的置信度

g._prepare_for_verify_features :准备验证特征

如果打开了特征验证参数verify_features,则执行_prepare_for_verify_features,为特征验证做准备(这块暂时没查到具体的用法)

 

3.调用Predictor 预测器的score方法输出模型分;

这里就没有什么特殊处理了,使用sklearn的包对模型分进行了输出;

 

综上所述,我们可以看出auto_ml的核心和重点就在于train过程中的模型选择和超参数调整,而这些在模型规模较小时主要是通过GridSearchCV完成的,auto_ml手工实现了一个超参数搜索空间集合,选择模型的标准也是根据在有限的超参数空间集合中搜索到得分最高的组合。所以实际上auto_ml采取的策略还是很粗放的,所谓的最佳模型和参数实际上只是一个预置好的近似值。

 

Tpot

而再仔细深入到tpot的源码中,我们发现同样tpot也提供了类似的搜索空间:

AutoML自动化机器学习技术深入_第2张图片

注意到上述搜索空间中很多参数给出来的都是范围,而不是某几个值,所以搜索出来的参数估计会更精确,但模型选择和超参数选择这块则使用了GP算法(gp_deap),也就是牺牲了一定的运行时间为了得到更准确的结果吧。

 

Auto-sklearn

auto-sklearn在这里采取了一种极端的策略:给出了一个非常庞大而细致的搜索空间,如下图所示:

AutoML自动化机器学习技术深入_第3张图片

一共划分了72种任务,每种任务里又有100多种参数组合,而在模型选择算法上也用到了GridSearchCV,所以对auto-sklearn不做限制,它的运行时间会很长,通常一个普通的任务会需要1-2个小时,但最终会得到一个非常准确的结果,完全是牺牲时间换结果。

值得一提的是auto-sklearn使用到了metalearning技术,metalearning是一种针对学习的学习算法,比较新,这里有一篇metalearning技术的介绍:https://www.leiphone.com/news/201708/tSXB6oo1mdnbKvkd.html

 

以上技术是不是最恰当最合适,还需要更多的实践检验。

你可能感兴趣的:(AutoML自动化机器学习技术深入)