/ Technical / 5浏览

基于H2O的AutoML机器学习详细说明

H2O AutoML是一个自动机器学习库,用于自动化机器学习工作流程,包括在用户指定的时间限制内自动训练和调整多个模型。它可以帮助用户快速构建高性能的预测模型,适用于各种应用场景,例如金融、医疗、电商等领域的预测分析。

官方地址:

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

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 模型可解释性分析

达达下雨不吃鱼
Python全能依赖环境管理工具uv
Glusterfs——开源分布式存储
FRP——网络代理服务
声音大模型之音色克隆
深度学习机大模型领域相关术语及解释
Mysql慢查询优化