通用转换嵌套字典格式DataFrame至指定结构化表格
XGBoost训练结果DataFrame通用转换方案
需求说明
需要将XGBoost模型训练输出的嵌套结构DataFrame,转换为满足以下要求的扁平化表格:
- 训练轮次(epochs)顺序全局统一,支持扩展至1000/10000级规模
- 数据集名称(如train/test)、指标名称(如auc/logloss)可任意变更,无需修改转换逻辑
- 自动适配多数据集、多指标的动态行列数量
- 输出列名格式固定为
datasetname_metricname
输入示例
手动构造的测试DataFrame:
import pandas as pd df = pd.DataFrame({ 'train': {'auc': [0.432, 0.543, 0.523], 'logloss': [0.123, 0.234, 0.345]}, 'test': {'auc': [0.456, 0.567, 0.678], 'logloss': [0.321, 0.432, 0.543]} })
实际业务中来自XGBoost训练的场景:
df = pd.DataFrame(model_xgb.evals_result()) df.columns = ['train', 'test'] # 数据集名、指标均可按需修改
通用转换实现
import pandas as pd def transform_xgb_eval_results(df): # 展开嵌套结构,将数据集和指标维度转为列 transformed_df = df.unstack().unstack(0).reset_index(drop=True) # 动态生成符合要求的列名 transformed_df.columns = [f"{col[0]}_{col[1]}" for col in transformed_df.columns] # 添加epochs列(从0开始对应训练轮次) transformed_df.insert(0, 'epochs', range(len(transformed_df))) return transformed_df
代码特性
- 完全动态适配:无需硬编码任何数据集或指标名称,自动识别输入结构
- 高性能扩展:基于Pandas原生操作,处理万级epochs数据无性能瓶颈
- 格式严格合规:自动生成
datasetname_metricname格式的列名,epochs列统一前置
输出示例
调用transform_xgb_eval_results(df)后得到的结果结构:
| epochs | train_auc | train_logloss | test_auc | test_logloss |
|---|---|---|---|---|
| 0 | 0.432 | 0.123 | 0.456 | 0.321 |
| 1 | 0.543 | 0.234 | 0.567 | 0.432 |
| 2 | 0.523 | 0.345 | 0.678 | 0.543 |
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

