如何在H2O Frame中按多列分组并按团队运行AutoML模型?
按团队分组运行H2O AutoML的解决方案
一、解决H2OFrame丢失索引的问题
H2OFrame不支持pandas的多层索引结构,直接转换带索引的DataFrame会导致索引丢失。解决方法是先将pandas的索引还原为普通列:
# 修正原代码变量名错误(将l改为data) df = pd.DataFrame(data, columns=['Dt','Co','Team','Val1','Val2','Type']) # 把多层索引转回普通列,避免转H2OFrame时丢失 df = df.set_index(['Dt','Co']).reset_index()
转换为H2OFrame后,Dt和Co会以普通列的形式保留:
import h2o h2o.init() hf_train = h2o.H2OFrame(df)
二、按Team分组运行AutoML
通过遍历每个唯一的Team值,筛选对应数据分别训练模型,完整代码示例如下:
import pandas as pd import h2o from h2o.automl import H2OAutoML # 原始数据 data=[ ['01/01/18','A','Team A',1.5,8.9,'Pop'], ['02/01/18','A','Team AA',1.5,8.9,'Pop'], ['03/01/18','A','Team AA',3.1,11,'Div'], ['04/01/18','A','Team AC',1.5,6,'Div'], ['01/01/18','A','Team A',1.5,8.9,'Pop'], ['02/01/18','A','Team BA',1.5,8.9,'Pop'], ['03/01/18','A','Team BA',3.1,11,'Div'], ['04/01/18','A','Team BC',1.5,6,'Div'], ['01/01/18','C','Team C',1.5,8.9,'Pop'], ['02/01/18','C','Team CA',1.5,8.9,'Pop'], ['03/01/18','C','Team CC',3.1,11,'Div'], ['04/01/18','C','Team CA',1.5,6,'Div'] ] # 处理DataFrame,还原索引为列 df = pd.DataFrame(data, columns=['Dt','Co','Team','Val1','Val2','Type']) df = df.set_index(['Dt','Co']).reset_index() # 初始化H2O环境 h2o.init() # 转换为H2OFrame hf_train = h2o.H2OFrame(df) # 定义特征列和目标列(假设目标变量为Type) y = 'Type' x = hf_train.columns x.remove(y) # 存储各团队的最优模型 team_models = {} # 获取所有唯一的团队名称 unique_teams = hf_train['Team'].unique().as_data_frame()['Team'].tolist() # 遍历每个团队训练模型 for team in unique_teams: print(f"正在为团队 {team} 训练模型...") # 筛选当前团队的训练数据 team_data = hf_train[hf_train['Team'] == team] # 启动AutoML训练 aml = H2OAutoML(max_runtime_secs=600, seed=42) aml.train(x=x, y=y, training_frame=team_data) # 保存当前团队的最优模型 team_models[team] = aml.leader print(f"团队 {team} 的最优模型训练完成\n") # 后续可通过team_models['Team名称']调用对应模型
关键说明
- 索引处理:H2OFrame不识别pandas索引,必须通过
reset_index()将索引转为普通列才能保留字段。 - 分组筛选:利用H2OFrame的布尔索引
hf_train['Team'] == team快速筛选单团队数据。 - 模型存储:用字典
team_models统一存储各团队的最优模型,方便后续调用、评估或部署。
内容的提问来源于stack exchange,提问作者apprunner2186
相关产品推荐
相关产品推荐

