【机器学习】一文彻底搞懂自动机器学习AutoML:H2O

机器学习初学者

共 10053字,需浏览 21分钟

 ·

2022-04-18 07:38


前面和大家一起学习了一文彻底搞懂自动机器学习AutoML:Auto-Sklearn,今天将和大家一起研习另一个AutoML框架H2O,本文从安装、实例详尽介绍框架的使用方法,最后深入研习了该框架对模型可解释部分,一起研习吧!

H2O 是一个用于分布式、可扩展机器学习的内存平台。H2O 使用熟悉的界面,如 R、Python、Scala、Java、JSON 和 Flow notebook/web 界面,并与 Hadoop 和 Spark 等大数据技术无缝协作。H2O 提供了许多流行算法的实现,例如广义线性模型 (GLM)、梯度提升机(包括 XGBoost)、随机森林、深度神经网络、堆叠集成、朴素贝叶斯、广义加性模型 (GAM)、Cox 比例风险、K- Means、PCA、Word2Vec,以及全自动机器学习算法(H2O AutoML)。

安装

自动化机器学习H2O

从命令行下载并运行

如果计划专门使用 H2O 的 Web GUI Flow[4],那么应该使用这种方法。

  1. 单击h2o下载[5]页面上的按钮。这会下载一个 zip 文件,其中包含你开始使用所需的所有内容。Download H2O
  2. 从你的终端,解压缩并启动 H2O,如下例所示。
cd ~/Downloads
unzip h2o-3.30.0.6.zip
cd h2o-3.30.0.6
java -jar h2o.jar
  1. 将浏览器指向http://localhost:54321以打开 H2O Flow Web GUI。

python

在终端窗口中运行以下命令以安装 H2O for Python。

  1. 安装依赖项(如果需要,在前面加上sudo):
pip install requests
pip install tabulate
pip install future

注意:这些是运行 H2O 所需的依赖项。完整的依赖项列表保存在以下文件中:https[6] ://github.com/h2oai/h2o-3/blob/master/h2o-py/conda/h2o/meta.yaml 。

  1. 用于pip安装此版本的 H2O Python 模块。
pip install -f http://h2o-release.s3.amazonaws.com/h2o/latest_stable_Py.html h2o

还需要安装Java环境,因为底层是Java所写,

导入数据

这里使用kaggle中Titanic数据为分析例子。详情可参见kaggle泰坦尼克案例[7]

import h2o
import pandas as pd
h2o.init()

# h2o导入方式
# train_1 = h2o.import_file("/kaggle/input/titanic/train.csv")
# test_1 = h2o.import_file("/kaggle/input/titanic/test.csv")

# pandas导入方式
train = pd.read_csv('/kaggle/input/titanic/train.csv')
test = pd.read_csv('/kaggle/input/titanic/test.csv')

数据处理

如果你是个新手,刚开始接触数据预处理,建议可以试试H2O。如下一些常用的操作,官网上都是有例子的:

上传文件
导入文件
导入多个文件
下载数据
更改列类型
合并来自两个数据集的列
合并来自两个数据集的行
填写 NA
通过...分组
输入数据
合并两个数据集
透视表
替换框架中的值
切片列
切片行
对列进行排序
将数据集拆分为训练/测试/验证
标记字符串

H2O 也有特征工程的方法。目标编码是一种分类编码技术,它用目标变量的平均值替换分类值(对于高基数特征特别有用)。Word2vec 是一种文本处理方法,它将文本语料库转换为词向量的输出。

本例子中,使用惯用的pandas进行相关分析。

train_indexs = train.index
test_indexs = test.index
print(len(train_indexs), len(test_indexs))
# (891, 418)

df =  pd.concat(objs=[train, test], axis=0).reset_index(drop=True)
df = df.drop('PassengerId', axis=1)
train = df.loc[train_indexs]
test = df[len(train_indexs):]
test = test.drop(labels=["Survived"], axis=1)

AutoML

H2O是简化机器学习的第一步,涉及为各种机器学习算法开发简单、统一的接口。

H2O 的 AutoML 可用于自动化机器学习工作流程,其中包括在用户指定的时间限制内自动训练和调整许多模型。

H2O 提供了许多适用于AutoML对象以及单个模型的模型可解释性方法。可以通过单个函数调用自动生成解释,提供一个简单的界面来探索和解释 AutoML 模型。

必需参数

所需数据参数

  • y:此参数是目标变量列的名称(或索引)
  • training_frame:指定训练集。

所需的停止参数

必须指定以下停止策略之一(基于时间或模型数量)。设置这两个选项后,AutoML 运行将在达到这些限制之一时立即停止。

  • max_runtime_secs:此参数指定 AutoML 进程将运行的最长时间。默认值为 0(无限制),但如果用户未指定 max_runtime_secsmax_models 指定,则动态设置为 1 小时。
  • max_models:指定在 AutoML 运行中构建的最大模型数,不包括 Stacked Ensemble 模型。默认为 NULL/None。

