自动化机器学习入门指南,来了

数据管道

共 9078字,需浏览 19分钟

 ·

2020-12-17 22:03

点击上方数据管道”,选择“置顶星标”公众号

干货福利,第一时间送达


之前的工作中也有多少接触过这个AutoML(Automated Machine Learning)的概念,简单来说就是把模型开发的标准过程模块化,都交给一些自动化的组件来完成,比如数据集的划分、特征衍生、算法选择、模型训练、调优、部署以及后续的监控,都“一条龙”地在AutoML实现。

从Google Cloud绘制的AutoML的工作原理图可以看出,我们使用者只需要给其提供数据源,以及好坏样本(或者不需要),然后后面的一切都交给AutoML组件去完成。


? AutoML的关键节点

我们可以认识到AutoML大大降低了机器学习模型的开发门槛,但是我们还是需要了解这里面的原理的,这里涉及了机器学习的几个关键节点的内容,需要我们特别关注。

其中最为重要的是自动化特征工程了,一般缩写为“Auto FE”,主要是包括了预处理、特征选择、特征提取、元学习等等的操作,把每一个环节的处理逻辑写到脚本里,结合一些策略让逻辑更加科学,结果更加合理。

第二个就是自动化模型选择,也叫Automated Model Selection,简称AMS,就是根据实际的数据来选择合适的算法。因为大多数的算法都是有超参数的,这时候AutoML是需要进行自动化的超参数优化的,英文叫做Hyperparameter Optimization,简称HPO,在学习中了解到这块的知识研究还是蛮丰富的,主要有下面的一些方法:

  • 基于贝叶斯优化的超参数优化 Bayesian Optimization
  • 基于进化算法的超参数优化 Evolutionary Algorithms
  • 基于本地搜索的超参数优化 Local Search
  • 基于随机搜索的超参数优化 Random Search
  • 基于粒子群优化算法的超参数优化 Particle Swarm Optimization
  • 基于元学习的超参数优化 Meta Learning
  • 基于迁移学习的超参数优化 Transfer Learning

还有一个概念就是NAS,即Neural Architecture Search(神经网络结构搜索),因为目前深度学习应用很广泛了,很多时候是需要搭建一个深度神经网络,这里面涉及的参数是真的多,按照传统的超参数优化的方法显得十分吃力,所以也有了这个NAS的概念,而关于NAS的研究方法,主要有下面几种:

  • 基于进化算法的超参数优化 Evolutionary Algorithms
  • 基于元学习的超参数优化 Meta Learning
  • 基于迁移学习的超参数优化 Transfer Learning
  • 基于本地搜索的超参数优化 Local Search
  • 基于强化学习的超参数优化 Reinforcement Learning
  • 基于Network Morphism
  • 基于 Continuous Optimization优化
 

? 市面上的AutoML产品

目前AutoML工具我们可以从两个途径来进行获取学习:

  • 开源框架:如Auto-Keras、Auto-sklearn等开源工具
  • 商业服务:如Google Cloud、Microsoft Azure等

