前面小猴子和大家一起学习了一文彻底搞懂自动机器学习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
机器学习合集👇
长按👇关注-机器学习研习院-设为星标-干货速递
继续阅读
阅读原文