部分可选数据参数

  • x:预测列名称或索引的列表/向量。仅当用户想要从一组预测变量中排除列时才需要指定此参数。如果在预测中应使用所有列(除了目标变量),则不需要设置。
  • validation_frame:若nfolds == 0,不然此参数将被忽略。可以指定一个验证frame,并用于提前停止单个模型和提前停止网格搜索(除非max_models或max_runtime_secs覆盖基于指标的提前停止)。默认情况下,当nfolds > 1时,交叉验证指标将用于早期停止,因此validation_frame将被忽略。
  • leaderboard_frame:此参数允许用户指定一个特定的数据框,用于在排行榜上对模型进行评分和排名。除了排行榜得分外,该框架不会用于任何其他用途。如果用户未指定排行榜框架,则排行榜将使用交叉验证指标,或者如果通过设置nfolds = 0关闭交叉验证,则将从训练框架自动生成排行榜框架。
  • blending_frame:指定用于计算预测的框架,作为 Stacked Ensemble 模型 metalearner 的训练框架。如果提供,所有由 AutoML 生成的 Stacked Ensemble 都将使用 Blending(又名 Holdout Stacking)而不是基于交叉验证的默认 Stacking 方法进行训练。
  • fold_column:指定每个观察具有交叉验证折叠索引分配的列。这用于覆盖 AutoML 运行中各个模型的默认、随机、5 折交叉验证方案。
  • weights_column:指定具有观察权重的列。将某些观察值赋予零权重相当于将其从数据集中排除;给一个观察相对权重 2 相当于重复该行两次。
from h2o.automl import H2OAutoML

hf = h2o.H2OFrame(train)
test_hf = h2o.H2OFrame(test)
hf.head()

# 选择预测变量和目标
hf['Survived'] = hf['Survived'].asfactor()
predictors = hf.drop('Survived').columns
response = 'Survived'

# 切分数据集,添加停止条件参数为最大模型数和最大时间,然后训练
train_hf, valid_hf = hf.split_frame(ratios=[.8], seed=1234)
aml = H2OAutoML(
    max_models=20,
    max_runtime_secs=300,
    seed=1234,
)

aml.train(x=predictors,
        y=response,
        training_frame=hf,
)
ModelMetricsBinomialGLM: stackedensemble
** Reported on train data. **

MSE: 0.052432901181573156
RMSE: 0.22898231630755497
LogLoss: 0.19414205126074563
Null degrees of freedom: 890
Residual degrees of freedom: 885
Null deviance: 1186.6551368246774
Residual deviance: 345.9611353466487
AIC: 357.9611353466487
AUC: 0.9815107745076109
AUCPR: 0.9762820080059409
Gini: 0.9630215490152219
lb = aml.leaderboard
lb.head(rows=5)
model_id	auc	logloss	aucpr	mean_per_class_error	rmse	mse
StackedEnsemble_BestOfFamily_4_AutoML_1_20211228_171936 0.880591 0.389491 0.868648 0.170573 0.346074 0.119767
GBM_5_AutoML_1_20211228_171936 0.880452 0.392546 0.87024 0.172323 0.347309 0.120624
StackedEnsemble_BestOfFamily_5_AutoML_1_20211228_171936 0.879773 0.391389 0.867679 0.175702 0.347747 0.120928
StackedEnsemble_AllModels_2_AutoML_1_20211228_171936 0.879339 0.395392 0.866278 0.175774 0.348615 0.121533
StackedEnsemble_BestOfFamily_3_AutoML_1_20211228_171936 0.878607 0.394689 0.86662 0.178339 0.348864 0.121706
valid_pred = aml.leader.predict(valid_hf)
metrics.accuracy_score(valid_pred.as_data_frame()['predict'], valid_hf.as_data_frame()['Survived'])
0.9441340782122905

模型可解释性

我们使用来自Kaggle的著名 Teleco Churn Dataset [8]来解释可解释性接口。数据集混合了数字变量和分类变量,我们感兴趣的变量是“流失”,用于识别上个月内离开的客户。我们使用原始格式的数据集,因为我们的重点是解释模型而不是模型性能。

h2o.explain()

输出解释模型

解释多个模型

h2o.explain()提供模型列表时,将默认生成以下全局解释:

  • 排行榜(比较所有模型)
  • Leader模型的混淆矩阵(仅限分类)
  • Leader模型的残差分析(仅限回归)
  • 排行榜顶部基础模型(非堆叠)的重要性
  • 变量重要性热图(比较所有非堆叠模型)
  • 模型相关热图(比较所有模型)
  • 基于顶层树模型(TreeSHAP)的SHAP总结
  • 部分依赖多图 (PD) (比较所有模型)
  • 个体条件期望图 (ICE)

