如何使用Auto-Sklearn和Auto-PyTorch自动化机器学习通常,机器学习的进步与软件和自动化的深入迭代密切相关。只要人类的某个活动需要依赖计算机进行重复和判断处理,我们就可以通过机器学习来实现和实施。当然,面对各种不确定的待解决问题,我们需要通过定义搜索空间和特定的学习算法来训练计算机进行判断和解决。目前机器学习已经进入2.0时代,深度学习有效。他们不仅可以更好地预测蛋白质模型的数据拟合度,还可以在围棋、DotaII、星际争霸II等比赛中击败职业人类玩家,并创造出各种非常连贯的文本和语音交互响应。您可以点击链接了解更多关于机器学习对不同行业的影响。当然,这些也离不开各种名为AutoML的开源工具,以及ML在实际应用中的优秀实践。什么是自动机器学习?AutoML作为一大类技术和工具,可以应用于各种自动化搜索和学习场景。例如,我们将贝叶斯优化应用于统计学习算法的超参数,或将深度学习模型应用于神经架构的搜索。这些多样化的生态系统目前在AutoML.ai中进行了分类。其中最著名的AutoML包之一是:Auto-SciKit-Learn(或Auto-Sklearn)。它旨在表彰2014年至2016年ChaLearnAutoML挑战赛的获胜者。Auto-Sklearn由德国的一个自动化机器学习研究小组开发。作为一个Python包,Auto-Sklearn被构建为紧密遵循SciKit-Learn的使用模式,这就是它被命名为“Auto-SciKit-Learn”的原因。除了Auto-Sklearn,位于弗莱堡-汉诺威的AutoML小组还开发了Auto-PyTorch库。在下面的简单示例中,我们将使用这两个代码库作为AutoML的入口点。AutoML演示首先,让我们设置所需的包和依赖项。在这里,我们使用Python3的virtualenv来管理演示项目的虚拟环境。当然,你也可以使用Anaconda(译者注:一个开源的Python发行版)和pip,它们的工作方式都差不多。下面是在Ubuntu等基于Unix的系统上设置运行时环境的各种命令。如果您使用的是Windows,则可以通过在Anaconda提示符下输入命令来设置环境。尽管Auto-Sklearn的文档建议用户从其requirements.txt依赖项进行安装,但这对于本示例中的代码而言并不是必需的。#createandactivateanewvirtualenvironmentvirtualenvautoml--python=python3sourceautoml/bin/activate#installauto-sklearnpipinstallauto-sklearn值得注意的是,如果两个AutoML库使用相同的环境,那么可能会发生冲突。所以我们需要为Auto-PyTorch创建第二个环境。而且这个环境下的Python应该不低于3.7版本。deactivatevirtualenvautopt--python=python3.7sourceautopt/bin/activate#installauto-pytorchfromthegithubrepogitclonehttps://github.com/automl/Auto-PyTorch.gitcdAuto-PyTorchpipinstall-e.pipinstallnumpy==1.20.0pipinstalllipython我们正在运行上面的pipinstall-e,以及下面的两个install语句,你可能会遇到如下奇怪的错误。经过研究,我们可以通过将NumPy版本升级到1.20.0来修复它。ValueError:numpy.ndarraysizechanged,mayindicatebinaryincompatibility.Expected88fromCheader,got80fromPyObject如果你想为项目做贡献,或者想查看最新的运行代码,请查看下面的开发分支。#(可选)gitcheckoutdevelopment#makesuretoswitchbacktotheprimarybranchforthetutorialgitcheckoutmaster由于此示例的其余部分是用Python编写的,因此请启用Python提示符、Jupyter笔记本或文本编辑器。此示例将包含使用标准SciKit-Learn、Auto-Sklearn和Auto-PyTorch分类器进行基本分类的演示。我们将为每个场景使用SciKit-Learn中的单个内置数据集。每个demo通过共享代码导入公共依赖,加载和拆分对应的数据集。导入时间导入sklearnimportsklearn.datasets#**loadandsplitdata**data,target=sklearn.datasets.load_iris(return_X_y=True)#splitn=int(data.shape[0]*0.8)train_x=data[:n]train_y=target[:n]test_x=data[n:]test_y=target[n:]上面用于设置数据集的代码将用于此示例中的每个演示模块。为了节省时间,我们使用小型“iris”数据集(包括:150个样本、4个特征和3个标签类别)。阅读此示例后,您可以自由试验更复杂的数据集。sklearn.datasets的其他分类数据集包括:糖尿病(load_diabetes)数据集和数字数据集(load_digits)。其中,糖尿病数据集有569个样本,每个样本有30个特征和2个标签类别;数字数据集有1797个样本,每个样本有64个特征(对应于8x8图像)和10个标签类别。在我们开始使用sklearn的AutoML分类器之前,让我们使用默认设置从vanillasklearn训练各种标准化分类器。虽然我们有很多选择,但我们将坚持使用k最近邻分类器、支持向量机分类器和多层感知器。#importclassifiersfromsklearn.svmimportSVCfromsklearn.neural_networkimportMLPClassifierfromsklearn.neighborsimportKNeighborsClassifier#instantiatewithdefaultparametersknn=KNeighborsClassifier()mlp=MLPClassifier()svm=SVC()SciKit-Learn通过使用友好的API(ctf)使训练/拟合/预测变得轻而易举。同时,Auto-Sklearn和Auto-PyTorch这两个软件包也保留了相同的API,这使得三者之间的任何训练模型不仅相似,而且易于使用。t0=time.time()knn.fit(train_x,train_y)mlp.fit(train_x,train_y)svm.fit(train_x,train_y)t1=time.time()同理,各种模型的评估比较简单。SciKit-Learn分类模型提供了一种预测方法,可用于获取输入数据,预测标签,然后将其传递给sklearn.metrics.accuracy_score以计算准确率。下面的代码使用k最近邻、支持向量机和在最后一个代码片段中训练的多层感知器分类器计算holdout测试集的各种预测和预测精度。sklearn.metrics.accuracy_score(test_y,knn_predict)train_knn_accuracy=sklearn.metrics.accuracy_score(train_y,train_knn_predict)svm_accuracy=sklearn.metrics.accuracy_score(test_y,svm_predict)train_svm_accuracy=sklearn.metrics.accuracy_score(train_y,train_knn_predict)metrics.accuracy_score(test_y,mlp_predict)train_mlp_accuracy=sklearn.metrics.accuracy_score(train_y,train_mlp_predict)print(f"svm,knn,mlptestaccuracy:{svm_accuracy:.4f},"\f"{knn_accuracy:.4},{mlp_accuracy:.4}")print(f"svm,knn,mlptrainaccuracy:{train_svm_accuracy:.4f},"\f"{train_knn_accuracy:.4},{train_mlp_accuracy:.4}")print(f"timetofit:{t1-t0}")Sklearnclassifiersontheirisdataset这些模型对于鸢尾花训练数据集非常有效,但仍然介于训练集和测试集之间有了这个显着的差距,让我们使用autosklearn.classification中的AutoSKlearnClassifier类来搜索多种类型的机器学习模型的超参数并保留最佳拟合集。如以下代码片段所示,在引入了通用导入并设置了训练和测试数据集的拆分之后,我们需要导入并实例化AutoML分类器。importautosklearnfromautosklearn.classificationimportAutoSklearnClassifierasASCclassifier=ASC()classifier.time_left_for_this_task=300t0=time.time()classifier.fit(train_x,train_y)t1=time.time()autosk_predict=classifier.predict(test_xtotrain_autoskifer.tra_predict=aut_x)=sklearn.metrics。accuracy_score(\test_y,autosk_predict\)train_autosk_accuracy=sklearn.metrics.accuracy_score(\Train_y,train_autosk_predict\)print(f"testaccuracy{autosk_2_accuracy:.4f}")print(cy"trainaccuracy{train_autosk_2_fcur}")print(f"timetofit:{t1-t0}")Auto-Sklearnclassifierintegrationonirisdataset如果不设置time_left_for_this_task的默认值(3600秒,即一小时),则with有AutoSklearnClassifier的fit方法,运行起来非常耗时。显然,这对于一个简单的鸢尾花数据集来说是不可接受的。出于这个原因,包的配套文档提到在初始化分类器对象时应将时间限制设置为输入参数。当然,您也可以在启用交叉验证的情况下运行fit方法。为此,您需要使用refit方法、最佳模型和超参数对整个训练数据集进行重新训练。在实践中,我们发现当使用交叉验证和改装时,与默认设置相比,测试集上的准确率从80%略微提高到86.67%(见下表)。值得注意的是,在使用预测方法拟合AutoSklearnClassifier对象后,我们的推理过程使用了在AutoML超参数搜索期间找到的最佳模型集。最后,让我们讨论另一个适用于深度学习的AutoML包:Auto-PyTorch。与Auto-Sklearn类似,Auto-PyTorch非常容易学习。在运行下面的代码片段之前,请切换到Auto-PyTorch环境以确保有合适的依赖项可用。importautoPyTorchfromautoPyTorchimportAutoNetClassificationasANCmodel=ANC(max_runtime=300,min_budget=30,max_budget=90,cuda=False)t0=time.time()model.fit(train_x,train_y,validation_split=0.1)t1=time.time()auto_predict=模型.预测(test_x)train_auto_predict=model.predict(train_x)auto_accuracy=sklearn.metrics.accuracy_score(test_y,auto_predict)train_auto_accuracy=sklearn.metrics.accuracy_score(train_y,train_auto_predict)打印(f“auto-pytorch:test_accuracy}”)打印(f"auto-pytorchtrainaccuracy{train_auto_accuracy:.4}")将常用的imports导入并拆分数据后,可以看到:Auto-PyTorchclassifierontheirisdataset从上面的结果来看,Auto-PyTorch在iris数据集上的拟合效率很高数据集,产生高达90秒的训练和测试精度。这比我们之前训练的自动化SciKit-Learn分类器,以及带有默认参数的标准化sklearn分类器要好得多。总结总之,AutoML的价值主要源于超参数搜索的自动化方面。AutoML的附加抽象层和自动超参数搜索将提高经典数据科学和机器学习工作流程的实用性、性能和效率。如果使用得当,AutoML工具不仅可以提高应用程序性能,还可以减少超参数的冗长程度,并使架构搜索更具成本效益。目前,AutoML包,如Auto-Sklearn、Auto-PyTorch、Auto-WEKA等,可以成为任何机器学习或数据科学工具的有力补充。其中Auto-PyTorch已经获得了Apache2.0许可,Auto-Sklearn也可以使用BSD3-Clause许可。当然,为了让这两个包工作,我们需要将NumPy升级到1.20.0,以及其他各种小修复。原标题:AutoML:UsingAuto-SklearnandAuto-PyTorch,作者:KevinVu
