2026/4/17 18:29:36
网站建设
项目流程
上海网站定制设计图,高端品质网站建设,比较容易做流量的网站,开公司要多少注册资金DoubleML 结合 FLAML——如何在DoubleML中自动调优学习器
自动化机器学习#xff08;AutoML#xff09;的最新进展让机器学习估计器的超参数自动调优变得更简单。这些经过优化的学习器可用于 DoubleML 框架内的估计环节。在本笔记本中#xff0c;我们将探索如何借助 AutoML…DoubleML 结合 FLAML——如何在DoubleML中自动调优学习器自动化机器学习AutoML的最新进展让机器学习估计器的超参数自动调优变得更简单。这些经过优化的学习器可用于 DoubleML 框架内的估计环节。在本笔记本中我们将探索如何借助 AutoML 为 DoubleML 框架调优学习器。本笔记本将使用FLAML但也有许多其他 AutoML 框架可供选择。对 DoubleML 而言尤其实用的是那些能以sklearn风格导出模型的工具包例如TPOT、autosklearn、H20 或 Gama。数据生成我们使用make_plr_CCDDHNR2018()函数生成合成数据包含 1000 个观测值、50 个协变量、1 个处理变量和 1 个结果变量。我们对数据生成过程进行校准以凸显超参数调优的重要性。importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltfromdoubleml.plm.datasetsimportmake_plr_CCDDHNR2018importdoublemlasdmlfromflamlimportAutoMLfromxgboostimportXGBRegressor# 生成合成数据datamake_plr_CCDDHNR2018(alpha0.5,n_obs1000,dim_x50,return_typeDataFrame,a00,a11,s10.25,s20.25)data.head()在全样本上调优在本节中我们将手动使用 FLAML 为部分线性回归模型PLR调优两个XGBoost模型。在 PLR 模型使用默认评分函数中我们需要估计干扰项 η其构成如下η : m 0 ( x ) , ℓ 0 ( x ) E [ D ∣ X ] , E [ Y ∣ X ] η:{m₀(x), ℓ₀(x)} {E[D|X], E[Y|X]}η:m0(x),ℓ0(x)E[D∣X],E[Y∣X]我们初始化两个FLAMLAutoML 对象并完成拟合。调优完成后将这些学习器传入DoubleML。步骤 1初始化并训练 AutoML 模型注该代码块将总共耗时 8 分钟优化干扰项模型。# 初始化用于结果模型ml_l的AutoML基于X预测Yautoml_lAutoML()settings_l{time_budget:240,metric:rmse,estimator_list:[xgboost],task:regression,}automl_l.fit(X_traindata.drop(columns[y,d]).values,y_traindata[y].values,verbose2,**settings_l)# 初始化用于处理模型ml_m的AutoML基于X预测Dautoml_mAutoML()settings_m{time_budget:240,metric:rmse,estimator_list:[xgboost],task:regression,}automl_m.fit(X_traindata.drop(columns[y,d]).values,y_traindata[d].values,verbose2,**settings_m)步骤 2评估调优后的模型FLAML会将训练过程中的最优损失值存储为best_loss属性。更多细节可参考FLAML 官方文档。rmse_oos_ml_mautoml_m.best_loss rmse_oos_ml_lautoml_l.best_lossprint(调优过程中的最优RMSEml_m,rmse_oos_ml_m)print(调优过程中的最优RMSEml_l,rmse_oos_ml_l)调优过程中的最优RMSEml_m1.002037900301454 调优过程中的最优RMSEml_l1.0929369228758206步骤 3创建并拟合 DoubleML 模型我们基于数据集创建DoubleMLData对象指定 y 为结果变量、d 为处理变量。随后使用调优后的FLAML估计器初始化DoubleMLPLR模型分别用于处理项和结果项。DoubleML会在每个折fold上创建配置相同的模型副本。obj_dml_datadml.DoubleMLData(data,y,d)obj_dml_plr_fullsampledml.DoubleMLPLR(obj_dml_data,ml_mautoml_m.model.estimator,ml_lautoml_l.model.estimator)print(obj_dml_plr_fullsample.fit().summary)coef系数 std err标准误 t值 P|t|P值 2.5 %95%CI下限 97.5 %95%CI上限 d 0.490689 0.031323 15.665602 2.599586e-55 0.429298 0.552081DoubleML内置的学习器评估功能会报告交叉拟合过程中的样本外误差。我们可将该指标与上文调优过程中的最优损失值对比。rmse_dml_ml_l_fullsampleobj_dml_plr_fullsample.evaluate_learners()[ml_l][0][0]rmse_dml_ml_m_fullsampleobj_dml_plr_fullsample.evaluate_learners()[ml_m][0][0]print(DoubleML评估的RMSEml_m,rmse_dml_ml_m_fullsample)print(DoubleML评估的RMSEml_l,rmse_dml_ml_l_fullsample)DoubleML评估的RMSEml_m1.0124105481660435 DoubleML评估的RMSEml_l1.103179163001313自动化调优过程中的最优 RMSE 与干扰项预测的样本外误差数值相近这表明模型未发生过拟合。我们本就不预期出现严重过拟合——因为 FLAML 内部使用交叉验证且报告的是验证集上的最优损失值。在折上调优除了在外部调优FLAML学习器我们也可在 DoubleML 内部完成 AutoML 学习器的调优。为此需要定义自定义类以将FLAML集成到DoubleML中。调用DoubleML的fit()方法时调优过程会自动启动。由于训练过程会在 K 个折上各执行一次因此每个折都会得到一组个性化的最优超参数。步骤 1DoubleML 中 FLAML 模型的自定义接口以下接口旨在为回归和分类任务提供自动化机器学习模型调优能力。但在本示例中由于处理变量是连续型的我们仅需回归器接口。fromsklearn.utils.multiclassimportunique_labelsclassFlamlRegressorDoubleML:_estimator_typeregressordef__init__(self,time,estimator_list,metric,*args,**kwargs):self.auto_mlAutoML(*args,**kwargs)self.timetime self.estimator_listestimator_list self.metricmetricdefset_params(self,**params):self.auto_ml.set_params(**params)returnselfdefget_params(self,deepTrue):dictself.auto_ml.get_params(deep)dict[time]self.timedict[estimator_list]self.estimator_listdict[metric]self.metricreturndictdeffit(self,X,y):self.auto_ml.fit(X,y,taskregression,time_budgetself.time,estimator_listself.estimator_list,metricself.metric,verboseFalse)self.tuned_modelself.auto_ml.model.estimatorreturnselfdefpredict(self,x):predsself.tuned_model.predict(x)returnpredsclassFlamlClassifierDoubleML:_estimator_typeclassifierdef__init__(self,time,estimator_list,metric,*args,**kwargs):self.auto_mlAutoML(*args,**kwargs)self.timetime self.estimator_listestimator_list self.metricmetricdefset_params(self,**params):self.auto_ml.set_params(**params)returnselfdefget_params(self,deepTrue):dictself.auto_ml.get_params(deep)dict[time]self.timedict[estimator_list]self.estimator_listdict[metric]self.metricreturndictdeffit(self,X,y):self.classes_unique_labels(y)self.auto_ml.fit(X,y,taskclassification,time_budgetself.time,estimator_listself.estimator_list,metricself.metric,verboseFalse)self.tuned_modelself.auto_ml.model.estimatorreturnselfdefpredict_proba(self,x):predsself.tuned_model.predict_proba(x)returnpreds步骤 2调用 DoubleML 的.fit()方法时使用该接口我们初始化一个FlamlRegressorDoubleML对象无需提前拟合即可传入 DoubleML 对象。调用 DoubleML 对象的.fit()方法时接口对象的副本会在每个折上创建且每个折都会生成一组独立的最优超参数。由于我们需要在 K 个折上各拟合一次因此相应减少单次调优的计算时间以与全样本调优的总耗时保持一致。# 定义FlamlRegressorDoubleML对象ml_lFlamlRegressorDoubleML(time24,estimator_list[xgboost],metricrmse)ml_mFlamlRegressorDoubleML(time24,estimator_list[xgboost],metricrmse)# 使用新的回归器创建DoubleMLPLR对象dml_plr_obj_onfoldsdml.DoubleMLPLR(obj_dml_data,ml_m,ml_l)# 拟合DoubleMLPLR模型print(dml_plr_obj_onfolds.fit(store_modelsTrue).summary)coef std err t P|t| 2.5 % 97.5 % d 0.488455 0.031491 15.510971 2.924232e-54 0.426734 0.550176rmse_oos_onfolds_ml_lnp.mean([dml_plr_obj_onfolds.models[ml_l][d][0][i].auto_ml.best_lossforiinrange(5)])rmse_oos_onfolds_ml_mnp.mean([dml_plr_obj_onfolds.models[ml_m][d][0][i].auto_ml.best_lossforiinrange(5)])print(调优过程中的最优RMSEml_m,rmse_oos_onfolds_ml_m)print(调优过程中的最优RMSEml_l,rmse_oos_onfolds_ml_l)rmse_dml_ml_l_onfoldsdml_plr_obj_onfolds.evaluate_learners()[ml_l][0][0]rmse_dml_ml_m_onfoldsdml_plr_obj_onfolds.evaluate_learners()[ml_m][0][0]print(DoubleML评估的RMSEml_m,rmse_dml_ml_m_onfolds)print(DoubleML评估的RMSEml_l,rmse_dml_ml_l_onfolds)调优过程中的最优RMSEml_m1.0060715124549546 调优过程中的最优RMSEml_l1.1030891095588866 DoubleML评估的RMSEml_m1.0187512020118494 DoubleML评估的RMSEml_l1.1016338581630878与上文案例类似我们未发现过拟合的迹象。与短时间 AutoML 调优、未调优 XGBoost 学习器的对比短时间 AutoML 调优作为基准对比我们将上文调优时间为 2 分钟的学习器与仅使用 10 秒调优时间的学习器进行对比。注这些调优时长仅为示例。在本实验设置下我们发现 10 秒的调优时间是不足的而 120 秒则足够。通常所需调优时间取决于数据复杂度、数据集规模、所用设备的计算能力等因素。如需正确使用FLAML请参考其官方文档和相关论文。# 初始化用于结果模型的AutoML与上文类似但缩短时间预算automl_l_lesstimeAutoML()settings_l{time_budget:10,metric:rmse,estimator_list:[xgboost],task:regression,}automl_l_lesstime.fit(X_traindata.drop(columns[y,d]).values,y_traindata[y].values,verbose2,**settings_l)# 初始化用于处理模型的AutoML与上文类似但缩短时间预算automl_m_lesstimeAutoML()settings_m{time_budget:10,metric:rmse,estimator_list:[xgboost],task:regression,}automl_m_lesstime.fit(X_traindata.drop(columns[y,d]).values,y_traindata[d].values,verbose2,**settings_m)obj_dml_plr_lesstimedml.DoubleMLPLR(obj_dml_data,ml_mautoml_m_lesstime.model.estimator,ml_lautoml_l_lesstime.model.estimator)print(obj_dml_plr_lesstime.fit().summary)coef std err t P|t| 2.5 % 97.5 % d 0.461493 0.031075 14.851012 6.852592e-50 0.400587 0.522398我们可再次检查模型性能rmse_dml_ml_l_lesstimeobj_dml_plr_lesstime.evaluate_learners()[ml_l][0][0]rmse_dml_ml_m_lesstimeobj_dml_plr_lesstime.evaluate_learners()[ml_m][0][0]print(调优过程中的最优RMSEml_m,automl_m_lesstime.best_loss)print(调优过程中的最优RMSEml_l,automl_l_lesstime.best_loss)print(DoubleML评估的RMSEml_m,rmse_dml_ml_m_lesstime)print(DoubleML评估的RMSEml_l,rmse_dml_ml_l_lesstime)调优过程中的最优RMSEml_m0.9386744462704798 调优过程中的最优RMSEml_l1.0520233166790431 DoubleML评估的RMSEml_m1.0603268864456956 DoubleML评估的RMSEml_l1.111352344760325我们发现AutoML 调优的最优 RMSE 与 DoubleML 评估的样本外 RMSE 之间差异更大这可能表明学习器发生了欠拟合即调优时间不足。未调优默认参数的 XGBoost作为另一组基准我们构建使用默认超参数即未调优XGBoost 学习器的 DoubleML 模型xgb_untuned_m,xgb_untuned_lXGBRegressor(),XGBRegressor()# 使用未调优XGBoost创建DoubleMLPLR对象dml_plr_obj_untuneddml.DoubleMLPLR(obj_dml_data,xgb_untuned_l,xgb_untuned_m)print(dml_plr_obj_untuned.fit().summary)rmse_dml_ml_l_untuneddml_plr_obj_untuned.evaluate_learners()[ml_l][0][0]rmse_dml_ml_m_untuneddml_plr_obj_untuned.evaluate_learners()[ml_m][0][0]coef std err t P|t| 2.5 % 97.5 % d 0.429133 0.031692 13.540578 9.007789e-42 0.367017 0.491249对比与总结我们汇总不同模型的结果全样本调优 AutoML、折上调优 AutoML、未调优 XGBoost、短时间调优 AutoML。summarypd.concat([obj_dml_plr_fullsample.summary,dml_plr_obj_onfolds.summary,dml_plr_obj_untuned.summary,obj_dml_plr_lesstime.summary],keys[全样本调优,折上调优,默认参数,短时间调优])summary.index.names[模型类型,指标]summary绘制系数与 95%置信区间本节生成可视化图表对比不同模型类型的系数及 95%置信区间。# 提取模型标签和系数值model_labelssummary.index.get_level_values(模型类型)coef_valuessummary[coef].values# 计算误差置信区间上下限与系数的差值errorsnp.full((2,len(coef_values)),np.nan)errors[0,:]summary[coef]-summary[2.5 %]errors[1,:]summary[97.5 %]-summary[coef]# 绘制系数与95%置信区间plt.figure(figsize(10,6))plt.errorbar(model_labels,coef_values,fmto,yerrerrors,capsize5)plt.axhline(0.5,colorred,linestyle--)# 绘制参考线真实系数值plt.xlabel(模型)plt.ylabel(系数与95%置信区间)plt.title(不同模型的系数及95%置信区间对比)plt.xticks(rotation45)plt.tight_layout()plt.show()对比干扰项估计的指标本节对比不同模型的干扰项估计指标并绘制柱状图可视化性能差异。fig,axsplt.subplots(1,2,figsize(10,4))axsaxs.flatten()axs[0].bar(x[全样本调优,折上调优,默认参数,短时间调优],height[rmse_dml_ml_m_fullsample,rmse_dml_ml_m_onfolds,rmse_dml_ml_m_untuned,rmse_dml_ml_m_lesstime])axs[1].bar(x[全样本调优,折上调优,默认参数,短时间调优],height[rmse_dml_ml_l_fullsample,rmse_dml_ml_l_onfolds,rmse_dml_ml_l_untuned,rmse_dml_ml_l_lesstime])axs[0].set_xlabel(调优方式)axs[0].set_ylim((1,1.12))axs[0].set_ylabel(RMSE)axs[0].set_title(不同调优方式下的样本外RMSEml_m)axs[1].set_xlabel(调优方式)axs[1].set_ylim((1.1,1.22))axs[1].set_ylabel(RMSE)axs[1].set_title(不同调优方式下的样本外RMSEml_l)fig.suptitle(不同调优方式下干扰项估计的样本外RMSE)fig.tight_layout()结论本笔记本表明超参数调优在 DoubleML 框架中至关重要且可通过 FLAML AutoML 轻松实现。在我们最新的研究中我们进一步验证了 AutoML 调优的有效性——尤其是在所有验证场景中全样本调优的表现与折上调优相近因此可通过外部调优节省调优时间和复杂度。此外可参考我们为 DoubleML 打造的全自动 AutoML 调优接口AutoDoubleML该工具可从 Github 下载并在 Python 中使用。参考文献Bach, P., Schacht, O., Chernozhukov, V., Klaassen, S., Spindler, M. (2024, March). Hyperparameter Tuning for Causal Inference with Double Machine Learning: A Simulation Study. In Causal Learning and Reasoning (pp. 1065-1117). PMLR.