解释单个模型

h2o.explain()提供单个模型时,我们得到以下全局解释:

  • 混淆矩阵(仅限分类)
  • 残差分析(仅限回归)
  • 变量重要性
  • 部分依赖图 (PD)
  • 个体条件期望图 (ICE)

解释绘图功能

函数内部使用了许多单独的绘图explain()函数。其中一些函数将一组模型作为输入,而其他函数一次只评估一个模型。

残差分析

残差分析在测试数据集上绘制拟合值与残差。理想情况下,残差应该是随机分布的。此图中的模式可以指示模型选择的潜在问题,例如,使用比必要更简单的模型,不考虑异方差、自相关等。

ra_plot = model.residual_analysis_plot(test)
explain_residual_analysis_wine

变量重要性

变量重要性图显示了模型中最重要变量的相对重要性。

该图显示了模型中最重要变量的相对重要性。H2O 在 0 和 1 之间缩放后显示每个特征的重要性。变量重要性是通过每个变量的相对影响来计算的,主要用于像随机森林这样的基于树的模型:在构建树时是否选择了该变量进行拆分,以及平方误差(整体树)作为结果。

ra_plot = model.varimp_plot()
explain_varimp_wine

解释这个图很简单。具有最长条的变量(也就是最顶部的)是最重要的,而具有最短条的变量(也就是最底部的)是最不重要的。

变量重要性热图

变量重要性热图显示了多个模型中的重要变量。默认情况下,模型和变量按相似度排序。

H2O 中的一些模型为分类列的单热(二进制指示符)编码版本(例如深度学习、XGBoost)返回可变重要性。为了在所有模型类型中比较分类列的变量重要性,我们计算所有 one-hot 编码特征的变量重要性的汇总,并返回原始分类特征的单个变量重要性。

va_plot = aml.varimp_heatmap()

# 或者如果需要一些模型的子集,就可以使用积分排行榜的一部分,
# 例如,使用MAE作为排序指标
va_plot = h2o.varimp_heatmap(aml.leaderboard.sort("mae").head(10))

# 甚至可以使用扩展排行榜
va_plot = h2o.varimp_heatmap(
   h2o.automl.get_leaderboard(
        aml,extra_columns="training_time_ms"
    ).sort("training_time_ms").head(10))
explain_varimp_heatmap_wine

解释

我们可以看颜色越深(红色),对应模型的变量的重要性就越高。即“alcihol”变量对所有 GBM / XGBoost 模型都比较重要,“type”对大多数模型并不重要。

模型相关热图

该图显示了模型预测之间的相关性。对于分类任务,使用相同预测的频率。默认情况下,模型按相似度排序(通过层次聚类计算)。GAM、GLM 和 RuleFit 等可解释模型使用红色文本突出显示。

mc_plot = aml.model_correlation_heatmap(test)

# 或者如果需要一些模型的子集,就可以使用积分排行榜的一部分,
# 例如,使用MAE作为排序指标
mc_plot = h2o.model_correlation_heatmap(
  aml.leaderboard.sort("mae").head(10), test)

# 甚至可以使用扩展排行榜
mc_plot = h2o.model_correlation_heatmap(
  h2o.automl.get_leaderboard(aml,
                             extra_columns="training_time_ms"
                            ).sort("training_time_ms").head(10), test)

# 也可以在排行榜上使用更复杂的查询,
# 例如,5个最快的模型之间的模型相关性训练和堆叠整体
leaderboard = h2o.automl.get_leaderboard(aml, extra_columns="training_time_ms").sort("training_time_ms")
mc_plot = h2o.model_correlation_heatmap(
  leaderboard.head(5).rbind(leaderboard[leaderboard["model_id"].grep("StackedEnsemble", output_logical=True)]), test)
explain_model_correlation_heatmap_wine

我们可以看到属于同一家族的模型之间具有较强的相关性。颜色越深(红色),两个模型之间的相关性越强。

SHAP 总结图

SHAP 值是SHapley Additive exPlanations的首字母缩写词,它解释了给定变量具有特定值的影响,与如果该变量取某个基线值而我们所做的预测相比。如果你对SHAP不是很熟悉,推荐你查看👇:  
用 SHAP 可视化解释机器学习模型实用指南(上)
用 SHAP 可视化解释机器学习模型实用指南(下)

shap_plot = model.shap_summary_plot(test)
explain_shap_summary_wine
  • y轴表示变量名,通常按照从上到下的重要性降序排列。
  • x轴上的SHAP值表示log-odds的变化。从这个值中,我们可以提取事件的概率(在本例中是churn)。
  • 渐变颜色表示该变量的原始值。在二元分类问题中(如我们的例子),它将使用两种颜色,但它可以包含数值目标变量的整个光谱(回归问题)。
  • 图中的每个点表示来自原始数据集的一条记录。

