【机器学习】一文彻底搞懂自动机器学习AutoML:H2O
前面和大家一起学习了一文彻底搞懂自动机器学习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 的 Web GUI Flow[4],那么应该使用这种方法。
单击h2o下载[5]页面上的按钮。这会下载一个 zip 文件,其中包含你开始使用所需的所有内容。 Download H2O
从你的终端,解压缩并启动 H2O,如下例所示。
cd ~/Downloads
unzip h2o-3.30.0.6.zip
cd h2o-3.30.0.6
java -jar h2o.jar
将浏览器指向 http://localhost:54321
以打开 H2O Flow Web GUI。
python
在终端窗口中运行以下命令以安装 H2O for Python。
安装依赖项(如果需要,在前面加上 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 。
用于 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_secs
和max_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)
变量重要性
变量重要性图显示了模型中最重要变量的相对重要性。
该图显示了模型中最重要变量的相对重要性。H2O 在 0 和 1 之间缩放后显示每个特征的重要性。变量重要性是通过每个变量的相对影响来计算的,主要用于像随机森林这样的基于树的模型:在构建树时是否选择了该变量进行拆分,以及平方误差(整体树)作为结果。
ra_plot = model.varimp_plot()
解释这个图很简单。具有最长条的变量(也就是最顶部的)是最重要的,而具有最短条的变量(也就是最底部的)是最不重要的。
变量重要性热图
变量重要性热图显示了多个模型中的重要变量。默认情况下,模型和变量按相似度排序。
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))
解释
我们可以看颜色越深(红色),对应模型的变量的重要性就越高。即“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)
我们可以看到属于同一家族的模型之间具有较强的相关性。颜色越深(红色),两个模型之间的相关性越强。
SHAP 总结图
SHAP 值是SHapley Additive exPlanations的首字母缩写词,它解释了给定变量具有特定值的影响,与如果该变量取某个基线值而我们所做的预测相比。如果你对SHAP不是很熟悉,推荐你查看👇:
用 SHAP 可视化解释机器学习模型实用指南(上)
用 SHAP 可视化解释机器学习模型实用指南(下)
shap_plot = model.shap_summary_plot(test)
y轴表示变量名,通常按照从上到下的重要性降序排列。 x轴上的SHAP值表示log-odds的变化。从这个值中,我们可以提取事件的概率(在本例中是churn)。 渐变颜色表示该变量的原始值。在二元分类问题中(如我们的例子),它将使用两种颜色,但它可以包含数值目标变量的整个光谱(回归问题)。 图中的每个点表示来自原始数据集的一条记录。
SHAP 局部解释
SHAP 解释显示了给定实例的特征的贡献。特征贡献和偏置项之和等于模型的原始预测,即应用反向链接函数之前的预测。H2O 实现了 TreeSHAP,当特征相关时,可以增加对预测没有影响的特征的贡献。
shapr_plot = model.shap_explain_row_plot(test, row_index=0)
部分依赖图(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)
部分依赖单模型图
这个可以回答该问题:控制所有其他特征,alcohol对红酒质量有什么影响?
pd_plot = model.pd_plot(test, column)
单模型、单行、PD 图
pd_plot = model.pd_plot(test, column, row_index=0)
个体条件期望 (ICE) 图
单个条件期望 (ICE) 图以图形方式描述了变量对响应的边际影响。ICE 图类似于部分依赖图(PDP);PDP 显示变量的平均影响,而 ICE 图显示单个实例的影响。此函数将绘制每个十分位数的影响。
虽然 PDP 简单易懂,但这种简单性隐藏了各个实例之间潜在的有趣关系。例如,如果一个实例子集的特征值趋于负,而另一个子集趋于正,则平均过程可能会抵消它们。
ICE地块解决了这个问题。ICE 图展开曲线,这是 PDP 中聚合过程的结果。每条 ICE 曲线不是对预测进行平均,而是显示改变实例特征值的预测。当在单个图中一起呈现时,它显示了实例子集之间的关系以及各个实例行为方式的差异。
ice_plot = model.ice_plot(test, column)
学习曲线
学习曲线图显示了误差度量对学习进度的依赖性(例如 RMSE 与迄今为止在 GBM 中训练的树的数量)。该图可以帮助诊断模型是过拟合还是欠拟合——在理想情况下,训练曲线和验证曲线会收敛。最多可以有 4 条曲线显示错误,并且将绘制所有可用的指标:
训练 验证( validation_frame
设置时可用)CV 模型训练(在 nfolds>1
时可用)交叉验证(在 nfolds>1
时可用)
learning_curve_plot = model.learning_curve_plot()
保存和导入模型
# 构建模型
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)
参考资料
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
往期精彩回顾
适合初学者入门人工智能的路线及资料下载 (图文+视频)机器学习入门系列下载 中国大学慕课《机器学习》(黄海广主讲) 机器学习及深度学习笔记等资料打印 《统计学习方法》的代码复现专辑 AI基础下载 机器学习交流qq群955171419,加入微信群请扫码: