H2O AutoML是一个自动机器学习库,用于自动化机器学习工作流程,包括在用户指定的时间限制内自动训练和调整多个模型。它可以帮助用户快速构建高性能的预测模型,适用于各种应用场景,例如金融、医疗、电商等领域的预测分析。
官方地址:
1. AutoML配置详解
H2O的AutoML作为一个统一机器学习封装接口的工具,可以很方便地自动从输入数据中学习特征,并自动根据特征可以自动交叉验证进行集成学习,生成的集成模型可以避免单一模型过拟合的问题,可以更加准确地用于数据预测分析。但是使用上有一些特别的说明需要注意,以下是详细H2O的详细说明,以Python为例,此处不涉及R语言内容。
1.1 启动训练任务
由于H2O是依托于Java开发的H2O训练程序的,并且通过接口与脚本进行交互,因此,在Python环境中使用需要先启动H2O服务,再进行训练任务,以下是一个推荐写法的格式。
# 引入工具获取当前运行环境内存大小
import psutil
total_momory_bytes = psutil.virtual_memory().total
memory_80_percent_gb = int(total_momory_bytes * 0.8 / (1024 ** 3))
h2o.init(max_mem_size_GB=memory_80_percent_gb, min_mem_size_GB=memory_80_percent_gb)
try:
# 训练主函数封装
main()
finally:
h2o.cluster().shutdown()
注意事项:
需要引入
pstuil
进行自动识别系统内存,因为H2O是基于Java作为服务端,默认是使用系统最大的四分之一内存作为运行内存,默认设置可能导致H2O服务运行内存不够,而降低训练性能,在进行模型预测时也会因为内存不够而报错;因此在此设置默认最大80%运行内存作为H2O服务端的内存,预留20%用于Python程序执行。内存比例可以适当调整,如果读取的数据文件特别大,则Python预留内存可以适当提高一点。
1.1 训练数据输入
H2O支持两种方式进行数据输入处理,其中一种是以Pandas格式直接进行数据处理后再输入到H2O的服务,另一种方式则是直接输入H2O后以数据格式进行处理,前者可以利用Pandas的优势进行处理,后者可以根据H2O封装后的数据集优势进行处理,但是最终训练时都需要传入H2O服务以H2O格式的数据集进行训练
H2O在进行训练时并不支持常数列进行训练,否则会在训练的时候不断去除常数列,因此在训练前应该提前去除常数列,以保证训练效率。
H2O对于未命名的列,会自动以C1、C2、C3等命名,因此可以提前去除(常见于序号列没有命名)。
# 以Pandas格式读取后,并以pandas格式进行预处理
df = pd.read_csv('input_path')
df = preprocess_datasets(df, data_type)
# 转为h2o格式的数据集
datasets = h2o.H2OFrame(df)
# 直接使用h2o读取为数据集
datasets = h2o.import_file(path='input_path')
# 初始化列表以存储常量列名
constant_columns = []
# 遍历每一列,检查是否为常量列
for col in datasets.columns:
unique_vals = datasets[col].unique()
if unique_vals.nrow == 1:
constant_columns.append(col)
# 删除序号列
if 'C1' in datasets.columns:
datasets = datasets.drop("C1")
# 删除常量列
if constant_columns:
datasets = datasets.drop(constant_columns)
1.2 训练集与测试集切分
H2O支持以下两种测试与训练集切分的方式:
按照一定比例对数据进行切分(与传统机器学习方式一致),需要单独传入测试集进行切分
注意:这种方式需要将nfolds=0设置为禁用,否则只会作为评分,并不会作为验证集训练,并且不支持集成模型训练
集成模型:根据内部折叠列作为验证集对所有模型训练集合进行二次训练,得到的模型
设置nfolds>2,训练过程中会自动将数据按照nfolds进行折叠作为验证集合,这种方式训练不需要单独对数据进行切分,并且支持集成模型训练
具体训练代码方式如下:
########### 1.传统训练方式 ############################
# 对数据集合进行8:2的比例进行切分
train, test = datasets.split_frame(ratios=[.8], seed=1234)
aml = H2OAutoML(
# 关闭内部折叠
nfolds=0,
# 关闭折叠验证
keep_cross_validation_predictions=False
)
# predictors为训练列名,target为预测列名,train为训练集合,test为测试集合
aml.train(x=predictors, y=target, training_frame=train, validation_frame=test)
########### 2. 使用内部折叠训练方式 ####################
# 无需切分数据
aml = H2OAutoML(
# 设置nfolds>2则会自动开启折叠训练
nfolds=5,
# 保留单独训练模型折叠参数,以便于进行二次集成模型训练,但是会耗费更多内存
keep_cross_validation_predictions=True
)
# 训练时传入完整数据集即可
aml.train(x=predictors, y=target, training_frame=datasets)
1.3 训练参数设置详解
以下为H2O的AutoML构造函数所有参数,在此选一些常用的参数进行详细说明:
def __init__(self,
nfolds=-1,
balance_classes=False,
class_sampling_factors=None,
max_after_balance_size=5.0,
max_runtime_secs=None,
max_runtime_secs_per_model=None,
max_models=None,
distribution="AUTO",
stopping_metric="AUTO",
stopping_tolerance=None,
stopping_rounds=3,
seed=None,
project_name=None,
exclude_algos=None,
include_algos=None,
exploitation_ratio=-1,
modeling_plan=None,
preprocessing=None,
monotone_constraints=None,
keep_cross_validation_predictions=False,
keep_cross_validation_models=False,
keep_cross_validation_fold_assignment=False,
sort_metric="AUTO",
custom_metric_func=None,
export_checkpoints_dir=None,
verbosity="warn",
**kwargs):
nfolds
默认为-1,即不进行折叠训练,如果设置大于2,则会开启内部折叠验证集构造,用于集成模型训练,如果不设置,则默认不会生成集成模型max_runtime_secs
设置整个模型最大训练时间,如果到达时间,则会自动停止训练,如果同时设置max_models
则可能导致无法输出集成模型max_runtime_secs_per_model
设置每个模型训练时间,即H2O会在一定超参数搜索空间下选取一个参数训练模型最大的时间max_models
设置最多训练的模型数量,设置最多训练的模型数量,如果达到数量则会停止训练stopping_metric
设置一个停止的指标参数,如果在容忍度范围外,则会提前停止训练stopping_tolerance
一个容忍度指标,如果在某个次数范围内,训练指标没有下降到达该值,则会提前停止stopping_rounds
即容忍轮数,如果在这个次数范围内未能下降达到容忍度指标,则会提前停止训练exclude_algos
排除训练时的某些算法include_algos
指定训练模型的算法sort_metric
指定leaderboard训练按照排序的指标export_checkpoints_dir
指定模型导出路径verbosity
模型训练的日志级别
1.4 模型预测
H2O的AutoML与H2O普通的模型训练一样,都是单个模型,进行加载后再进行预测,主要参考代码如下:
# 加载模型
model = h2o.load_model('model_path')
# 加载数据predict_x到h2o服务中
h2o_predict_x = h2o.H2OFrame(predict_x)
# 进行模型预测(数据列可以多于预测列,多余的会被忽略)
pred_h2o = model.predict(h2o_predict_x)
# 将预测列从h2o服务中取出转为python中的pandas格式
pred_pd = pred_h2o.as_data_frame(use_multi_thread=True)
注意:如果预测数据集足够大,请保证H2O服务的运行内存设置的比较大,否则可能出现内存不足不能预测
1.5 模型可解释性分析
H2O的AutoML对于模型可解释性分析可能存在某些bug,最好对单个模型进行分析,参考官网教程