SHAP 局部解释

SHAP 解释显示了给定实例的特征的贡献。特征贡献和偏置项之和等于模型的原始预测,即应用反向链接函数之前的预测。H2O 实现了 TreeSHAP,当特征相关时,可以增加对预测没有影响的特征的贡献。

shapr_plot = model.shap_explain_row_plot(test, row_index=0)
explain_row_shap_row1

部分依赖图(PDP)

虽然变量重要性显示了哪些变量对预测的影响最大,但部分依赖图显示了变量如何影响预测。对于那些熟悉线性或回归模型的人来说,PD 图的解释与这些回归模型中的系数类似。

部分依赖图 (PDP) 以图形方式描述变量对响应的边际效应。变量的影响是通过平均响应的变化来衡量的。它假定计算 PDP 的特征与其他特征之间是独立的。

pd_plot = aml.pd_multi_plot(test, column)

# 或者如果需要一些模型的子集,就可以使用积分排行榜的一部分,
# 例如,使用MAE作为排序指标
pd_plot = h2o.pd_multi_plot(aml.leaderboard.sort("mae"),
                            test, column)
explain_pd_multiplot_wine_alcohol

部分依赖单模型图

这个可以回答该问题:控制所有其他特征,alcohol对红酒质量有什么影响?

pd_plot = model.pd_plot(test, column)
explain_pd_plot_wine_alcohol

单模型、单行、PD 图

pd_plot = model.pd_plot(test, column, row_index=0)
explain_row_ice_plot_wine_alcohol_row1

个体条件期望 (ICE) 图

单个条件期望 (ICE) 图以图形方式描述了变量对响应的边际影响。ICE 图类似于部分依赖图(PDP);PDP 显示变量的平均影响,而 ICE 图显示单个实例的影响。此函数将绘制每个十分位数的影响。

虽然 PDP 简单易懂,但这种简单性隐藏了各个实例之间潜在的有趣关系。例如,如果一个实例子集的特征值趋于负,而另一个子集趋于正,则平均过程可能会抵消它们。

ICE地块解决了这个问题。ICE 图展开曲线,这是 PDP 中聚合过程的结果。每条 ICE 曲线不是对预测进行平均,而是显示改变实例特征值的预测。当在单个图中一起呈现时,它显示了实例子集之间的关系以及各个实例行为方式的差异。

ice_plot = model.ice_plot(test, column)
explain_ice_plot_wine_alcohol

学习曲线

学习曲线图显示了误差度量对学习进度的依赖性(例如 RMSE 与迄今为止在 GBM 中训练的树的数量)。该图可以帮助诊断模型是过拟合还是欠拟合——在理想情况下,训练曲线和验证曲线会收敛。最多可以有 4 条曲线显示错误,并且将绘制所有可用的指标:

  • 训练
  • 验证(validation_frame设置时可用)
  • CV 模型训练(在nfolds>1时可用)
  • 交叉验证(在nfolds>1时可用)
learning_curve_plot = model.learning_curve_plot()
explain_learning_curve_plot_airlines

保存和导入模型

# 构建模型
model = H2ODeepLearningEstimator(params)
model.train(params)

# 保存模型
model_path = h2o.save_model(model=model, path="/tmp/mymodel", force=True)
print(model_path)
>>> /tmp/mymodel/DeepLearning_model_python_1441838096933

# 导入模型
saved_model = h2o.load_model(model_path)

# 将上面构建的模型下载到本地机器
my_local_model = h2o.download_model(model, path="/Users/UserName/Desktop")

# 上传你刚才下载的模型
# to the H2O cluster
uploaded_model = h2o.upload_model(my_local_model)

参考资料

[1]

GitHub地址: https://github.com/h2oai/h2o-3

[2]

Download地址: http://h2o-release.s3.amazonaws.com/h2o/latest_stable.html

[3]

Document地址: https://docs.h2o.ai/h2o/latest-stable/h2o-docs/index.html

[4]

Flow: http://docs.h2o.ai/h2o/latest-stable/h2o-docs/flow.html

[5]

h2o下载: http://h2o-release.s3.amazonaws.com/h2o/latest_stable.html

[6]

https: https://github.com/h2oai/h2o-3/blob/master/h2o-py/conda/h2o/meta.yaml

[7]

kaggle泰坦尼克案例: https://www.kaggle.com/code/andreshg/titanic-dicaprio-s-safety-guide-h2o-automl/notebook

[8]

Teleco Churn Dataset : https://www.kaggle.com/blastchar/telco-customer-churn


往期精彩回顾




浏览 51
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报