如何在使用shap-hypetune的BoostRFE时查看RFE每步选中的特征?
BoostRFE特征迭代过程打印与指标监测实现
完整可运行代码
你可以直接基于已有的代码扩展为如下版本,即可实现每轮特征变动、ROC-AUC指标的打印:
import xgboost as xgb from shap_hypetune import BoostRFE # 请替换为你17个特征对应的实际物理量名称,顺序必须和训练特征矩阵的列顺序完全一致 feature_names = ["物理量1", "物理量2", "物理量3", ..., "物理量17"] # 请替换为你自己的训练集、验证集切分结果 X_train, X_val, y_train, y_val = 你的数据集切分逻辑 # 初始化基础XGBoost模型 XGB = xgb.sklearn.XGBClassifier( random_state=42, eval_metric="auc" ) # 配置BoostRFE参数,开启评分记录 model = BoostRFE( estimator=XGB, min_features_to_select=8, importance_type='shap_importances', eval_set=[(X_val, y_val)], scoring='roc_auc', verbose=0 # 不需要内置日志可设为0 ) # 模型训练 model.fit(X_train, y_train) # 打印每轮迭代信息 print("========== 迭代过程统计 ==========") support_history = model.support_history_ score_history = model.scores_ for round_idx in range(len(support_history)): # 本轮保留的特征 current_keep = [feature_names[i] for i in support_history[round_idx]] # 本轮移除的特征 if round_idx == 0: current_remove = ["初始轮无移除特征"] else: prev_keep_idx = set(support_history[round_idx-1]) current_keep_idx = set(support_history[round_idx]) current_remove = [feature_names[i] for i in prev_keep_idx - current_keep_idx] # 打印信息 print(f"\n第{round_idx+1}轮:") print(f"* 当前ROC-AUC:{score_history[round_idx]:.4f}") print(f"* 移除特征:{'、'.join(current_remove)}") print(f"* 保留特征:{'、'.join(current_keep)}") # 打印最终筛选结果 print("\n========== 最终保留的8个特征 ==========") final_keep = [feature_names[i] for i in model.support_] for idx, feat in enumerate(final_keep, 1): print(f"{idx}. {feat}")
注意事项
- 若需要同时监测多个指标,可将
scoring参数改为列表格式,例如scoring=['roc_auc', 'f1', 'accuracy'],score_history会对应返回多组指标的每轮数值 feature_names列表的顺序必须和训练用特征矩阵的列顺序完全匹配,否则会出现特征名和物理量对应错误的问题- 如果你需要将迭代过程导出为表格用于论文写作,可以把每轮的移除特征、保留特征、得分存入pandas的DataFrame后直接导出为csv或tex格式
内容的提问来源于stack exchange,提问作者Andrea Pareti
相关产品推荐
相关产品推荐

