H2O是一个分布式内存机器学习平台,具有线性可扩展性,支持最广泛使用的统计和机器学习算法,包括梯度提升机、广义线性模型、深度学习等。H2O中的AutoML功能可以自动化构建大量模型的过程,目标是在数据科学家无需任何先验知识或努力的情况下找到“最佳”模型。
当前版本的H2O AutoML默认训练和交叉验证随机森林、极端随机森林、梯度提升机(GBMs)的随机网格、深度神经网络的随机网格、固定网格的广义线性模型(GLMs),并在最后训练两个堆叠集成模型。一个集成包含所有模型(针对模型性能优化),第二个集成只包含每个算法类别/家族中表现最佳的模型(针对生产使用优化)。
自动化机器学习(AutoML)是自动化将机器学习应用于现实世界问题的端到端过程。在典型的机器学习应用中,工作阶段(和子阶段)通常包括数据准备、数据预处理、特征工程、特征提取、特征选择、模型选择、超参数优化(以最大化最终模型的性能)。这些步骤往往超出了非专家的能力。H2O AutoML被提出作为基于人工智能的解决方案,以应对应用机器学习日益增长的挑战。
要开始使用H2O,首先需要导入h2o Python模块和H2OAutoML类,并初始化本地H2O集群。H2O库可以通过运行pip安装。接下来,在jupyter笔记本中导入库。这里,导入了pandas库用于数据预处理工作。
pip install h2o
import pandas as pd
import h2o
from h2o.automl import H2OAutoML
使用指定参数(nthreads和max_mem_size)初始化H2O是可选的。
h2o.init(nthreads=-1, # 启动新H2O服务器时的线程数
max_mem_size=12 # 以千兆字节为单位
)
每年10月10日庆祝世界精神卫生日。这一天的目标是提高对全球精神卫生问题的认识,并动员支持精神卫生的努力。根据一项匿名调查,大约有4.5亿人患有精神障碍,这可能是全球健康不佳和残疾的主要原因之一。任务是理解和观察公司所有员工的精神健康状况。因此,需要根据提供的特征预测员工的倦怠率,从而帮助公司为员工采取适当的措施。
将训练/测试集导入H2O。这里,导入了员工数据,用于预测员工在远程工作场景中倦怠的概率。
train = h2o.import_file("C:/Burnout_Rate_Prediction/dataset/train.csv")
test = h2o.import_file("C:/Burnout_Rate_Prediction/dataset/test.csv")
将H2O框架转换为Pandas数据框架。这样做是为了使数据操作更容易进行。同时,删除包含缺失值的行。
train_as_df = h2o.as_list(train, use_pandas=True)
train_as_df = train_as_df[train_as_df['Burn Rate'].notna()]
train_as_df = train_as_df[train_as_df['Mental Fatigue Score'].notna()]
train_as_df = train_as_df[train_as_df['Resource Allocation'].notna()]
train_as_df.head(2)
检查是否有任何缺失值。在这种情况下,没有缺失值需要处理。
round((train_as_df.isnull().sum() * 100 / len(train_as_df)), 2).sort_values(ascending=False)
将Pandas数据框架转换回H2O框架以继续进一步处理。
train = h2o.H2OFrame(train_as_df)
首先,确定预测变量和响应变量。由于正在预测员工的“倦怠率”,因此它将是响应变量。数据框架中的其余变量将形成预测变量。
x = train.columns
y = "Burn Rate"
x.remove(y)
运行AutoML以构建10个基础模型(默认最大运行时间限制为1小时)。'max_models'参数指定个体(或“基础”)模型的数量,不包括可以单独训练的任何集成模型。
aml = H2OAutoML(max_models=10, seed=1)
aml.train(x=x, y=y, training_frame=train)
接下来,将查看AutoML排行榜。由于没有在H2OAutoML.train()方法中指定leaderboard_frame用于评分和排名模型,AutoML排行榜使用交叉验证指标对模型进行排名。对于每种机器学习任务(二元分类、多类分类、回归),内部指定了默认性能指标,排行榜将按该指标排序。在二元分类的情况下,默认排名指标是ROC曲线下面积(AUC)。将来,用户将能够指定任何H2O指标,以便使用不同的指标在排行榜上生成排名。领先模型存储在aml.leader中,排行榜存储在aml.leaderboard中。
lb = aml.leaderboard
lb.head(rows=lb.nrows)
要生成测试集的预测,可以直接在“H2OAutoML”对象或领先模型对象上进行预测。
preds = aml.predict(test)
or
preds = aml.leader.predict(test)
将预测与测试数据集结合。然后,可以查看每个EmployeeId的倦怠率预测。
df = test.cbind(preds)
df.head(2)
通过名称向量切片列,以在最终数据框架中仅保留相关列。
res = df[:, ["Employee ID", "predict"]]
res.head(2)
将‘predict’列重命名为‘Burn Rate’。
res.set_names(['Employee ID', 'Burn Rate'])
将结果保存为.CSV文件。
h2o.export_file(res, path="C:/Burnout_Rate_Prediction/dataset/submission.csv", force=True)
有两种方式可以保存领先模型——二进制格式和MOJO格式。如果将领先模型投入生产使用,建议使用MOJO格式,因为它针对生产使用进行了优化。
h2o.save_model(aml.leader, path="C:/Burnout_Rate_Prediction/h20_model")
aml.leader.download_mojo(path="C:/Burnout_Rate_Prediction")
要了解集成如何工作,让深入了解一下“所有模型”堆叠集成模型。“所有模型”集成是AutoML运行中所有个体模型的集成。这通常是排行榜上表现最佳的模型。
# 获取AutoML排行榜中所有模型的模型ID
model_ids = list(aml.leaderboard['model_id'].as_data_frame().iloc[:,0])
# 获取“所有模型”堆叠集成模型
se = h2o.get_model([mid for mid in model_ids if "StackedEnsemble_AllModels" in mid][0])
# 获取堆叠集成的元学习器模型
metalearner = h2o.get_model(se.metalearner()['name'])
metalearner.coef_norm()