Python3中从XGBoost 0.6a2模型提取决策规则的方法
提取XGBoost 0.6a2模型的决策分割点(用于变量分箱)
嘿,刚好我之前在Python 3.5.2 + XGBoost 0.6a2这套环境下折腾过同样的需求——从训练好的模型里抠出决策分割点用来做变量分箱,当时也愁plot_tree只能看可视化拿不到实际数据,后来参考了类似思路搞出了可行的实现,分享给你:
步骤1:导出模型的文本结构
首先得把训练好的模型(假设你的模型变量是xgb_model)导出成纯文本格式,这个版本的XGBoost可以通过get_booster()拿到底层模型对象,再用dump_model()输出树的决策规则:
import xgboost as xgb # 假设你已经完成模型训练,xgb_model是训练好的XGBClassifier/XGBRegressor model_dump = xgb_model.get_booster().dump_model(dump_format='text', with_stats=False)
这里dump_format='text'会输出每棵树的清晰文本结构,with_stats=False关闭额外统计信息,让后续解析更简单。
步骤2:编写解析函数提取分割点
接下来写一个函数,专门从导出的文本里扒出每个特征的所有分割点,还会自动去重和排序:
def extract_split_points(model_dump, feature_names=None): split_points = {} # 遍历每一棵树的文本 for tree_text in model_dump: # 按行拆分每棵树的内容 tree_lines = tree_text.split('\n') for line in tree_lines: line = line.strip() if not line: continue # 匹配分割节点的行(格式类似:0:[f2<10.5] yes=1,no=2,missing=1) if '[' in line and '<' in line and ']' in line: # 提取特征和分割值部分 rule_part = line.split('[')[1].split(']')[0] feature_id, split_val = rule_part.split('<') # 如果有自定义特征名,替换默认的f0/f1...格式 if feature_names: feat_idx = int(feature_id[1:]) feature_name = feature_names[feat_idx] else: feature_name = feature_id # 转换分割值为浮点数 split_val = float(split_val) # 收集分割点,用集合自动去重 if feature_name not in split_points: split_points[feature_name] = set() split_points[feature_name].add(split_val) # 把每个特征的分割点转成排序后的列表,方便分箱 for feat in split_points: split_points[feat] = sorted(split_points[feat]) return split_points
步骤3:调用函数获取结果
如果你的训练数据有自定义特征名(比如['age', 'income', 'credit_score']),就把它传给函数替换默认的索引名;没有的话直接调用即可:
# 示例:假设你的特征名称列表 feature_names = ['age', 'income', 'credit_score'] # 提取分割点 split_points_dict = extract_split_points(model_dump, feature_names) # 打印每个特征的分割点 for feature, points in split_points_dict.items(): print(f"特征{feature}的分割点:{points}")
实用说明
- 这个方法完全适配XGBoost 0.6a2版本,亲测有效——毕竟0.6a2已经支持
get_booster()方法,dump出来的文本格式也稳定 - 提取的分割点自动去重并按从小到大排序,拿到手就能直接用来做变量分箱:比如age的分割点是
[25.0, 35.0, 50.0],那就能把年龄分成<=25、25<age<=35、35<age<=50、>50这几个区间 - 如果你的模型用了缺失值处理,解析逻辑也能正常提取分割点,因为我们只关注
[fX<数值]这个核心规则部分
内容的提问来源于stack exchange,提问作者Artiga
相关产品推荐
相关产品推荐

