自动化机器学习指南之四大成熟度模型
自动化机器学习:自动化训练过程
从概念上说,机器学习旨在通过对机器进行训练,通过处理现实数据的方式,提供预期的输出。也就是说:它能够让机器从现有的数据(或经验)中得到一定程度的训练,在经历了一番完整的数据处理之后,进而生成更准确的输出。那么自动化机器学习(AutoML)的概念显然是要使得整个过程彻底实现自动化。
自动化机器学习的成熟度模型
自动化机器学习的不同实现方式可以根据它们所对应的成熟度,进行不同级别的分类。如下图所示,模型成熟度越高,表示它对于自动化任务的支持就越好,当然也就需要该模型能够通过对于数据的集中训练,执行更多的任务、提供更多的服务。
1.超参数优化
当数据集被提交过来之后,自动化机器学习会根据上述成熟度模型,尝试着去匹配各种既有的模型,例如:随机森林、线性回归等(一般使用的是结构化的数据)。同时,它会按需为那些应用到数据上的每一种模型,去优化超参数(hyperparamters)。此类优化技术包括:手动搜索、随机搜索、网格搜索等。
例如:Auto-sklearn使用贝叶斯模型进行超参数优化,并且能够提供所需的结果。不过,在该级别的成熟度模型中,自动化机器学习只能执行有限的任务,例如:交叉验证、机器学习算法的选择、超参数的优化等。当然,随着成熟度水平的提高,自动化机器学习将会具有更多的功能,提供更出色的结果。
2. 一级以上的数据预处理
在第一级中,自动化机器学习需要用户自行实现数据的预处理措施。但是,到了第二级,由于使用了更为成熟的模型,各种数据的预处理任务便可以由自动化本身来完成,并为进一步处理做好准备。
通过搜索和了解列的类型,机器学习自身完全有能力将所有数据(包括一些空值数据)转换为常见的数值类型。当然,此处并不包括对于数据的高级转换与预处理,这些仍然需要数据科学家自行采取进一步的操作。
对于目标任务而言,系统仅负责搜索和选择适当的机器学习算法。例如:根据手头的移动应用开发任务,设计自动化机器学习的算法与模型,通过对于数据的预处理,以得出所需的预算、时间、以及其他准确的结果。
通过对于数据的预处理,自动化机器学习系统能够构建并实现特征选择、降低维度、数据压缩等功能,进而无缝地执行各项训练任务。
3.找到合适的机器学习架构
上述第一、二级自动化机器学习系统,显然无法根据数据的性质,主动发现合适的机器学习架构,并通过执行,以确保出色的输出。而在第三级中,以AutoKeras为代表的开源式自动化机器学习库,实现了神经架构搜索(NAS,neural architecture search,请参见:https://en.wikipedia.org/wiki/Neural_architecture_search)。该流行架构能够有效地在图像、语音或文本上实施机器学习算法。
因此,数据科学家可以使用不同的神经架构搜索算法,来增强对于自动化机器学习的支持与经验积累。在实际应用中,自动驾驶汽车、自动化消费服务等领域都采用了第三级的自动化机器学习系统。
4.相关领域知识的使用
为了能够提供准确的机器学习系统输出,深入地了解数据,特别是数据的范围和承载的系统是非常必要的。只有使用相关领域的知识,并时刻参照所有必需考虑的标准,才能实现复杂的人工智能的效果。
可见,针对现有相关领域的知识储备和在实际场景中的使用,无疑会提高最终结果的准确性。与此同时,准确性的提高也会驱动出色的预测能力,并为自动化机器学习的各项任务提供全面的支持。因此,这个级别的成熟度模型注重的是:通过增加背景领域的相关知识,凭借具有明确结果导向(result-oriented)的记录,来提高自动化机器学习系统的准确性。
自动化机器学习的实例
从事数据科学研究的人员可以根据实际应用场景的需求,使用各种工具和软件库来开发自动化的流程、以及具有精准输出的机器学习系统。
自动化机器学习的开源库
目前,业界有着很多种类的开源库,能够支持和满足开发人员在其系统中实现各种自动化的机器学习需求。
1. AutoKeras
该软件库在GitHub上可供开发人员免费使用。由Data Lab开发的AutoKeras,旨在提供对于所有深度学习(deep learning)工具的访问,进而增强深度学习模型的整体能力。如下代码是AutoKeras的应用示例:
import autokeras as ak clf = ak.ImageClassifier() clf.fit(x_train, y_train) results = clf.predict(x_test)
Python源代码链接:https://github.com/jhfjhfj1/autokeras
2. MLBox
MLBox是另一种使用Python编写的开源库。它能够更快、更轻松地开发出自动化机器学习的各种函数,其中包含了可用于数据预处理、清理、以及格式化等功能。如下代码示例展示了在导入数据之后,如何进行数据预处理的过程:
from mlbox.preprocessing import * from mlbox.optimisation import * from mlbox.prediction import * paths = ["../input/train.csv","../input/test.csv"] target_name = "Survived" rd = Reader(sep = ",") df = rd.train_test_split(paths, target_name) #reading and preprocessing (dates, ...)
Python源代码链接:https://www.kaggle.com/axelderomblay/running-mlbox-auto-ml-package-on-titanic
3. Auto-sklearn
Auto-sklearn是另一种开源的自动化机器学习支持库。它通过选择适当的机器学习算法,来研究数据的模型和需求。它消除了用户端对于超参数处理的要求,进而能够自行开展处理工作。如下代码是在数据集上实现Auto-sklearn的应用示例:
import autosklearn.classification import sklearn.model_selection import sklearn.datasets import sklearn.metrics X, y = sklearn.datasets.load_digits(return_X_y=True) X_train, X_test, y_train, y_test = \ sklearn.model_selection.train_test_split(X, y, random_state=1) automl = autosklearn.classification.AutoSklearnClassifier() automl.fit(X_train, y_train) y_hat = automl.predict(X_test) print("Accuracy score", sklearn.metrics.accuracy_score(y_test, y_h
Python源代码链接:https://自动化机器学习.github.io/auto-sklearn/master/
自动化机器学习工具
如下工具虽然是为商业用途而发布的,但是它们不但得到了广泛地使用,而且保证了自动化机器学习的输出质量。
DataRobot
DataRobot是第一款支持自动化机器学习的工具。它提供了一个能够实现人工智能的先进平台,在协助用户解决各项问题的同时,用户可以不必过于担心其执行过程,而能够轻松地获取所需的结果。DataRobot API不但支持预测,而且能够使机器通过选择适当的方法,来实现自动化处理,并提供输出结果。
如下代码是DataRobot API的一个应用示例。它使用数据集来预测30天之内各家医院的患者可能再次入院的几率。
import datarobot as dr import pandas as pd pd.options.display.max_columns = 1000 import numpy as np import time import matplotlib.pyplot as plt from jupyterthemes import jtplot # currently installed theme will be used to set plot style if no arguments provided jtplot.style() get_ipython().magic('matplotlib inline') # load input data df = pd.read_csv('../demo_data/10kDiabetes.csv') # initialize datarobot client instance dr.Client(config_path='/Users/benjamin.miller/.config/datarobot/my_drconfig.yaml') # create 100 samples with replacement from the original 10K diabetes dataset samples = [] for i in range(100): samples.append(df.sample(10000, replace=True)) # loop through each sample dataframe for i, s in enumerate(samples): # initialize project project = dr.Project.start ( project_name='API_Test_{}'.format(i+20), sourcedata=s, target='readmitted', worker_count=2 ) # get all projects projects = [] for project in dr.Project.list(): if "API_Test" in project.project_name: projects.append(project) # *For each project...* # Make predictions on the original dataset using the most accurate model # initialize list of all predictions for consolidating results bootstrap_predictions = [] # loop through each relevant project to get predictions on original input dataset for project in projects: # get best performing model model = dr.Model.get(project=project.id, model_id=project.get_models()[0].id) # upload dataset new_data = project.upload_dataset(df) # start a predict job predict_job = model.request_predictions(new_data.id) # get job status every 5 seconds and move on once 'inprogress' for i in range(100): time.sleep(5) try: job_status = dr.PredictJob.get( project_id=project.id, predict_job_id=predict_job.id ).status except: # normally the job_status would produce an error when it is completed break # now the predictions are finished predictions = dr.PredictJob.get_predictions( project_id=project.id, predict_job_id=predict_job.id ) # extract row ids and positive probabilities for all records and set to dictionary pred_dict = {k: v for k, v in zip(predictions.row_id, predictions.positive_probability)} # append prediction dictionary to bootstrap predictions bootstrap_predictions.append(pred_dict) # combine all predictions into single dataframe with keys as ids # each record is a row, each column is a set of predictions pertaining to # a model created from a bootstrapped dataset df_predictions = pd.DataFrame(bootstrap_predictions).T # add mean predictions for each observation in df_predictions df_predictions['mean'] = df_predictions.mean(axis=1) # place each record into equal sized probability groups using the mean df_predictions['probability_group'] = pd.qcut(df_predictions['mean'], 10) # aggregate all predictions for each probability group d = {} # dictionary to contain {Interval(probability_group): array([predictions])} for pg in set(df_predictions.probability_group): # combine all predictions for a given group frame = df_predictions[df_predictions.probability_group == pg].iloc[:, 0:100] d[str(pg)] = frame.as_matrix().flatten() # create dataframe from all probability group predictions df_pg = pd.DataFrame(d) # create boxplots in order of increasing probability ranges props = dict(boxes='slategray', medians='black', whiskers='slategray') viz = df_pg.plot.box(color=props, figsize=(15,7), patch_artist=True, rot=45) grid = viz.grid(False, axis='x') ylab = viz.set_ylabel('Readmission Probability') xlab = viz.set_xlabel('Mean Prediction Probability Ranges') title = viz.set_title( label='Expected Prediction Distributions by Readmission Prediction Range', fontsize=18 )
Python源代码链接:https://blog.datarobot.com/estimation-of-prediction-distributions-using-datarobot
H2O.ai
另一款支持人工智能的服务平台工具是H2O。它主要被用于完成诸如:无人驾驶的AI结果输出等方面的机器学习任务。