从Awesome-AutoML-Papers(https://github.com/hibayesian/awesome-automl-papers#projects)里有一张AutoML工具的对比图,大家可以浏览一波。

名称支持类型编程语言
AdaNetNASPython
AdvisorHPOPython
AMLAHPO, NASPython
ATMHPOPython
AugerHPOPython
Auto-KerasNASPython
AutoML VisionNASPython
AutoML Video Intelligence
Python
AutoML Natural LanguageNASPython
AutoML TranslationNASPython
AutoML TablesAutoFE, HPOPython
auto-sklearnHPOPython
auto_mlHPOPython
BayesianOptimizationHPOPython
BayesOptHPOC++
cometHPOPython
DataRobotHPOPython
DEvolNASPython
Driverless AIAutoFEPython
FAR-HOHPOPython
H2O AutoMLHPOPython, R, Java, Scala
HpBandSterHPOPython
HyperBandHPOPython
HyperoptHPOPython
Hyperopt-sklearnHPOPython
Hyperparameter HunterHPOPython
KatibHPOPython
MateLabsHPOPython
MilanoHPOPython
MLJARHPOPython
nasbotNASPython
neptuneHPOPython
NNIHPO, NASPython
OptunityHPOPython
R2.aiHPO------
RBFOptHPOPython
RoBOHPOPython
Scikit-OptimizeHPOPython
SigOptHPOPython
SMAC3HPOPython
TPOTAutoFE, HPOPython
TransmogrifAIHPOScala
TuneHPOPython
XcessivHPOPython
SmartMLHPOR
 

? AutoML学习框架——auto-sklearn介绍与入门

这里会简单地讲一下auto-sklearn的框架,让大家对这个学习框架有一定的了解,接下来就会拿官方的栗子来说明一下怎么使用,然后罗列一下这个auto-sklearn可以做什么内容,让大家对这个框架的功能有一定的了解。

二话不说,先在本地安装一下这个包,直接pip install auto-sklearn走起,如果安装失败可能是因为缺少依赖项,可以试试:

curl https://raw.githubusercontent.com/automl/auto-sklearn/master/requirements.txt | xargs -n 1 -L 1 pip install

如果出现Failed to connect to raw.githubusercontent.com port 443: Connection refused的报错,初步估计是DNS污染,可以查看相关攻略:https://github.com/hawtim/blog/issues/10

如果安装失败,可以按照官网网站的指导再试试:https://automl.github.io/auto-sklearn/master/installation.html

相关学习传送门:

  • auto-sklearn官方文档(https://automl.github.io/auto-sklearn/master/api.html
  • auto-sklearn官方示例(https://automl.github.io/auto-sklearn/master/examples/index.html
 

我们从上面官方文档可以知道(可能需要番羽Q,所以我就把相关的example的code下载下来了,大家可以后台回复“automl”获取),auto-sklearn的功能主要有下面的截图所示,包括分类模型、回归模型的构建,模型评估方法的支持等,涵盖了我们主要的基础建模需求。

auto-sklearn顾名思义应该是和我们常用的scikit-learn有一定的关系,确实对的,auto-sklearn就是基于scikit-learn进行开发的自动化机器学习库,所以如果我们熟悉scikit-learn的使用,那么对于这个auto-sklearn就很好理解了的,不熟悉其实也没有关系,也蛮简单的,后续我拿一些小栗子来说明一下,主要围绕两个核心的分类接口和回归接口API:AutoSklearnClassifierAutoSklearnRegressor

? AutoSklearnClassifier(分类)

我们直接在官方文档里看下这个API的参数,如下图所示:

参数的数量还是蛮多的,我们简单介绍两个Parameters:

  • time_left_for_this_task:int类型,默认3600秒
    时间限制是针对模型参数搜索的,我们可以通过加大这个值来增加模型训练的时间,有更大的机会找到更好的模型。
  • per_run_time_limit:int类型, 默认值为参数time_left_for_this_task值的1/10
    这个时间限制是针对每次模型调用的,如果模型调用时间超出这个值,则会被直接终止拟合,可以适当加大这个值。

简单调用一下:

# 导入相关包
import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
import warnings
from autosklearn.classification import AutoSklearnClassifier
warnings.filterwarnings('ignore')  # 忽略代码警告

# 导入手写数字的数据集
digits = load_digits()  # 加载数据集

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    digits.data, digits.target, test_size=0.3, random_state=42)  # 切分数据集

# 调用Auto-sklearn
# 限制算法搜索最大时间,更快得到结果
auto_model = AutoSklearnClassifier(
    time_left_for_this_task=120, per_run_time_limit=10)

# 训练模型
auto_model.fit(X_train, y_train)  
# 用测试集评估模型效果
auto_model.score(X_test, y_test)

? AutoSklearnRegressor(回归)

我们继续看官方文档里的API参数,如下图所示:

参数也是照样很多,

  • time_left_for_this_task:int类型,和上面的分类API是一样的参数
  • per_run_time_limit:int类型,和上面的分类API是一样的参数
  • ensemble_size:int类型,默认是50
    从算法中选择构建为集成模型的数量

总结来说这两个API的参数几乎是一样的,正所谓一份学习double享受,jeng!同样的我们简单地调用一下,这次我们用房价预测的数据集,这是一个很经典的回归算法的数据集。

# 导入相关包
from sklearn.datasets import load_boston
from autosklearn.regression import AutoSklearnRegressor

# 导入数据集
boston = load_boston()  # 加载数据集

# 限制算法搜索最大时间,更快得到结果
auto_model = AutoSklearnRegressor(
    time_left_for_this_task=120, per_run_time_limit=10)
auto_model.fit(boston.data, boston.target)

# 查看模型效果,用R方来看
auto_model.score(boston.data, boston.target)

? Auto-sklearn支持的Metrics方法

我们评估一个机器学习模型的好坏需要量化的指标,而我们常用的几个像准确率、AUC、ROC、f1等等,在这里是否也支持呢?我们可以看看:

print("Available CLASSIFICATION metrics autosklearn.metrics.*:")
print("\t*" + "\n\t*".join(autosklearn.metrics.CLASSIFICATION_METRICS))

print("Available REGRESSION autosklearn.metrics.*:")
print("\t*" + "\n\t*".join(autosklearn.metrics.REGRESSION_METRICS))
Available CLASSIFICATION metrics autosklearn.metrics.*:
        *accuracy
        *balanced_accuracy
        *roc_auc
        *average_precision
        *log_loss
        *precision
        *precision_macro
        *precision_micro
        *precision_samples
        *precision_weighted
        *recall
        *recall_macro
        *recall_micro
        *recall_samples
        *recall_weighted
        *f1
        *f1_macro
        *f1_micro
        *f1_samples
        *f1_weighted
Available REGRESSION autosklearn.metrics.*:
        *r2
        *mean_squared_error
        *mean_absolute_error
        *median_absolute_error

我们可以看出其实大多数的评估指标都涵盖了,具体怎么用,建议可以去看看官方文档看看例子~

? AutoDL学习框架——auto-keras介绍与入门

介绍完了机器学习框架的原理以及其中一个产品的简单使用,顺便也介绍下深度学习的自动化机器学习框架,深度学习在近几年十分大热,神经网络在很多时候的表现也是让人吃惊,确实也很有必要去了解一下。

towardsdatascience.com

可以从上图看出目前最流行的深度学习框架有TensorFlow、Keras和PyTorch,今天我们不展开这些框架的学习,篇幅有限也不好展开(主要是我也不熟哈哈哈),我们今天就来讲讲Auto-Keras的简单使用,毕竟今天的主要还是自动化机器学习。

Auto-Keras框架是由DATA Lab开发的,由Keras官方团队维护。它主要提供了神经结构搜索(NAS)和超参数自动优化(HPO),其后端依赖于scikit-learn、TensorFlow和PyTorch,我们还是把一些常用的地址贴一下:

  • 官方网站:https://autokeras.com/
  • GitHub地址:https://github.com/keras-team/autokeras

安装的话也是比较简单,可以使用pip的方式进行安装,不过目前AutoKeras只支持Python >= 3.5 and TensorFlow >= 2.3.0

pip3 install git+https://github.com/keras-team/keras-tuner.git@1.0.2rc1
pip3 install autokeras

我们从官网文档里可以看出主要是支持图片分类、图片生成、文本分类、文本生成等,算是涵盖了计算机视觉和自然语言处理的常用应用场景了。

import sys
sys.path.append("autokeras")  # 链接到 Auto-Keras 库

? ImageClassifier(图片分类)

同样的,我们可以看看官方文档:

调用栗子:

我们导入自带的MNIST手写字符分类数据集,样本数据形状为28x28的灰度图像,已经转为了numpy数组。

# 导入相关包
import tensorflow as tf
from autokeras.image.image_supervised import ImageClassifier

# 加载数据集
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data()

# 实例化模型,verbose=True 输出训练过程参数
clf = ImageClassifier(verbose=True)  
# 训练模型,最大时间设为 30 分钟
clf.fit(X_train, y_train, time_limit=30 * 60)  
# 评估模型
clf.evaluate(X_test, y_test)  

那如果是针对那些数据集本身是图片的呢,又可以如何操作?也可以参考下面的例子:

# 下载图片数据
!wget -nc "https://labfile.oss.aliyuncs.com/courses/1357/load_raw_image_data.zip"
!unzip -o "load_raw_image_data.zip"  # 解压数据

# 导入相关包
import pandas as pd
from autokeras.image.image_supervised import load_image_dataset

# 读取数据
X_train, y_train = load_image_dataset(
       ="load_raw_image/train/label.csv", images_path="load_raw_image/train")
X_test, y_test = load_image_dataset(
    csv_file_path="load_raw_image/test/label.csv", images_path="load_raw_image/test")

# 实例化模型,verbose=True 输出训练过程参数
clf = ImageClassifier(verbose=True)  
# 训练模型,最大时间设为 30 分钟
clf.fit(X_train, y_train, time_limit=30 * 60)  
# 评估模型
clf.evaluate(X_test, y_test)  

? TextClassifier(文本分类)

同样的,我们可以看看官方文档:

NLP有十分丰富的应用,比如文本分类、情感分析、机器翻译、智能问答等,在Auto-Keras中也有类似的APIs可以用,我们拿其中一个文本分类预测来看看。

# 下载数据集(关于电影影评的积极与消极情绪的识别)
!wget -nc "https://labfile.oss.aliyuncs.com/courses/1357/imdb-reviews.zip"
!unzip -o "imdb-reviews.zip"

# 导入相关包
import pandas as pd
from sklearn.model_selection import train_test_split
from autokeras.text.text_supervised import TextClassifier

# 导入数据
reviews = pd.read_csv("imdb-reviews.csv")

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
    reviews['text'], reviews['sentiment'], test_size=0.1)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
# 独热编码,因为auto-kearn要求输入的为独热编码后的数组
y_train_ = pd.get_dummies(y_train).values  
y_test_ = pd.get_dummies(y_test).values

# 实例化模型,verbose=True 输出训练过程参数
clf = TextClassifier(verbose=True)  
clf.fit(X_train, y_train, time_limit=30 * 60
# 评估模型
clf.evaluate(X_test, y_test) 

(我把相关的example的code下载下来了,大家可以后台回复“automl”获取)

 

? References

  • 自动化机器学习综述——实验楼
  • Awesome-AutoML-Papers(https://github.com/hibayesian/awesome-automl-papers)
  • auto-sklearn官方文档(https://automl.github.io/auto-sklearn/master/api.html)
  • auto-sklearn官方示例(https://automl.github.io/auto-sklearn/master/examples/index.html)
  • 解决DNS污染的问题(https://github.com/hawtim/blog/issues/10)

浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报